MFC子对话框及MFC通用控件


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.创建非模态对话框的资源与类。用普通的方法创建一个普通对话框的资源与类。比如对话框的资源IDIDD_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;































































}

你可能感兴趣的:(MFC子对话框及MFC通用控件)