转自: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;
    }

duilib CDateTimeUI 在Xp下的bug修复的更多相关文章

  1. 仿酷狗音乐播放器开发日志二十五 duilib右键事件的不足的bug修复

    转载请说明原出处,谢谢~~ 虽然仿酷狗的各个菜单早就写好了,但是一直没有附加到程序里.今天把菜单和播放列表控件关联时发现了问题. 和播放列表相关的菜单有三个,分别是每个音乐项目控件相关的菜单.分组的菜 ...

  2. 仿酷狗音乐播放器开发日志十九——CTreeNodeUI的bug修复二(附源码)

    转载请说明原出处,谢谢 今天本来打算把仿酷狗播放列表的子控件拖动插入功能做一下,但是仔细使用播放列表控件时发现了几个逻辑错误,由于我的播放 列表控件是基于CTreeViewUI和CTreeNodeUI ...

  3. 使用Windbg在XP下Heap追踪失败的原因

    1.故事背景      最近同事的代码中碰到一个bug会导致奔溃的bug,从dump上看是由于某个对象的堆内存指针被释放了,但代码仍调用了该对象指针的虚函数,从而引起内存访问违法崩溃,由于该类被大量使 ...

  4. .NET 程序在 Windows XP 下调用 SHA512CryptoServiceProvider 方法报 PlatformNotSupportedException 异常

    转自:http://stackoverflow.com/questions/1293905/sha256cryptoserviceprovider-and-related-possible-to-us ...

  5. 在XP下基于VHD版XP 2003 win7制作的RAMOS心得

    在XP下基于VHD版win7制作的RAMOS心得1.用DiskGenius创建1.85G的VHD固定磁盘文件,以win7prosen.vhd为例,然后进行分区格式化,格式化时启用NTFS压缩.2.为了 ...

  6. OJ2.0userInfo页面Modify逻辑bug修复,search功能逻辑实现

    这周的主要任务:userInfo页面Modify逻辑bug修复,search功能逻辑实现. (一)Modify逻辑bug修复: 这里存在的bug就是在我们不重置password的时候依照前面的逻辑是不 ...

  7. 奇怪的问题,InvalidateRect最后一个参数在XP下无效

    一直用的WIN2K系统,写的一个程序在本机正常,到XP系统的机器运行发现调整窗口大小时界面闪得厉害,程序比较大,而且这种闪烁还不好调试,因为单步调试没有闪烁效果,只能排除法找原因,最后以为找到原因了, ...

  8. cocos2d-x多分辨率和随后的自适应CCListView的bug修复

    cocos2d-x多分辨率自适配及因此导致的CCListView的bug修复 cocos2d-x是一款众所周知的跨平台的游戏开发引擎.因为其跨平台的特性.多分辨率支持也自然就有其需求. 因此.在某一次 ...

  9. alibaba druid 在springboot start autoconfig 下的bug

    alibaba druid 在springboot start autoconfig下的bug 标签(空格分隔):druid springboot start autoconfig 背景 发现.分析过 ...

随机推荐

  1. CSS布局之圣杯布局和双飞翼布局

    其实圣杯布局和双飞翼布局实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局.它们实现的效果都是一样的,差别在于其实现的思想. 一.圣杯布局 html代码中,将重要的内容 ...

  2. USACO 1.3.3 Calf Flac(Manacher算法)

    Description 据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文.你的工作就是去寻找这些牛制造的奇观(最棒的回文). 在寻找回文时不用理睬那些标 ...

  3. LeetCode 206. Reverse Linked List(C++)

    题目: Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4 ...

  4. Scrum立会报告+燃尽图(十一月二十日总第二十八次):功能开发与纪录版本控制报告

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  5. 欢迎来怼-----Beta冲刺贡献分数分配结果

    队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文

  6. 对懂球帝ios版的用户体验

    用户界面: 主页面是资讯页面 这个设计很棒 对球迷来说 每天最关注的就是 我的主队赢了输了 其次界面以绿色为主 很有绿茵场的感觉 很符合足球狗的口味 记住用户的选择: 这个应用 有一个 球队的关注 选 ...

  7. jQuery之过滤元素

    还是那句话,这些知识一个小小的练习,更多的请看jQuery手册 在jQuery对象中的元素对象数组中过滤出一部分元素来1. first()2. last()3. eq(index|-index)4. ...

  8. Objective - C 之类目

    一.类目(category):为已有的类(可以是系统类,也可以是自定义类)添加公有的新的方法: 例如:为系统已有的NSString类添加一个比较字符串大小的方法 1.创建过程: 2.NSString ...

  9. Robot 模拟操作键盘 实现复制粘贴功能;

    1.代码逻辑 : a.封装一个粘贴的方法体:setAndctrlVClipboardData(String string);参数string是需要粘贴的内容 : b.声明一个StringSelecti ...

  10. 【Quartz.Net】.net 下使用Quartz.Net

    Quartz.net是作业调度框架 1. 项目中添加quartz.net的引用(这里使用nuget管理) 新建一个类TimingJob,该类主要用于实现任务逻辑   using Quartz; usi ...