天天看点

duilib CDateTimeUI 在Xp下的bug修复

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>(&amp;pp,0,</code><code>sizeof</code><code>(pp));</code>

<code>                 </code><code>//pp.uHit=MCHT_CALENDAR;</code>

<code>                 </code><code>GetCursorPos(&amp;pp.pt);</code>

<code>                 </code><code>::ScreenToClient(hh,&amp;pp.pt);</code>

<code>                 </code><code>pp.cbSize=</code><code>sizeof</code><code>(pp);</code>

<code>                 </code><code>MonthCal_HitTest(hh,&amp;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(&amp;pt); </code>

<code>                </code><code>RECT rt;</code>

<code>                </code><code>::GetWindowRect(m_hWnd,&amp;rt);</code>

<code>                </code><code>if</code><code>(</code>

<code>                    </code><code>!(pt.x&gt;=rt.left&amp;&amp;pt.x&lt;=rt.right)||</code>

<code>                    </code><code>!(pt.x&gt;=rt.top&amp;&amp;pt.x&lt;=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>(&amp;pp,0,</code><code>sizeof</code><code>(pp));</code>

<code>                    </code><code>GetCursorPos(&amp;pp.pt);</code>

<code>                    </code><code>::ScreenToClient(hh,&amp;pp.pt);</code>

<code>                    </code><code>pp.cbSize=</code><code>sizeof</code><code>(pp);</code>

<code>                    </code><code>MonthCal_HitTest(hh,&amp;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(&amp;pt); </code>

<code>                    </code><code>RECT rt;</code>

<code>                    </code><code>::GetWindowRect(m_hWnd,&amp;rt);</code>

<code>                    </code><code>if</code><code>(</code>

<code>                        </code><code>!(pt.x&gt;=rt.left&amp;&amp;pt.x&lt;=rt.right)||</code>

<code>                        </code><code>!(pt.x&gt;=rt.top&amp;&amp;pt.x&lt;=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 &amp;&amp; (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-&gt;m_nDTUpdateFlag = DT_DELETE;</code>

<code>            </code><code>m_pOwner-&gt;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 &amp;&amp; wParam == VK_ESCAPE)</code>

<code>            </code><code>m_pOwner-&gt;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>

继续阅读