第七章
1. 模态对话框
1.1 创建 Domodal();
内部调用ShowWindow(SW_SHOW);
对话框类的对象声明为局部变量就可以,因为Domodal阻塞在这里。
1.2 销毁,直接点“确定”、“取消”就可以了。CTestDlg::OnOK()和CTestDlg:: OnCancel ()调用CDialog::OnOK()和CDialog:: OnCancel (),后面两个调用EndDialog()。对于模态,EndDialog()销毁对话框。
2.非模态对话框
2.1 创建
// lpszTemplateName对话框模板名称
// pParentWnd 对话框的父窗口,一般用this(谁调用。this就是谁)
BOOL Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);
ShowWindow(SW_SHOW);
注意:对话框类对象要用全局变量或调用所在类的成员变量,或定义为局部指针变量,然后new出来,存在于堆上。
2.2销毁
a). 如果是new出来的局部比变量,要在CTestDlg::PostNcDestory(){
delete this;
CDialog::PostNcDestory(); }
b). OK按钮调用的EndDialog() 对于非模态,只是隐藏,并未销毁。
解决方法:重写OnOK和OnCancel,调用DestroyWindow(),同时不要在调用CDialog::OnOK()和CDialog:: OnCancel ();
3.动态创建按钮
CButton类成员函数Create(); 可以在mfc项目里查看接口。
4.控件的访问
CWnd::CWnd* GetDlgItem(intnID) const;获取控件指针
GetNextDlgTabItem();//返回指定控件前面或后面一个具有WS_TABSTOP风格的控件
SetWindowText(); GetWindowText();
GetDlgItemText(); SetDlgItemText();
GetDlgItemInit(); SetDlgItemInit()
char ch1[256];memset(ch1,0,sizeof(char)/sizeof(char));
SendMessage(GetDlgItem(nID)->m_hwnd,WM_GETTEXT,10,(lparam)ch1);
SendMessage(m_edit.m_hwnd,WM_GETTEXT,10,(lparam)ch1);
m_edit.SendMessage(WM_GETTEXT,10,(lparam)ch1);
WM_SETTEXT
4.对话框伸缩功能 通过GetWindowRect()或者GetClientRect()等获取窗口大小,然后调用SetWindowPos来实现对话框伸缩。
5.焦点传递
a).实现方法
a-1).为编辑框控件编写一个类,利用这个类来捕获键盘消息
a-2).修改编辑框控件过程函数
WNDPROC prevProc; 定一个窗口过程
LRESULT CALLBACK NewEditProc //窗口过程的名字可以随意命名
(
HWND hwnd, // 窗口的句柄
UINT uMsg, // 消息标示
WPARAM wParam, //第一个消息参数
LPARAM lParam // 第二个消息参数
)
{
if(uMsg == WM_CHAR && wParam == 0x0d)//判断是都为回车符,wparam参数保存的是字符的ASCII码
{
::SetFocus(GetNextWindow(hwnd,GW_HWNDNEXT))//SetFocus(hwnd), GetNextWindow(HWNDhwnd/*当前窗口句柄*/,UNIT wCmd /*查找方向*/);// 是获取下一个窗口的句柄 参数:GW_HWNDNEXT GW_HWNDPREV
return 1;
}
else
{
return prevProc(hwnd,uMsg,wParam,lParam);如果不是回车调用先前的窗口过程来处理该消息
}
}
在OnInitDialog() 函数中调用SetWindowLong(),因为在相应PreCreateWindow()和Create()函数的时候,对话框及其子控件都没有全部创建完毕,所以无法获取各子控件的窗口对象,也就无法修改编辑框的窗口过程函数。
OnInitDialog()
{
PrevProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)NewEditProc);
}
SetFouce(HWND hwnd)