第3讲Windows标准控件作为一般窗口,控件具有通用的窗口属性,并且可以使用ShowWindows()和MoveWindows()等窗口管理函数来显示或隐藏控件、改变控件的位置、尺寸以及其它操作。控件创建形式对话框中制定控件:如按钮控件调用CreateWindows()或CreateWindowsEx()函数创建必须指定控件的窗口类,这种窗口类要在应用程序中定义并注册,但更多的是使用系统预定义窗口类控件Windows图形用户界面的主要组成部分之一用户通过操作控件对象完成与应用程序之间的交互体现了Windows系统面向对象的特点控件以独立的子窗口或对话框两种形式存在1概述应用程序窗口可调用函数SendMessage向特定的子窗口发送消息,例如用户单击圆按钮时,可调用SendMessage向该圆按钮发送BM_SETCHECK消息,为该按钮设置选中符号,其形式为:SendMessage(hwndRadioButton,BM_SETCHECK,1,0);使用对话框控件时,可调用SendDlgItemMessage向指定的对话框控件发送消息,其形式为:SendDlgItemMessage(hdlg,ID,message,wParam,lParam);应用程序向控件发送的消息的字参数与长参数包含该消息的相关信息其含义取决于具体的控件消息1.EnableWindow函数(功能为激活或禁止窗口)BOOLEnableWindow(HWNDhwnd,BOOLbEnable)激活或禁止标识Ture:该窗口可接收输入False:禁止该窗口接收输入2.MoveWindow函数(移动或改变窗口的大小)BOOLMoveWindow(HWNDhwnd,intX,intY,intnWidth,intnHeight,BOOLbReprint//表明窗口移动后是否重画)8.2常用子窗口操作函数3.SetWindowText(设置窗口的标题或文本)BOOLSetWindowText(HWNDhwnd,LPCTSTRlpszString)设置的文本内容4.GetWindowText函数(获取指定窗口标题或文本)intGetWindowText(HWNDhwnd,LPSTRlpszString,intnMax)存放文本字符串的缓冲区最大可获取的字符串长度对于对话框按钮控件,可调用函数SetDlgItemText和GetDlgItemTextBOOLSetDlgItemText(HWNDhdlg,intID,LPCTSTRlpszString)IntGetDlgItemText(HWNDhdlg,intID,LPSTRlpszString,intnMax)该函数返回从指定的控件获取的文本字节数。5.DestroyWindow函数关闭窗口函数BOOLDestroyWindow(HWNDhwnd)如果关闭父窗口,则其中的子窗口同时被关闭按钮控件普通按钮圆按钮复选框按钮组框按钮在对话框定义中创建控件,其一般形式为:Control-type[Title,]ID,X,Y,nWidth,nHeight[,Style]控件样式控件的宽度与高度控件类型控件标题或内容控件起始坐标按钮控件的创建方式创建控件型的子窗口在对话框中定义控件创建并注册一个窗口类的实例创建并显示窗口实例控件类型说明PUSHBUTTON按钮控件DEFPUSHBUTTON默认按钮控件CHECKBOX复选框控件RADIOBUTTON圆按钮控件GROUPBOX组合框控件LTEXT左对齐静态控件8.3按钮控件的分类与创建按钮控件与应用程序之间的消息传递1.接收按钮控件消息当用户与控件交互时,控件向其父窗口发送WM_COMMAND消息。消息的wParam参数低字节包含控件的标识值(ID)高字节中包含控件向父窗口发出的通知代码2.向按钮控件发送消息调用函数SendMessage向按钮控件发出消息:SendMessage(hwnd,message,wParam,lParam);设置复选框和圆按钮的选中标志时字参数应取1:SendMessage(hwnd,BM_SETCHECK,1,0);取消选中标志时字参数应取0,其形式为:SendMessage(hwnd,BM_SETCHECK,0,0);SendMessage使用字参数确定同种消息中的不同动作对话框按钮控件,可用SendDlgItemMessage完成相同操作向控件子窗口发出的消息3.按钮控件示例【例1】创建如右上图所示的按钮控件系列,当单击每一个按钮后,就出现如右下图所示的响应。LRESULTCALLBACKWndProc(......){intX=50,Y=30;//控件起始坐标switch(message){caseWM_CREATE://通过响应WM_CREATE消息创建控件子窗口hwndPush=CreateWindow(lpszClassName1,//按钮子窗口这里是一个按钮,按我吧!,BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,X,Y,240,25,hwnd,(HMENU)IDB_PUSHBUTTON,hInst,NULL);hwndDefPush=CreateWindow(lpszClassName1,//默认按钮子窗口这是缺省按钮,按下试试看!,BS_DEFPUSHBUTTON|WS_CHILD|WS_VISIBLE,X,Y+30,240,25,hwnd,(HMENU)IDB_DEFPUSHBUTTON,hInst,NULL);//创建自动圆按钮子窗口hwndAutoRadio=CreateWindow(lpszClassName1,自动圆形按钮,看看有何区别?,BS_AUTORADIOBUTTON|WS_CHILD|WS_VISIBLE,X,Y+90,240,25,hwnd,(HMENU)IDB_AUTORADIOBUTTON,hInst,NULL);hwndRadio=CreateWindow(lpszClassName1,//圆按钮控件子窗口圆形按钮,你喜欢吗?,BS_RADIOBUTTON|WS_CHILD|WS_VISIBLE,X,Y+60,240,25,hwnd,(HMENU)IDB_RADIOBUTTON,hInst,NULL);//创建自动复选框控件子窗口hwndAutoCheckBox=CreateWindow(lpszClassName1,自动复选框,你会用吗?,BS_AUTOCHECKBOX|WS_CHILD|WS_VISIBLE,X,Y+150,240,25,hwnd,(HMENU)IDB_AUTOCHECKBOX,hInst,NULL);//创建复选框控件子窗口hwndCheckBox=CreateWindow(lpszClassName1,复选框,BS_CHECKBOX|WS_CHILD|WS_VISIBLE,X,Y+120,240,25,hwnd,(HMENU)IDB_CHECKBOX,hInst,NULL);//处理控件消息caseWM_COMMAND:switch(LOWORD(wParam)){caseIDB_PUSHBUTTON://当用户单击按钮时,改变按钮文本SetWindowText(hwndPush,你已按下了按钮!);break;caseIDB_DEFPUSHBUTTON://当用户单击按钮时,改变按钮文本SetWindowText(hwndDefPush,按钮已被按下);break;//创建组框控件子窗口hwndGroupBox=CreateWindow(lpszClassName1,组框,BS_GROUPBOX|WS_CHILD|WS_VISIBLE,X+290,Y+30,100,140,hwnd,(HMENU)IDB_GROUPBOX,hInst,NULL);break;caseIDB_RADIOBUTTON://当用户单击圆按钮时,设置按钮为选中状态SendMessage(hwndRadio,BM_SETCHECK,1,0);break;caseIDB_AUTORADIOBUTTON:break;caseIDB_CHECKBOX://根据复选框状态设置复选框if(nCheckBoxSt==0){SendMessage(hwndCheckBox,BM_SETCHECK,1,0);nCheckBoxSt=1;}else//如果当前为非选中状态,则设置为选中状态{SendMessage(hwndCheckBox,BM_SETCHECK,0,0);nCheckBoxSt=0;}break;caseIDB_AUTOCHECKBOX:break;caseIDB_GROUPBOX:break;}break;caseWM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}本程序运行时将在主窗口用户区的中央显示一个普通按钮,上面写有“启动一个对话框”,按下按钮弹出一个对话框,对话框含有三个成组框,其中分别是圆按钮、自动圆按钮和复选框,此外,还有一个普通按钮和一个默认按钮。LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){RECTrect;switch(message){caseWM_CREATE://通过响应WM_CREATE消息创建控件子窗口GetClientRect(hwnd,&rect);//创建按钮子窗口hwndPush=CreateWindow(BUTTON,启动一个对话框,BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,(rect.right-rect.left)/2-60,(rect.bottom-rect.top)/2-15,120,30,hwnd,(HMENU)IDB_PUSHBUTTON,hInst,NULL);break;caseWM_COMMAND://处理控件消息if(LOWORD(wParam)==IDB_PUSHBUTTON){DialogBox(hInst,Button,hwnd,DialogProc);EnableWindow(hwndPush,FALSE);SetWindowText(hwndPush,不能再使用);}break;caseWM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}BOOLCALLBACKDialogProc(HWNDhdlg,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_COMMAND:switch(LOWORD(wParam)){caseIDOK:EndDialog(hdlg,0);return1;caseIDCANCEL:EndDialog(hdlg,0);return1;caseIDC_RADIO1:if(HIWORD(wParam)==BN_CLICKED){SendDlgItemMessage(hdlg,IDC_RADIO1,BM_SETCHECK,1,0);SendDlgItemMessage(hdlg,IDC_RADIO2,BM_SETCHECK,0,0);return1;}break;caseIDC_RADIO2:if(HIWORD(wParam)==BN_CLICKED){SendDlgItemMessage(hdlg,IDC_RADIO1,BM_SETCHECK,0,0);SendDlgItemMessage(hdlg,IDC_RADIO2,BM_SETCHECK,1,0);return1;}break;}break;