窗口子类化后的消息处理机制怎么理解呢?
解决方案 »
- 无法定位程序输入点 _except_handler4_common 于动态链接库 msvcrt.dll 上
- 源码教程:ActiveX文件上传(POST方式),Javascript调用ActiveX方法,ActiveX调用Javascript方法,上传到NTLM认证页面,解决参数编码问题
- 求助:串口操作
- 有7个编辑框 根据第一个编辑框的值设置另外几个编辑框是否为disable属性 这段代码怎么写呀
- 关于isapi处理虚拟页面的问题
- 怎样获取一个对话框中控件按键消息
- 怎样把多文档中的工具栏去掉
- <高手请进> ATL COM中调用使用CImage类的DLL,为什么无法成功释放???
- 请问各位高手CMiniFrameWnd有什么用处?
- 能使cedit中文字可以用不同的颜色显示嘛?急急
- WIN32程序下使用mciSendString,DEBUG编译没问题,RELEASE出错
- ADO问题,请大侠指教!
要在程序中创建新设计的控件,显然不能用自动创建的办法,因为对话框模板对新控件的特性一无所知.程序可以用手工方法创建控件,在调用派生类的Create函数时,派生类会调用基类的Create函数创建控件.用Create函数创建控件是一件比较麻烦的工作,程序需要为函数指定一大堆的控件风格以及控件的坐标和ID.特别是控件的坐标,没有经验的程序员很难确切地安排控件的位置和大小,往往需要反复调整.利用MFC的CWnd::SubclassDlgItem提供的动态连接功能,可以避免Create函数的许多麻烦,该函数大大简化了在对话框中创建派生控件的过程.
在用手工方法创建控件时,先要构建一个控件对象,然后再用Create函数在屏幕上创建控件窗口,也就是说,控件的创建工作是由控件对象完成的.动态连接的思路则不同,SubclassDlgItem可以把对话框中已有的控件与某个窗口对象动态连接起来,该窗口对象将接管控件的消息处理,从而使控件具有新的特性.SubclassDlgItem函数的声明为
BOOL SubclassDlgItem( UINT nID, CWnd* pParent );
参数nID是控件的ID,pParent是指向父窗口的指针.若连接成功则函数返回TRUE,否则返回FALSE.
综上所述,要在程序中使用派生控件,应该按下面两步进行:
1. 在对话框模板中放置好基类控件.
2. 在对话框类中嵌入派生控件类的对象.
3. 在OnInitDialog中调用SubclassDlgItem将派生类的控件对象与对话框中的基类控件相连接,则这个基类控件变成了派生控件.
例如,如果要在对话框中使用新设计的编辑框控件,应先在对话框模板中的合适位置放置一个普通的编辑框,然后,在OnInitDialog函数中按下面的方式调用SubclassDlgItem即可:
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_MyEdit.SubclassDlgItem(IDC_MYEDIT, this);
return TRUE;
}