创建 CStatic* m_PicArray[500]; for(int i=0;i<500; i++) { m_PicArray[i]= new CStatic(); m_PicArray[i]->Create(NULL,WS_VISIBLE|WS_CHILD,CRect(40,70+110*i,140,170+110*i),this,1001+i); } m_PicArray[j]->DestroyWindow(); delete m_PicArray[j];
响应 如果是动态创建的按钮,我觉得用 范围消息响应来处理还是比较方便的,一类消息可以放到一块处理,根据空间的ID来区分。 例如处理一组动态创建的按钮的响应事件 定义消息: ON_CONTROL_RANGE(BN_CLICKED,IDO_BTN0,IDO_BTN10,OnBnClickBtn) 响应消息 ::OnBnClickBtn(UINT CXID) { swich(CXID) { case IDO_BTN0: .... break; case IDO_BTN1: ... break; } } 单选钮和复选框都可以响应BN_CLICKED消息,如果一组中有多个单选钮,分别创建消息处理函数就比较麻烦了,利用MFC的消息映射宏ON_CONTROL_RANGE可以避免这种麻烦,该映射宏把多个ID连续的控件发出的消息映射到同一个处理函数上,这样,我们只要编写一个消息处理函数就可以对一组单选钮的BN_CLICKED消息作出响应,ClassWizard不支持该宏,必须手工创建。 ON_CONTROL_RANGE消息映射宏的第一个参数是控件消息码,第二和第三个参数分别指明了一组连续的控件ID中的头一个和最后一个ID,最后一个参数是消息处理函数名。注意,起始、 终止ID号必须是连续的,如果不能确定该组控件的ID是否是连续,请用View->Resource Symbols…命令检查控件的ID值,如果发现两个ID是不连续的,读者可以改变对ID的定义值使之连续,但要注意改动后的值不要与别的ID值发生冲突。 在BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP之间 //}}AFX_MSG_MAP之后加入 ON_CONTROL_RANGE(BN_CLICKED,IDC_CHK1,IDC_CHK2,OnCHKClicked)然后在对话框类的头文件的AFX_MSG 块中声明消息处理函数, …… //{{AFX_MSG(CMyView) …… //}}AFX_MSG afx_msg void OnCHKClicked (UINT nCmdID); DECLARE_MESSAGE_MAP() 最后,在对话框类所在CPP文件的最后插入消息处理函数,如下所示:CRadioAndCheckButtonDialog:: OnCHKClicked, void CRadioAndCheckButtonDialog:: OnCHKClicked (UINT nCmdID) { …… switch(nID) { case IDC_CHK1: AfxMessageBox("IDC_CHK1"); break; case IDC_CHK2: AfxMessageBox("IDC_CHK2"); break; …… } 6、使用IsDlgButtonChecked 函数判断单选钮或复选框是否被选中逆风编程技术 CWnd::IsDlgButtonChecked函数,用来判断单选按钮或检查框是否被选择,该函数的声明为UINT IsDlgButtonChecked(int nIDButton) const;参数nIDButton为按钮的ID。若按钮被选择,则函数返回1,否则返回0,若按钮处于不确定状态,则返回值为2。…… if(IsDlgButtonChecked(IDC_CHK1)) 网上SDK编程的资料真难找,想动态加载控件,可是找不到相关资料。自己去图书馆才查到一点信息,发出来大家分享,希望给同是初学者的朋友一点帮助。 其实用于窗口的函数大多可用在控件上,只要把控件当成窗口来处理就可以了。 创建控件的代码如下: HWND ctrl = ::CreateWindowA("button",//控件类别 "动态",//控件文本 WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,//控件样式 0, //位置 0,//位置 100, //尺寸 20,//尺寸 hDlg,//父窗口句柄 (HMENU)50,//可以在这指定控件ID g_hInstance, NULL); |
可以参照这种方式来操纵控件: SendMessage(hwndButton, //控件句柄 BM_CLICK, //操纵方式,这里让按钮执行点击操作 NULL,NULL); //有的操纵方式要通过这两个形参传递参数 SendDlgItemMessage(hDlg, //父窗口句柄 ID_BUTTON, //控件ID BM_CLICK, //操纵方式,这里让按钮执行点击操作 NULL, NULL); //有的操纵方式要通过这两个形参传递参数 |
用到的宏定义如 BM_CLICK 可以在 winuser.h 文件中找到。 控件类别介绍如下: 子窗口类型 | 类名 | 描述 | 按钮 | Button | 创建按键按钮、单选按钮和三态按钮。 | 静态文本框 | Static | 显示用户不可直接编辑的文本,一般为标题。 | 滚动条 | ScrollBar | 滚动视图。 | 列表框 | ListBox | 显示具有多个子项的列表框。 | 编辑框 | Edit | 允许用户直接编辑文本。 | 组合框 | ComboBox | 与列表框类似,但多一个编辑区域。 |
button 各种按钮,可以通过控件样式来指定按钮样式 按钮风格 | 描述 | BS_AUTOCHECKBOX | 创建一个自动选中的复选按钮,只有复选按钮在复选框里改设置值才起作用。 | BS_AUTORADIOBUTTON | 创建一个自动选中的单选按钮。 | BS_AUTO3STATE | 创建自动的三态按钮。 | BS_CHECKBOX | 创建一个复选按钮。 | BS_DEFPUSHBUTTON | 创建默认选中的按键按钮,当用户按下Enter键时,则表示选择该按键按钮。 | BS_GROUPBOX | 创建按钮组合框,当创建一组单选按钮或者复选按钮时,首先需要创建该按钮组合框。 | BS_LEFTTEXT | 创建单选按钮或复选按钮时,指定按钮名称的文本出现在左边。 | BS_OWNERDRAW | 创建自画按钮,必须先创建图形资源。 | BS_PUSHBUTTON | 创建按键按钮。 | BS_RADIOBUTTON | 创建单选按钮。 | BS_3STATE | 创建三态按钮 |
按钮有自己特殊的消息类型。当用户选择了按钮时,它将向父窗口发送WM_COMMAND消息,这些通知消息包含在wParam的高位字节中。 按钮的通知代码如表所示。 消息取值 | 描述 | BN_CLICKED | 表示用户单击了该按钮 | BN_DOUBLECLICKED | 表示用户双击了该按钮 | BN_HILITE | 表示按钮显亮 | BN_UNHlLlTE | 取消按钮显亮 | BN_PAINT | 绘制按钮 | BN_DISABLE | 表示按钮禁活 | BN_PUSHED | 用户选中该按钮并按下了Enter键 | BN_SETFOCUS | 输入焦点转移到该按钮 |
static 风格取值 | 描述 | SS_LEFT | 左对齐 | SS_CENTER | 居中 | SS_RIGHT | 右对齐 | SS_GRAYRECT | 显示一个灰色的矩形 | SS_BITMAP | 显示位图 | SS_ICON | 显示图标 | SS_CENTERIMAGE | 图象居中显示 |
它既不接收鼠标或键盘输入,也不向父窗口发送WM_COMMAND消息。 scrollbar 创建滚动条控件,它们是能在父窗口的显示区域的任何地方出现的子窗口。 可以使用两个滚动条样式SBS_VERT和SBS_HORZ中的一个来建立子窗口滚动条控件。 滚动条的样式风格如表所示。 风格取值 | 描述 | SBS_BOTTOMALIGN | 创建水平滚动条,滚动条在窗口的底端 | SBS_HORZ | 创建水平滚动条 | SBS_LEFTALIGN | 创建一个靠左对齐的垂直滚动条 | SBS_mGHTALIGN | 创建一个靠右对齐的垂直滚动条 | SBS_SIZEBOX | 创建一个对话框式的滚动条 | SBS_TOPALIGN | 适用于水平滚动条,顶端与指定的矩形对齐 | SBS_VERT | 创建垂直滚动条 |
滚动条的消息类型如表所示。 消息取值 | 描述 | SBM_ENABLE ARROWS | 激活或者关闭滚动条的滚动按钮 | SBM_GETPOS | 得到滚动条当前滚动按钮的位置 | SBM_GETRANGE | 得到滚动条当前设置的范围 | SBM_GETSCROLLINFO | 得到滚动条的相关信息,包括位置、大小等 | SBM_SETPOS | 设置滚动条滚动按钮的位置 | SBM_SETRANGE | 设置范围 | SBM_SETRANGEREDRAW | 当需要重画滚动条时发送设置最大和最小值位置的消息 | SBM_SETSCROLLINFO | 设置滚动条属性 | WM_CTLCOLORSCROLLBAR | 当滚动条改变时向父窗口发送设置背景颜色的消息 | WM_HSCROLL | 水平滚动条变化 | WM_VSCROLL | 垂直滚动条变化 |
listbox 创建列表框,它允许用户从多个对象中选择一项或多项,这些对象可以是文本、文件和位图等。 当列表框的项不能全部显示出来时,可以用滚动条来滚动显示。 可以指定如下式样。 风格取值 | 描述 | LBS_EXTENDEDSEL | 能通过Shift键或者鼠标进行多选 | LBS_HASSTRINGS | 可以用GetText函数得到列表框里选项的字符串 | LBS_MULTICOLUMN | 指定列表框以多列形式显示内容 | LBS_MULTIPLESEL | 用户可以选择多个项 | LBS_NOINTEGRALHEIGHT | 当应用程序创建列表框时,列表框的大小由系统指定 | LBS_NOREDRAW | 列表框不响应用户的修改,可以通过发送WM_REDRAW 来取消该设置 | LBS_NOTIFY | 让主窗口接收列表框的任何改变的消息 | LBS_OWNERDRAWFIXED | 主窗口负责列表框的重画,列表框里每项的高度相同 | LBS_0WNERDRAWVARIABLE | 主窗口负责列表框的重画,列表框里每项的高度可以变化 | LBS_SORT | 按各项名称的字母排序 | LBS_STANDARD | 等同于LBS_SORT和LBS_NOTIFY | LBS_USETABSTOPS | 允许用户使用Tab键在各项中切换 | LBS_WANTKEYBOARDINPUT | 输入焦点在列表框时,任何键盘输入都会向父窗口发送WM_VKEYTOITEM或者WM_CHARTOITEM消息 | LBS_DISABLENOSCROLI | 当列表框的项不够时,垂直滚动条禁活:没有该属性时,滚动条隐藏 |
当用户对列表框进行了操作时,就会向主窗口发送一条消息。消息总是通过WM_COMMAND的形式发送给主窗口的。 wParam的低位字节表示列表框的标识符,高位字节表示消息的类型,lParam表示主窗口句柄。 列表框的消息类型如表所示。 消息取值 | 描述 | LB_DELETESTRING | 删除指定的选项 | LB_ADDFILE | 向列表框里增加一个文件(包括目录) | LB_FINDSTRING | 在列表框里查找指定的项 | LB_FINDSTRlNGEXACT | 精确查找指定的项 | LB_GETCOUNT | 得到列表框里项的数目 | LB_GETCURSEL | 返回当前被选中选项的序号 | LB_GETSEL | 得到被选项的状态,如果出错,则返回零值 | LB_GETSELCOUNT | 得到被选中的个数 | LB_GETTEXT | 返回选中的文本,返回值为字符串长度 | LB_GETTEXTLEN | 返回字符串长度 | LB_INITSTORAGE | 向列表框增加项之前存储原来的内容 | LB_INSERTSTRING | 向列表框增加一项,但不重新排序 | LB_ITEMFROMPOINT | 返回离指定点最近项的序号 | LB_RESETCONTENT | 清除列表框里所有的项 | LB_SELECTSTRING | 寻找指定的项 | LB_SELITEMRANGE | 指定选择的范围 | LB_SELITEMRANGEEX | 选定或者删除指定的项 | LB_SETCOLUMNWIDTH | 设置列的宽度 | LB_SETCOUNT | 设置列表框里项的最大数目 | LB_SETCURSEL | 选中指定的项 | LBN_DBLCLK | 发送用户双击的消息 | LBN_ERRSPACE | 发送内存空间不够的消息 | LBN_KILLFOCUS | 当列表框失去焦点时发送该消息 | LBN_SELCANCEL | 当用户取消选择时发送该消息 | LBN_SELCHANGE | 当用户选择改变时发送该消息 | LBN_SETFOCUS | 当输入焦点转移到列表框时发送该消息 | WM_CTLCOLORLISTBOX | 在列表框重画时向父窗口发送该消息 | WM_DELETEITEM | 删除选项 | WM_VKEYTOITEM | 输入焦点在列表框里,用户按键时发送该消息 |
combobox 创建组合框。组合框兼具编辑框和列表框的功能,既能编辑选项,又能显示多个项。 可以指定如下式样。 风格取值 | 描述 | CBS_AUTOHSCROLL | 当用户在编辑区域键入字符时,列表框自动滚动,使当前项的名称与键入的字符排序相同 | CBS_DROPDOWN | 创建一个下拉式组合框 | CBS_DROPDOWNLIST | 创建一个下拉式列表框 | CBS_HASSTRINGS | 让应用程序能够使用GetText取得组合框里的文本 | CBS_OEMCONVERT | 把输入的文本将从ANSI码转换成OEM码,然后又转换成ANSI码;这样的目的是保证函数AnsiToOem的正确调用 | CBS_OWNERDRAWFIXED | 父窗口负责重画组合框里的各项,并使各项的高度一致 | CBS_OWNERDRAWVARIABLE | 父窗口负责重画组合框里的各项,各项的高度不一致 | CBS_SIMPLE | 组合框显示所有的项,当前的选项在编辑区域中显示 | CBS_SORT | 自动排序 | CBS_DISABLENOSCROLL | 组合框有垂直滚动条,当组合框的项不足时,滚动条禁活;没有该风格,则滚动条隐藏 | CBS_NOINTEGRALHEIGHT | 指定组合框的大小由程序精确控制,通常组合框的大小由组合框里项的数目决定 |
应用程序的父窗口主要通过 WM_COMMAND消息与组合框通信,应用程序可以用CB_FINDSTRINGEXACT搜索指定的项,还可以发送CB_DELETESTRING删除指定的项,当需要删除所有的项时,发送消息CB_RESETCONTENT即可。 组合框的编辑区域用来显示当前选中的项或者编辑组合框里没有的项。可以用CB_LIMITTEXT来限制输入文本的大小;为了获得编辑区域的文本,可发送CB_GETTEXT消息,这样就把文本复制到指定的字符串中,当需要设置编辑区域的文本时,只需要发送CB_SETTEXT消息。 Windows API为组合框提供了文件显示和搜索的功能,它们主要通过函数DlgDirListComboBox和DlgDirSelectComboBox来实现。
消息取值 | 描 述 | CB_ADDSTRlNG | 增加一项 | CB_DELETESTRING | 删除指定的项 | CB_DIR | 发送搜索目录的消息 | CB_FINDSTRING | 搜索指定的项 | CB_FINDSTRINGEXACT | 精确搜索指定的项 | CB_GETCOUNT | 得到组合框中项的数目 | CB_GETCURSEL | 得到当前选中项的序号 | CB_GETEDITSEL | 得到编辑区域选中的文本 | CB_GETLBTEXT | 得到编辑区域的文本 | CB_GETLBTEXTLEN | 得到编辑区域中文本的长度 | CB_LIMITTEXT | 发送限制编辑区域文本的消息 | CB_RESETCONTENT | 删除所有的项 | CB_SELECTSTRING | 选中指定的字符串 | CB_SETCURSEL | 将光标设置在指定的位置 | CB_SETDROPPEDWIDTH | 设置下拉的宽度 | CB_SETEDITSEL | 选取编辑区域的文本 | CBN_CLOSEUP | 关闭组合框 | CBN_DBLCLK | 发送用户双击组合框中项的消息 | CBN_DROPDOWN | 下拉时发送消息 | CBN_EDITCHANGE | 发送编辑区域改变的消息 | CBN_EDITUPDATE | 发送编辑区域改变的消息,但在更新之前发送 | CBN_ERRSPACE | 发送内存不够的消息 | CBN_KILLFOCUS | 当组合框失去输入焦点时发送该消息 | CBN_SETFOCUS | 设置输入焦点 |
edit 创建一个编辑框控件,可以指定如下式样。 风格取值 | 描述 | ES_AUTOHSCROLL | 自动增加水平滚动条 | ES_AUTOVSCROLL | 当按下Enter键后,自动切换到下一页 | ES_CENTER | 文本居中 | ES_LEFT | 文本左对齐 | ES_LOWERCASE | 把所有的字母都小写 | ES_MULTILINE | 建立多行文本编辑框 | ES_NOHIDESEL | 当失去输入焦点时,选中的文本将隐藏 | ES_OEMCONVERT | 把输入的文本从ANSI码转换成OEM码,然后又转换成ANSI码,这样的目的是保证函数AnsiToOem的正确调用 | ES_PASSWORD | 控制编辑框作为密码文本框的字符形式 | ES_RIGHT | 文本右对齐 | ES_UPPERCASE | 将所有的字符转换成大写字符 | ES_READONLY | 文本只读 |
编辑框的操作以 WM_COMMAND的形式发送给父窗口。消息的有关信息仍然包含在参数wParam和IParam中。 wParam的低位字节包含编辑框的标识符,高位字节包含通知消息的类型,lParam包含编辑框的句柄。 编辑框的通知消息如表所示。 消息取值 | 作用 | EM_CANUNDO | 检验编辑框是否可以执行取消操作 | EM_GETHANDLE | 得到内存区文本的句柄,不适用于单行文本编辑框 | EM_GETLIMITTEXT | 得到文本限制的信息 | EM_GETLINE | 把指定行文本拷贝到字符串指针中 | EM_GETLINECOUNT | 得到编辑框的行的数目 | EM_GETMARGINS | 得到编辑框的边框宽度 | EM_GETMODIFY | 确认编辑框是否被修改 | EM_GETPASSWORDCHAR | 得到密码编辑框设置的密码字符 | EM_GETRECT | 得到文本矩形区域 | EM_GETSEL | 得到选中的文本 | EM_GETTHUMB | 得到编辑框滚动条的位置 | EM_GETWORDBREAKPROC | 得到折行函数的地址 | EM_LIMITTEXT | 设置用户能够输入的字符数目 | EM_LINEINDEX | 得到字符所在的行序号 | EM_LINELENGTH | 得到行的长度 | EM_LINESCROLL | 使文本滚动 | EM_SCROLL | 在多行编辑框中垂直滚动文本 | EM_SCROLLCARET | 把插入符移到编辑框的可见区 | EM_SETHANDLE | 给文本内存缓冲区设置句柄 | EM_SETPASSWORDCHAR | 设置密码字符 | EM_SETTABSTOPS | 在多行编辑框里设置制表符停止位置,但单行编辑框没有该消息 | EM_UNDO | 取消上一次操作 | EN_CHANGE | 发送编辑框改变的消息 | EN_ERRSPACE | 当文本内存不够时,发送该消息 | EN_KILLFOCUS | 当编辑框失去输入焦点时发送该消息 | EN_MAXTEXT | 当输入的文本超过最大允许数目时发送该消息 | EN_SETFOCUS | 设置输入焦点 | EN_UPDATE | 当编辑框被改变时发送该消息,与EN CHANGE不同,它在编辑框重画前发送 | WM_COPY | 拷贝消息 | WM_CTLCOLOREDIT | 只读编辑框重画时向父窗口发送该消息 | WM_CUT | 剪切消息 | WM_PASTE | 粘贴消息 | WM_UNDO | 取消上一次操作消息
|
|