1. 当用户在对话框上按OK按钮或者Cancel按钮时,对话框都会发送WM_COMMAND,而OnOk与OnCancel是分别处理这两个WM_COMMAND的函数
2.在点击OK按钮与Cancel按钮时,程序会关闭对话框,此时发送WM_CLOSE消息,而OnClose函数是响应这个消息的函数
3.通常,程序会调用OnClose函数时, 调用DestroyWindow,这个函数会发送WM_DESTORY消息,而OnDestory是响应这个消息的函数
4.在此之后,窗体就真正地消毁了。
对于模态对话框而言,需要显示时,只需要定义一个对话框类,然后调用DoModal方式,就能显示。当要关闭对话框时,调用EndDialog,里而参数指定是按下OK按钮,还是按下Cancel按钮。在调用EndDialog时,就会发送WM_CLOSE消息。
对于非模态对话框而言,需要显示时,定义一个对话框类指针,然后调用Create方法,再ShowWindow显示出来。在关闭对话框时,在对话框成员函数PostNcDestroy中调用delete this;删除自身。
void CTestDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
}
2.创建非模态对话框的资源与类。用普通的方法创建一个普通对话框的资源与类。比如对话框的资源ID 是IDD_DIALOG1 ,类名叫CModalessTest 。
3.从父对话框CTestDlg显示非模态对话框的CModalessTest 。首先用new 生成CModalessTest 的实体(Object)。 然后,用CDialog 的成员関数Create() ,以CDlgTest::IDD 为参数创建非模态对话框的窗口。最後用ShowWindow() 显示非模态对话框。那么改写void CTestDlg::OnBnClickedButton1() 如下:
#include "ModalessTest.h"
void CTestDlg::OnBnClickedButton1()
{
CModalessTest* pDlg = new CModalessTest();
pDlg->Create(CModalessTest::IDD, this );
pDlg->ShowWindow(SW_SHOW);
}
4.非模态对话框实体(Object)的自动清除。非模态对话框关闭以后,要把它的实体清除。在父对话框的某处调用delete CModalessTest ;是没有问题的。要是非模态对话框自己能自我删除的话更为方便,重载和改写PostNcDestroy() 函数实现此功能。
例:
void CModalessTest::PostNcDestroy() { CDialog::PostNcDestroy(); delete this; }
将子对话框的参数传到主对话框:
1.如 主对话框名CWindowsDlg 在CWindowsDlg类下声明public:CString text;
2.CWindowsDlg.cpp文件下按钮打开子窗口CModalessTest:
#include "ModalessTest.h"
void CWindowsDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CModalessTest* pDlg = new CModalessTest();
pDlg->Create(CModalessTest::IDD, this);
pDlg->ShowWindow(SW_SHOW);
//m_text.SetWindowText(text);
}
3.在子对话框中得到参数,按钮传回主对话框并显示:
#include "windowsDlg.h"
void CModalessTest::OnOK()
{
// TODO: Add extra validation here
CWindowsDlg* pParent=(CWindowsDlg*)GetParent();
m_text.GetWindowText(pParent->text);
pParent->m_text.SetWindowText(pParent->text);
//CDialog::OnOK();
}
4.CModalessTest中添加PostNcDestroy函数,先ctrl+w添加,再写入代码:
void CModalessTest::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
CDialog::PostNcDestroy();
delete this;
//CDialog::PostNcDestroy();
}
个人理解:以上应为点x之后的响应函数;若自己加入退出函数,可加以控件
void CModalessTest::OnQuit()
{
// TODO: Add your control notification handler code here
CDialog::DestroyWindow();
delete this; (可不加?)
}
MFC通用控件:
创建子窗口可用CreateWindowEx函数,lpClassName是定义窗口的类,若不是子窗口就用RegisterClass注册的类。否则就用(Class):
Class 用于创建的控件
Button 按钮控件、单选钮控件、复选框控件、分组框控件
ComboBox 组合框控件
Edit 编辑框控件
ListBox 列表框控件
Static 静态文本控件
创建子窗口时风格和每个类的风格可以联合使用
如:WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_HSCROLL (LBS_STANDARD是ListBox类的风格)
用CreateWindowEx函数可以创建任何窗口和子窗口,而用MFC的相应类也可以创建任何窗口和子窗口(如CListBox的Create成员函数就可以创建列表框)
如下是一个先用CreateWindowEx创建了一个用RegisterClass注册窗口类的窗口,之后又用CreateWindowEx基于ListBox类的子窗口
hwnd = CreateWindowEx("CustomWnd","Win32App",WS_CAPTION|WS_OVERLAPPEDWINDOW|WS_SYSMENU,50,50,500,500,NULL,NULL,wndcls.hInstance,NULL);
CreateWindowEx("ListBox",NULL,WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_HSCROLL,0,0,200,200,hwnd,NULL,wndcls.hInstance,NULL);//窗口风格的组合
可通过MSDN查到相关子窗口的信息,如样式,支持的事件和控制消息等。。。。
1.输入:CreateWindowEx
2.CreateWindowEx Function::windows management
这样就可以看到创建子窗口时支持的类,进入某个类后就可看到子窗口支持的 Messages 和 Notifications
Messages(程序用来控制子窗口的消息) 重点
(程序发送给子窗口的,程序用于控制子窗口的消息)
win32汇编用用SendMessage函数直接发送,而MFC中用类的成员函数实现对子窗口的控制。
Notifications(WM_COMMAND消息的高16位的通知码) 重点
(子窗口发送给程序的消息,消息大多数以WM_COMMAND发送,高16位就是通知码,MSDN中列出了通知码)
win32汇编中在窗口过程中直接监控WM_COMMAND消息,而在MFC中通过定义消息映射宏(指用Create创建的控件)(若是对话框上的控件在编辑区中右键控件并选择:Add Event Handle)可用来监控。
一:静态文本控件(Static Text)
静态文本控件是一种单向交互的控制,用于显示数据,但是不接受输入。
1.创建基于CStatic类的子窗口:
1)用工具箱创建(只能用于对话框上)Static Text
2)用CStatic类的Create函数创建
在.h文件中声明
CStatic test;
在成员函数中调用Create函数
test.Create("jiangkai",WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(20,40,200,100),this,123);
2.通过Has a关系利用静态文本控件实现“文本显示功能”,“显示图标功能”,“显示位图功能”,“点击事件”
若是用用工具箱创建的静态文本控件,需要先为该控件添加变量之后才能实现Has a关系。
文本显示功能:
test.SetWindowText("快乐");
显示图标功能:
test.ModifyStyle(0,SS_ICON); //修改按钮风格
test.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1)); //加载图标
显示位图功能
1)用工具箱创建(只能用于对话框上)Static Text
m_Static2.ModifyStyle(0,SS_BITMAP); //修改按钮风格
m_Static2.SetBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1))); //设置位图
函数原型:HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);
参数:
hlnstance:指向模块实例的句柄。该模块的可执行文件包含了要加载的位图。
lpBitmapName:指向字符串(以NULL结束)批指针。该字符串包含了要加载的位图资源名称。另外一种方式就是该参数可以由低位字是资源标识符、高位字为0位形式组成。可以使用宏MAKEINTRESOURCE来创建这个参数值。
2)用CStatic类的Create函数创建
test.Create("JK",SS_BITMAP|WS_CHILD|WS_VISIBLE,CRect(20,40,200,100),this,123);//样式不能加SS_CENTER
test.ModifyStyle(0,SS_BITMAP); //修改按钮风格
test.SetBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1))); //设置位图
点击事件(其他事件参见MSDN)
1)用工具箱创建(只能用于对话框上)Static Text
在编辑区中右键Static Text控件并选择:Add Event Handle
2)用CStatic类的Create函数创建
test.Create("jiangkai",WS_CHILD|WS_VISIBLE|SS_CENTER|SS_NOTIFY,CRect(20,40,200,100),this,WM_USER+123);//style中必须有SS_NOTIFY
并添加消息映射宏
ON_CONTROL(STN_CLICKED,WM_USER+123,jk);//并最终会以WM_COMMAND消息发送给程序
二:编辑框控件(Edit Box)
编辑框控件是一个可以从键盘输入和编辑的窗口,在编辑框控件中可以进行输入、复制、剪切、粘贴、删除等操作。
1.创建基于CEdit类的子窗口:
1)用工具箱创建(只能用于对话框上)Edit Box
2)用CEdit类的Create函数创建
在.h文件中声明
CEdit test;
在成员函数中调用Create函数
test.Create(WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(20,20,200,10),this,123);
2.通过Has a关系利用编辑框控件实现“设置编辑框控件内容”,“获得编辑框内容”,“撤消编辑框上一次操作”
设置编辑框控件内容、获得编辑框内容
CString temp;
m_Edit4.GetWindowTextA(temp);
test.SetWindowTextA(temp);
撤消编辑框上一次操作
m_Edit4.Undo();
三:列表框控件(List Box)
列表框控显示了一个可选择的列表,可以通过列表框来查看或选择数据项,而且列表的项数是灵活多变的。
1.创建基于CListBox类的子窗口:
1)用工具箱创建(只能用于对话框上)List Box
2)用CListBox类的Create函数创建
在.h文件中声明
CListBox test;
在成员函数中调用Create函数
test.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_HSCROLL,CRect(0,0,200,200),this,WM_USER+123);
2.通过Has a关系利用编辑框控件控件实现“向列表框控件插入数据”,“在列表框查找数据”,“处理列表框控件的LBN_DBCLK事件”,“实现列举文件功能”
向列表框控件插入数据
m_List.AddString("凌日"); //插入数据
m_List.AddString("凌中天");
m_List.AddString("凌云");
m_List.AddString("凌壮志");
在列表框查找数据
m_List.SelectString(0,"凌云"); //查找数据
处理列表框控件的LBN_DBCLK事件
int pos = m_List.GetCurSel(); //获取当前选中项索引
CString str;
m_List.GetText(pos,str); //获取指定索引项的数据
m_Static.SetWindowText(str);
实现列举文件功能
m_List.ResetContent(); //删除所有数据
m_List.Dir(DDL_DIRECTORY|DDL_SYSTEM,"d://*.*"); //列举D盘文件目录
四:组合框控件(Combo Box)
组合框控件(Combo Box)结合了编辑框和列表框的特点,既可以进行输入,也可以在列表框组成部分选择一项。
1.创建基于CComboBox类的子窗口:
1)用工具箱创建(只能用于对话框上)Combo Box
2)用CComboBox类的Create函数创建
在.h文件中声明
CComboBox test;
在成员函数中调用Create函数
test.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,CRect(20,20,200,80),this,WM_USER+123);
2.通过Has a关系利用组合框控件实现“添加数据和插入数据”,“删除组合框数据”,“显示组合框当前数据”,“列举磁盘目录”
“添加数据和插入数据”
test.AddString("清明时节雨");
test.AddString("清明时节雨");
test.InsertString(0,"欲断魂");
“删除组合框数据”
test.ResetContent(); //删除数据
“显示组合框当前数据”
CString str;
m_Combo3.GetWindowText(str); //获得组合框控件当前显示数据
m_Button.SetWindowText(str);
“列举磁盘目录”
test.Dir(DDL_DRIVES|DDL_EXCLUSIVE,""); //列举磁盘目录
五:按钮控件(Button)
按钮控件(Button)可以接受用户的命令,通过单击或双击来执行某一条命令。
1.创建基于CButton类的子窗口:
1)用工具箱创建(只能用于对话框上)Button
2)用CButton类的Create函数创建
在.h文件中声明
CButton test;
在成员函数中调用Create函数(按钮 & 复选框 & 单选钮 & 分组框)
test.Create("JK",WS_CHILD|WS_VISIBLE|BS_NOTIFY|BS_PUSHBUTTON,CRect(20,20,200,80),this,WM_USER+123);
BS_PUSHBUTTON为按钮,BS_AUTOCHECKBOX 为复选框,BS_AUTORADIOBUTTON 为单选钮BS_GROUPBOX 为分组框
2.通过Has a关系利用按钮控件实现“按钮显示位图功能”,“按钮显示图标功能”,“按钮显示鼠标图象功能”,“选中按钮功能”
“按钮显示位图功能”
m_Button1.ModifyStyle(0,BS_BITMAP); //设置Bitmap属性
m_Button1.SetBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1))); //设置位图
“按钮显示图标功能”
m_Button2.ModifyStyle(0,BS_ICON); //设置Icon属性
m_Button2.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1)); //设置图标
“按钮显示鼠标图象功能”
m_Button3.ModifyStyle(0,BS_ICON); //设置Icon属性
m_Button3.SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1)); //设置鼠标图像
“选中按钮功能” 重点
CButton* m_button = (CButton*)this->GetDlgItem(IDC_CHECK1);
m_button->SetCheck(TRUE);
m_button = (CButton*)GetDlgItem(IDC_RADIO1);
m_button->SetCheck(TRUE);
关闭后,自己清理内存。
void CModalessTest::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}