duilib CDateTimeUI 在Xp下的bug修复

简介: 转自:http://my.oschina.net/u/343244/blog/370131 CDateTimeUI 的bug修复。

转自:http://my.oschina.net/u/343244/blog/370131


CDateTimeUI 的bug修复。修改CDateTimeWnd的HandleMessage方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
if (WM_NOTIFY==uMsg)
{
     ::SetFocus(m_hWnd);
}
if ( uMsg == WM_KILLFOCUS  /**/ )
{
       ::OutputDebugString( "WM_KILLFOCUS\n" );
       if ( uMsg == WM_KILLFOCUS  /**/ )
        {
             //这里肯可能需要优化,因为FindWindow找出来的窗口不一定是本进程的窗口
             HWND  hh=::FindWindow(_T( "SysMonthCal32" ),NULL);
             if (::IsWindow(hh))
             {
                  MCHITTESTINFO pp;
                  memset (&pp,0, sizeof (pp));
                  //pp.uHit=MCHT_CALENDAR;
                  GetCursorPos(&pp.pt);
                  ::ScreenToClient(hh,&pp.pt);
                  pp.cbSize= sizeof (pp);
                  MonthCal_HitTest(hh,&pp);
                  //下一个月
                  if (pp.uHit==MCHT_TITLEBTNNEXT)
                  {
                      return  1;
                  }
                  //上一个月
                  if (pp.uHit==MCHT_TITLEBTNPREV)
                  {
                      return  1;
                  }
             } else {
                 POINT pt;
                 ::GetCursorPos(&pt); 
                 RECT rt;
                 ::GetWindowRect(m_hWnd,&rt);
                 if (
                     !(pt.x>=rt.left&&pt.x<=rt.right)||
                     !(pt.x>=rt.top&&pt.x<=rt.bottom)
                  )
                 {
                     ::OutputDebugString( "CLose\n" );
                     lRes= OnKillFocus(uMsg,wParam, lParam,bHandled);
                 }
              }
        }
}

完整代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
LRESULT  CDateTimeWnd::HandleMessage( UINT  uMsg,  WPARAM  wParam,  LPARAM  lParam)
     {
         LRESULT  lRes = 0;
         BOOL  bHandled = TRUE;
         /**xpBug***/
         DWORD  ProcessId;
         if (WM_SETFOCUS==uMsg)
         {
             ::OutputDebugString( "WM_SETFOCUS\n" );
         }
         if (WM_NOTIFY==uMsg)
         {
             ::SetFocus(m_hWnd);
         }
         if ( uMsg == WM_KILLFOCUS  /**/ )
         {
             ::OutputDebugString( "WM_KILLFOCUS\n" );
             if ( uMsg == WM_KILLFOCUS  /**/ )
             {
                 //这里肯可能需要优化,因为FindWindow找出来的窗口不一定是本进程的窗口
                 HWND  hh=::FindWindow(_T( "SysMonthCal32" ),NULL);
                 //Isdel=true;
                 if (::IsWindow(hh))
                 {
                     MCHITTESTINFO pp;
                     memset (&pp,0, sizeof (pp));
                     GetCursorPos(&pp.pt);
                     ::ScreenToClient(hh,&pp.pt);
                     pp.cbSize= sizeof (pp);
                     MonthCal_HitTest(hh,&pp);
                     //下一个月
                     if (pp.uHit==MCHT_TITLEBTNNEXT)
                     {
                         return  1;
                     }
                     //上一个月
                     if (pp.uHit==MCHT_TITLEBTNPREV)
                     {
                         return  1;
                     }
                 } else
                 {
                     POINT pt;
                     ::GetCursorPos(&pt); 
                     RECT rt;
                     ::GetWindowRect(m_hWnd,&rt);
                     if (
                         !(pt.x>=rt.left&&pt.x<=rt.right)||
                         !(pt.x>=rt.top&&pt.x<=rt.bottom)
                         )
                     {
                         ::OutputDebugString( "CLose\n" );
                         lRes= OnKillFocus(uMsg,wParam, lParam,bHandled);
                     }
                             
                 }
              }
         }
         else /**/  if  (uMsg == WM_KEYUP && (wParam == VK_DELETE || wParam == VK_BACK))
         {
             LRESULT  lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
             m_pOwner->m_nDTUpdateFlag = DT_DELETE;
             m_pOwner->UpdateText();
             PostMessage(WM_CLOSE);
             return  lRes;
         }
         else  if  (uMsg == WM_KEYUP && wParam == VK_ESCAPE)
         {
             LRESULT  lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
             m_pOwner->m_nDTUpdateFlag = DT_KEEP;
             PostMessage(WM_CLOSE);
             return  lRes;
         }
         else 
             bHandled = FALSE;
 
         if (!bHandled ) 
         {
             return  CWindowWnd::HandleMessage(uMsg, wParam, lParam);
         }
         return  lRes;
     }

目录
相关文章
|
JavaScript 前端开发 C++
|
安全 Windows
Win系统 - Win10不强制更新了,但这2个新功能你必须试试!
Win系统 - Win10不强制更新了,但这2个新功能你必须试试!
153 0
Win系统 - Win10不强制更新了,但这2个新功能你必须试试!
|
IDE 数据库 开发工具
Delphi历史版本介绍(二)从Delphi8到DelphiXE3
Delphi历史版本介绍(二)从Delphi8到DelphiXE3 Delphi 8       Delphi8是一个短命的版本,有点像微软的vista的感觉,没有很好的超越7,后来用被2005取代,很多人都是直接从7到D2005的,Delphi8就这样被消损在历史的烟尘中。
2378 0
[UWP开发] 在低版本中使用亚克力刷以及部分高版本控件
原文:[UWP开发] 在低版本中使用亚克力刷以及部分高版本控件 写于2018.10.3 仅在我的PC(17763)和WP(Limia 950 XL 15254)上测试过 微软在build 16299中引入了亚克力刷,但是Win10m并没有活那么久,lumia手机在此之前就已全部停止更新 这里介...
1154 0