创建子窗口可用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);