1、堆上分配的内存,其生命周期是和整个应用程序的生命周期相同的。
2、在MFC中,对资源的操作通常都是通过一个与资源相关的类完成的。
3、创建一非模态对话框时,应在类中覆盖OnOk这个virtual function,然后在此虚函数内部
调用DestroyWindow销毁窗口。并不再调用基类的OnOk函数(将其注释掉
/*this->*/DestroyWindow();
//CDialog::OnOK();
因为基类的OnOk函数调用的是EndDialog函数,此函数适用于销毁模态对话框的,而对于
非模态对话框,它的作用只是使其不可见,但并未销毁之。
4、非模态对话框的三种创建模式:
1> CTestDlg dlg;//定义为视类的成员
...
dlg.Create(IDD_DIALOG1, this);
dlg.ShowWindow(SW_SHOW);
2> CTestDlg* pDlg;//定义为视类的成员
...
pDlg->Create(IDD_DIALOG1, this);
pDlg->ShowWindow(SW_SHOW);
...
delete pDlg;//在视类的析构函数中
3> CTestDlg* pDlg;//非成员,即临时变量
pDlg->Create(IDD_DIALOG1, this);
pDlg->ShowWindow(SW_SHOW);
...
delete this;//CTestDlg类中重载PostNcDestroy,并添加此行代码
5、动态创建按钮实现:
1) CButton m_btn;成员
2) m_btn.Create("ButtonCaption", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0, 0, 100, 100), this, 123);
3) m_btn.ShowWindow(SW_SHOWNORMAL);
6、对于一个窗口是否与一个对象相关联的判断:(防止多次关联操作)
1) 设置一bool成员进行控制(或用一static局部成员控制也可)
2) 通过对象的m_hWnd是否为空来判断(是否obj.m_hWnd==NULL)
7、为了使一个静态文本控件能够响应鼠标单击消息,那么需要进行两个特殊的步骤:
1) 改变它的ID
2) 在它的属性对话框中选中Notify选项
8、MFC提供了多种以DDX_为前缀的函数,这些函数分别用于不同控件的数据交换。(DDX:Dialog Data Exchange,对话框数据交换)
MFC提供了多个以DDV_为前缀的数据校验函数。(DDV:Dialog Data Validation,对话框数据校验
EM_开头的消息是指编辑框控件消息(Edit Control Message)
9、*显示:编辑框的属性中有一Password属性,将之设为true即可。
10、控件与成员变量数据交换是由DoDateExchange函数完成的,而在程序代码中从不直接调用此函数
而是通过CWnd类的另一个成员函数:UpdateData来调用。
BOOL CWnd::UpdateData(BOOL bSaveAndValidate=TRUE);
UpdateData(TRUE):函数正在获取对话框数据
UpdateData(FALSE):函数正在初始化对话框控件
11、控件控制:
获取控件上的文本:CWnd::GetWindowText (使用前先获取控件对象(指向控件对象的指针))
设置控件上的文本:CWnd::SetWindowText (使用前先获取控件对象(指向控件对象的指针))
获取空间对象:CWnd::GetDlgItem [CWnd* GetDlgItem(int nID) const;]
返回对话框中指定ID的控件上的文本:CWnd::GetDlgItemText [GetDlgItem和GetWindowText的组合]
设置对话框中指定ID的控件上的文本:CWnd::SetDlgItemText
返回指定控件的文本,并将其转换为一整形数值:CWnd::GetDlgItemInt [UINT GetDlgItemInt(int nID, BOOL* opTrans=NULL, BOOL bSigned=TRUE);]
设置指定控件的文本,并将其转换为一整形数值:CWnd::SetDlgItemInt [void SetDlgItemInt(int nID, UINT nValue, BOOL bSigned=TRUE);]
12、发送消息:
::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1); (PlatForm SDK)
::SendMessage(m_edit1->m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1); (PlatForm SDK)
GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT, 10, (LPARAM)ch1); (CWnd)
m_edit1.SendMessage(WM_GETTEXT, 10, (LPARAM)ch1); (CWnd)
SendDlgItemMessage(IDC_EDIT1, WM_GETTEXT, 10, (LPARAM)ch1);
13、获取窗口文本的消息:WM_GETTEXT
设置窗口文本的消息:WM_SETTEXT
获得编辑框中复选的内容:WM_GETSEL
设置编辑框中复选的内容:WM_SETSEL (对于EM_SETSEL消息,有一种特殊情况,如果这个消息的wParam参数为0,lParam参数威-1,那么编辑框控件中的所有内容都将被复选)
14、对话框伸缩功能的实现
1) 用一个图像空间充当分隔符
2) 通过GetWindowPos获得一个对话框或控件的位置
3) CRect判空:IsRectEmpty(rect的宽度和高度都为0或者是一个负值,则返回true)和IsRectNull函数(四个坐标皆为0则返回true)
4) 设置窗口的位置和大小的函数:SetWindowPos (注意各参数)
5) Z-order
15、设置焦点:SetFocus
16、手动添加OK按钮:
1) 拖入一按钮
2) 将其ID设为IDOK(不是IDC_OK,也不是ID_OK)
3) 为其添加消息响应函数,自动为OnOk函数
17、设置Tab order:Ctrl+D, 顺序单击
18、焦点传递:
OK按钮的响应函数中(添加),注释掉OnOk()函数的调用,添加GetNextDlgTabItem(GetFocus())-> SetFocus();即可。
19、SetWindowLong: 改变指定窗口的属性
VC++深入详解·chapter07·笔记
本文介绍MFC中对话框与控件的基本操作方法,包括非模态对话框的创建方式、按钮动态创建步骤、控件关联判断、响应鼠标点击设置、数据交换与验证、控件文本读写等实用技巧。

被折叠的 条评论
为什么被折叠?



