CDateTimeUI 的bug修复。修改CDateTimeWnd的HandleMessage方法
<a target="_blank" href="http://my.oschina.net/u/343244/blog/370131#">?</a>
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
<code>if</code><code>(WM_NOTIFY==uMsg)</code>
<code>{</code>
<code> </code><code>::SetFocus(m_hWnd);</code>
<code>}</code>
<code>if</code><code>( uMsg == WM_KILLFOCUS </code><code>/**/</code><code>)</code>
<code> </code><code>::OutputDebugString(</code><code>"WM_KILLFOCUS\n"</code><code>);</code>
<code> </code><code>if</code><code>( uMsg == WM_KILLFOCUS </code><code>/**/</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>//这里肯可能需要优化,因为FindWindow找出来的窗口不一定是本进程的窗口</code>
<code> </code><code>HWND</code> <code>hh=::FindWindow(_T(</code><code>"SysMonthCal32"</code><code>),NULL);</code>
<code> </code><code>if</code><code>(::IsWindow(hh))</code>
<code> </code><code>{</code>
<code> </code><code>MCHITTESTINFO pp;</code>
<code> </code><code>memset</code><code>(&pp,0,</code><code>sizeof</code><code>(pp));</code>
<code> </code><code>//pp.uHit=MCHT_CALENDAR;</code>
<code> </code><code>GetCursorPos(&pp.pt);</code>
<code> </code><code>::ScreenToClient(hh,&pp.pt);</code>
<code> </code><code>pp.cbSize=</code><code>sizeof</code><code>(pp);</code>
<code> </code><code>MonthCal_HitTest(hh,&pp);</code>
<code> </code><code>//下一个月</code>
<code> </code><code>if</code><code>(pp.uHit==MCHT_TITLEBTNNEXT)</code>
<code> </code><code>{</code>
<code> </code><code>return</code> <code>1;</code>
<code> </code><code>}</code>
<code> </code><code>//上一个月</code>
<code> </code><code>if</code><code>(pp.uHit==MCHT_TITLEBTNPREV)</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>POINT pt;</code>
<code> </code><code>::GetCursorPos(&pt); </code>
<code> </code><code>RECT rt;</code>
<code> </code><code>::GetWindowRect(m_hWnd,&rt);</code>
<code> </code><code>if</code><code>(</code>
<code> </code><code>!(pt.x>=rt.left&&pt.x<=rt.right)||</code>
<code> </code><code>!(pt.x>=rt.top&&pt.x<=rt.bottom)</code>
<code> </code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>::OutputDebugString(</code><code>"CLose\n"</code><code>);</code>
<code> </code><code>lRes= OnKillFocus(uMsg,wParam, lParam,bHandled);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
完整代码:
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
<code>LRESULT</code> <code>CDateTimeWnd::HandleMessage(</code><code>UINT</code> <code>uMsg, </code><code>WPARAM</code> <code>wParam, </code><code>LPARAM</code> <code>lParam)</code>
<code> </code><code>{</code>
<code> </code><code>LRESULT</code> <code>lRes = 0;</code>
<code> </code><code>BOOL</code> <code>bHandled = TRUE;</code>
<code> </code><code>/**xpBug***/</code>
<code> </code><code>DWORD</code> <code>ProcessId;</code>
<code> </code><code>if</code><code>(WM_SETFOCUS==uMsg)</code>
<code> </code><code>{</code>
<code> </code><code>::OutputDebugString(</code><code>"WM_SETFOCUS\n"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>if</code><code>(WM_NOTIFY==uMsg)</code>
<code> </code><code>::SetFocus(m_hWnd);</code>
<code> </code><code>if</code><code>( uMsg == WM_KILLFOCUS </code><code>/**/</code><code>)</code>
<code> </code><code>::OutputDebugString(</code><code>"WM_KILLFOCUS\n"</code><code>);</code>
<code> </code><code>if</code><code>( uMsg == WM_KILLFOCUS </code><code>/**/</code><code>)</code>
<code> </code><code>//这里肯可能需要优化,因为FindWindow找出来的窗口不一定是本进程的窗口</code>
<code> </code><code>HWND</code> <code>hh=::FindWindow(_T(</code><code>"SysMonthCal32"</code><code>),NULL);</code>
<code> </code><code>//Isdel=true;</code>
<code> </code><code>if</code><code>(::IsWindow(hh))</code>
<code> </code><code>MCHITTESTINFO pp;</code>
<code> </code><code>memset</code><code>(&pp,0,</code><code>sizeof</code><code>(pp));</code>
<code> </code><code>GetCursorPos(&pp.pt);</code>
<code> </code><code>::ScreenToClient(hh,&pp.pt);</code>
<code> </code><code>pp.cbSize=</code><code>sizeof</code><code>(pp);</code>
<code> </code><code>MonthCal_HitTest(hh,&pp);</code>
<code> </code><code>//下一个月</code>
<code> </code><code>if</code><code>(pp.uHit==MCHT_TITLEBTNNEXT)</code>
<code> </code><code>{</code>
<code> </code><code>return</code> <code>1;</code>
<code> </code><code>}</code>
<code> </code><code>//上一个月</code>
<code> </code><code>if</code><code>(pp.uHit==MCHT_TITLEBTNPREV)</code>
<code> </code><code>}</code><code>else</code>
<code> </code><code>POINT pt;</code>
<code> </code><code>::GetCursorPos(&pt); </code>
<code> </code><code>RECT rt;</code>
<code> </code><code>::GetWindowRect(m_hWnd,&rt);</code>
<code> </code><code>if</code><code>(</code>
<code> </code><code>!(pt.x>=rt.left&&pt.x<=rt.right)||</code>
<code> </code><code>!(pt.x>=rt.top&&pt.x<=rt.bottom)</code>
<code> </code><code>)</code>
<code> </code><code>::OutputDebugString(</code><code>"CLose\n"</code><code>);</code>
<code> </code><code>lRes= OnKillFocus(uMsg,wParam, lParam,bHandled);</code>
<code> </code>
<code> </code><code>else</code><code>/**/</code> <code>if</code> <code>(uMsg == WM_KEYUP && (wParam == VK_DELETE || wParam == VK_BACK))</code>
<code> </code><code>LRESULT</code> <code>lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);</code>
<code> </code><code>m_pOwner->m_nDTUpdateFlag = DT_DELETE;</code>
<code> </code><code>m_pOwner->UpdateText();</code>
<code> </code><code>PostMessage(WM_CLOSE);</code>
<code> </code><code>return</code> <code>lRes;</code>
<code> </code><code>else</code> <code>if</code> <code>(uMsg == WM_KEYUP && wParam == VK_ESCAPE)</code>
<code> </code><code>m_pOwner->m_nDTUpdateFlag = DT_KEEP;</code>
<code> </code><code>else</code>
<code> </code><code>bHandled = FALSE;</code>
<code> </code><code>if</code><code>(!bHandled ) </code>
<code> </code><code>return</code> <code>CWindowWnd::HandleMessage(uMsg, wParam, lParam);</code>
<code> </code><code>return</code> <code>lRes;</code>
<code> </code><code>}</code>