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;
     }

目录
相关文章
|
11月前
|
数据可视化 JavaScript Unix
Visual Studio 2022 版本 17.6 预览版发行版小范围更新,值得你一看
Visual Studio 2022 版本 17.6 预览版发行版小范围更新,值得你一看
|
Windows
GuitarPro8.0最新版本打谱编曲软件
许多打谱编曲软件中都有吉他乐器的插件,插入音轨即可使用,除此以外,还有一款专门针对吉他的音乐软件,就是Guitar Pro。Guitar Pro是吉他类音乐软件中比较有代表性的,从开发至今不断更新优化,目前的软件版本已经更新到了Guitar Pro 8。首先是它的地位,从发行至今,Guitar Pro一直是吉他类音乐软件的佼佼者,在这个领域内占据着至关重要的地位,一直是业内业外许多用户的首要选择。另外就是它的功能,这款软件可以打开GTP格式乐谱并对其进行编辑,也支持导出多种文件格式,这为用户之间的传播和交流提供了必要且有效的条件。
167 0
|
缓存 安全 芯片
CleanMyMac X2023版本有哪些新功能?
先回答另外一个问题:为什么要对 Mac 电脑进行清理?当然是空间不够用啊。对于新近几年的 Mac 电脑,扩容又不像以前换一块硬盘就好,还好事去问了一圈,对于 2016 年以后的 Mac 电脑的扩容建议是:外接一块移动硬盘。
98 0
|
安全 Windows
Win系统 - Win10不强制更新了,但这2个新功能你必须试试!
Win系统 - Win10不强制更新了,但这2个新功能你必须试试!
124 0
Win系统 - Win10不强制更新了,但这2个新功能你必须试试!
|
JavaScript 前端开发 C++