zoukankan      html  css  js  c++  java
  • duilib CDateTimeUI 在Xp下的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 ");
          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 ");
                        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 ");
            }
            if(WM_NOTIFY==uMsg)
            {
                ::SetFocus(m_hWnd);
            }
            if( uMsg == WM_KILLFOCUS /**/)
            {
                ::OutputDebugString("WM_KILLFOCUS ");
                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 ");
                            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;
        }

  • 相关阅读:
    通知advice
    通知advice
    springmvc+mybatis需要的jar包与详解
    sass参考手册
    Mapper
    排序
    常见设计模式
    JavaScript之事件循环,宏任务与微任务
    字符串翻转
    eeeeeeeeeeeeeeeeeeeeee
  • 原文地址:https://www.cnblogs.com/redrainblog/p/4275824.html
Copyright © 2011-2022 走看看