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

目录
相关文章
|
存储 算法 数据库
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
676 0
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【8月更文挑战第2天】数据安全至关重要,AES加密作为对称加密的标准之一,因其高效性与灵活性被广泛采用。本文通过实战演示Python中AES的应用,使用pycryptodome库进行安装及加密操作。示例代码展示了生成随机密钥与初始化向量(IV)、对数据进行加密及解密的过程。注意事项包括密钥管理和IV的随机性,以及加密模式的选择。掌握AES加密能有效保护敏感数据,确保信息安全无虞。
418 6
|
JavaScript 前端开发 中间件
Vue工具和生态系统:什么是Nuxt.js?它的特点是什么?
Vue工具和生态系统:什么是Nuxt.js?它的特点是什么?
419 0
|
SQL Oracle 关系型数据库
【已解决】ORA-01722: invalid number
【已解决】ORA-01722: invalid number
794 0
|
监控 安全 Cloud Native
带你读《云原生机密计算最佳实践白皮书》——Intel SGX: Intel安全防护扩展
带你读《云原生机密计算最佳实践白皮书》——Intel SGX: Intel安全防护扩展
1021 1
|
人工智能 测试技术 程序员
4月24日云栖精选夜读:AI不可怕,就怕AI会画画——这里有一种你还不知道的‘图’灵测试…
有人说,AI(人工智能)有什么可怕的?它们不过是做一些人类不愿做的脏活、累活和一些可批量重复操作的活计,而对一些带有原创性质的活,比如艺术创作,AI就不灵光了。如果人工智能也能向这些领域进军呢?让我们拭目以待!
3107 0
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
294 116