VS2008开发CE6.0应用

关于SubclassWindows

1.Intime的项目中,程序退出时经常有异常时因为static控件用了Attach,而不是SubclassWindow;
2.SubclassWindow和Attach的区别:
   a.Attach是为了操作窗口 SubClassWindow更多是为了依附在那个窗体上,做自身类想要的动作;
   b.SubclassWindow完成了两项功能:我们对该窗体实例调用成员函数将会直接改变相关窗体句柄对应的窗体(Attach); 系统传给相关窗体句柄的消息会先经过该窗体实例的消息映射(SetWindowLong)。

关于子类化
SubclassWindow是MFC对子类化的简化
例:实现一个拖动的button,并在对话框中方便使用,假设对话框中安置了一个普通按钮IDOK。
1.从CButton派生一个CMyButton,实现拖动功能
2.得到句柄hOK = GetDlgItem(IDOK)->m_hWnd
3.定义变量 CMyButton b;
              b.SubclassWindow(hOK);
子类化就是改变一个已创建窗口的行为,即改变窗口函数,SubclassWindow是MFC对此目的进行的简化。上述方法的好处在于:你可以用普通控件布置对话框。另外,UnsubclassWindow是必须的善后步骤。

关于对话框的一些知识总结
1. CreateInDirect用来根据内存中的模板创建无模式对话框,InitModalIndirect用来根据内存中的模板创建模式对话框。
2. AfxDlgProc处理WM_INITDIALOG消息时调用虚拟函数OnInitDialog,给程序员一个机会处理对话框的初始化。
3. 得到父窗口:CWnd *pWnd = CWnd::GetSafeOwner(m_pParentWnd, &m_hWndTop);
    返回父窗口句柄:return pWnd->GetSafeHwnd();
4. 无模式对话框:CSrollView,CFormView都继承至CView;

WTL相关知识
1. WTL中如何查看某个控件的消息:在Resource Edit界面,双击这个控件;在VS200中也可以右键点击该控件,选"Add Event Hander"。

2. WTL中GetResourceInstance(),它返回你的EXE的HINSTANCE实例,和MFC的AfxGetResourceHandle()方法相似。(当然还有CComModule::GetModuleInstance(),它相当于MFC的AfxGetInstanceHandle()。)

3. ATL中的对话框,窗口的基类是CDialogImpl而不是CWindowImpl。

4. CWindow::rcDefault,这是CWindow中的成员(静态数据成员),数据类型是RECT。和调用CreateWindow() API时使用CW_USEDEFAULT指定窗口的宽度和高度一样,ATL使用rcDefault作为窗口的最初大小。

5. 要在StdAfx中在#include <atlbase.h>前面加上#define _SECURE_ARL 1;

6. Deploy应用时,要在项目设置中把Deployment->Additional File里清空,否则会出现找不到系统文件的错误;

7. ListBox和ComboBox都用来显示列表项目,所不同的是ComboBox占用较少的空间。ListBox则提供了一个项目列表以供选择。以下是一个ComboBox和一个ListBox的示意图:

8. 控制Windows窗口、控件、资源……都是通过它们的句柄来实现,如 HHANDLE、HWND、HDC都是句柄,它表现为一个32位长整形数据,存放于Windows中的特定区域,我们可以把它理解为指向我们想控制的窗口、控件、资源的索引,有了它,我们就可以控制我们想要控制的对象。 

9. 在OnInitDialog中设置了某个控件得到焦点后(m_EditOne.SetFocus),要return FALSE,否则不生效。return TRUE表示“Let the system set the focus”.  10. CMessageLoop实例,该实例包含了这个线程的消息循环。这些消息循环都放在模块的全局消息循环中,通过线程的ID来索引。这样,该线程的其它代码就能访问得到。每一个应用程序维护一个消息循环队列Map,应用程序中的每个线程都通过"_Module.AddMessageLoop(&theLoop)",把该线程的消息循环加入到_Module的消息循环Map中。消息循环对象包含了消息过滤和空闲处理。每个线程都可以加入空闲处理代码和消息过滤。

10.VC6.0用UNICODE后出现msvcrtd.lib(crtexew.obj) : error LNK2001的问题的解决办法Project Setting->Link->Output->将Entry-Point Symbol填入:wWinMainCRTStartup就可以了。

你可能感兴趣的:(windows,mfc)