📄 csdn_文档中心_wtl for mfc programming实践篇 --- 一个自定义combobox的移植过程(上).htm
字号:
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">template
<class TBase><o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">BOOL
CWindowImplRoot< TBase >::DefaultReflectionHandler(HWND hWnd,
UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT&
lResult)<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">{<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1">
</SPAN>switch(uMsg)<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1">
</SPAN>{<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_COMMAND:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_NOTIFY:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_PARENTNOTIFY:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_DRAWITEM:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_MEASUREITEM:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_COMPAREITEM:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_DELETEITEM:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_VKEYTOITEM:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_CHARTOITEM:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_HSCROLL:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_VSCROLL:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_CTLCOLORBTN:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_CTLCOLORDLG:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_CTLCOLOREDIT:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_CTLCOLORLISTBOX:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_CTLCOLORMSGBOX:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_CTLCOLORSCROLLBAR:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>case
OCM_CTLCOLORSTATIC:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 2">
</SPAN>lResult = ::DefWindowProc(hWnd, uMsg - OCM__BASE, wParam,
lParam);<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 2">
</SPAN>return TRUE;<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1">
</SPAN>default:<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 2">
</SPAN>break;<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1">
</SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>return
FALSE;<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">看到这里,如果想添加<SPAN
lang=EN-US>DEFAULT_REFLECTION_HANDLER</SPAN>宏,控件类就要由<SPAN
lang=EN-US>CWindowImpl</SPAN>派生。为了测试把死马当活马医的想法,我们把类的定义改为如下这样:<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">class CComboBoxEx:public
CWindowImpl< CComboBoxEx, CComboBox><o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">于是,添加<SPAN
lang=EN-US>DEFAULT_REFLECTION_HANDLER</SPAN>宏得操作通过了编译,但是事实证明,不合逻辑的想法很难带来正确的结果,不仅重画事件没有被触发,修改后,在控件类析构时碰到了<SPAN
lang=EN-US>ATL</SPAN>的断言。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">错误提示是,类在窗体句柄销毁之前被析构。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">这个错误到让我们想到原书中提到的一个<SPAN
lang=EN-US>WTL</SPAN>特性,<SPAN
lang=EN-US>WTL</SPAN>不会自动销毁窗体句柄,需要自己手工<SPAN
lang=EN-US>Detach()</SPAN>窗体句柄。既然这样,我们又添加了下面的代码:<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">~CComboBoxEx()
{<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1">
</SPAN>Detach();<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd"><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">虽然,没有<SPAN
lang=EN-US>Attach()</SPAN>的<SPAN
lang=EN-US>Detach()</SPAN>感觉有点怪,可是毕竟<SPAN
lang=EN-US>ATL</SPAN>的断言不会出现了。但是,问题并没有解决,重画事件还是没有被触发。难道是<SPAN
lang=EN-US>CMainDlg</SPAN>没有反射事件回来?看看用来反射事件的<SPAN
lang=EN-US>REFLECT_NOTIFICATIONS</SPAN>宏的代码:<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt">#define
REFLECT_NOTIFICATIONS() \<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 1"> </SPAN>{
\<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
style="mso-tab-count: 2">
</SPAN>bHandled = TRUE; \<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt"><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -