面向对象与可视化程序设计第七讲.ppt
《面向对象与可视化程序设计第七讲.ppt》由会员分享,可在线阅读,更多相关《面向对象与可视化程序设计第七讲.ppt(61页珍藏版)》请在三一办公上搜索。
1、1,7.1概述作为一般窗口,控件具有通用的窗口属性,并且可以使用ShowWindows()和MoveWindows()等窗口管理函数来显示或隐藏控件、改变控件的位置、尺寸以及其它操作。,控件以独立的子窗口或对话框两种形式存在,第7讲 Windows 标准控件,2,应用程序窗口可调用函数SendMessage向特定的子窗口发送消息,例如用户单击圆按钮时,可调用SendMessage向该圆按钮发送BM_SETCHECK消息,为该按钮设置选中符号,其形式为:SendMessage(hwndRadioButton,BM_SETCHECK,1,0);使用对话框控件时,可调用SendDlgItemMess
2、age向指定的对话框控件发送消息,其形式为:SendDlgItemMessage(hdlg,ID,message,wParam,lParam);,应用程序向控件发送的消息的字参数与长参数包含该消息的相关信息其含义取决于具体的控件消息,3,7.2 常用子窗口操作函数,4,5,7.3 按钮控件的分类与创建,6,按钮控件与应用程序之间的消息传递,7,7.按钮控件示例,【例7-1】创建如右上图所示的按钮控件系列,当单击每一个按钮后,就出现如右下图所示的响应。,8,LRESULT CALLBACK WndProc(.)int X=50,Y=30;/控件起始坐标 switch(message)case W
3、M_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)I
4、DB_DEFPUSHBUTTON,hInst,NULL);,9,/创建自动圆按钮子窗口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,2
5、40,25,hwnd,(HMENU)IDB_RADIOBUTTON,hInst,NULL);,10,/创建自动复选框控件子窗口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
6、,X,Y+120,240,25,hwnd,(HMENU)IDB_CHECKBOX,hInst,NULL);,11,/处理控件消息case WM_COMMAND:switch(LOWORD(wParam)case IDB_PUSHBUTTON:/当用户单击按钮时,改变按钮文本 SetWindowText(hwndPush,你已按下了按钮!);break;case IDB_DEFPUSHBUTTON:/当用户单击按钮时,改变按钮文本 SetWindowText(hwndDefPush,按钮已被按下);break;,/创建组框控件子窗口hwndGroupBox=CreateWindow(lpszCl
7、assName1,组框,BS_GROUPBOX|WS_CHILD|WS_VISIBLE,X+290,Y+30,100,140,hwnd,(HMENU)IDB_GROUPBOX,hInst,NULL);break;,12,case IDB_RADIOBUTTON:/当用户单击圆按钮时,设置按钮为选中状态 SendMessage(hwndRadio,BM_SETCHECK,1,0);break;case IDB_AUTORADIOBUTTON:break;case IDB_CHECKBOX:/根据复选框状态设置复选框 if(nCheckBoxSt=0)SendMessage(hwndCheckBo
8、x,BM_SETCHECK,1,0);nCheckBoxSt=1;else/如果当前为非选中状态,则设置为选中状态 SendMessage(hwndCheckBox,BM_SETCHECK,0,0);nCheckBoxSt=0;break;case IDB_AUTOCHECKBOX:break;case IDB_GROUPBOX:break;break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,message,wParam,lParam);return 0;,13,本程序运行时将在主窗口
9、用户区的中央显示一个普通按钮,上面写有“启动一个对话框”,按下按钮弹出一个对话框,对话框含有三个成组框,其中分别是圆按钮、自动圆按钮和复选框,此外,还有一个普通按钮和一个缺省按钮。,14,LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)RECT rect;switch(message)case WM_CREATE:/通过响应WM_CREATE消息创建控件子窗口 GetClientRect(hwnd,15,BOOL CALLBACK DialogProc(HWND hdlg,UINT mess
10、age,WPARAM wParam,LPARAM lParam)switch(message)case WM_COMMAND:switch(LOWORD(wParam)case IDOK:EndDialog(hdlg,0);return 1;case IDCANCEL:EndDialog(hdlg,0);return 1;case IDC_RADIO1:if(HIWORD(wParam)=BN_CLICKED)SendDlgItemMessage(hdlg,IDC_RADIO1,BM_SETCHECK,1,0);SendDlgItemMessage(hdlg,IDC_RADIO2,BM_SET
11、CHECK,0,0);return 1;break;case IDC_RADIO2:if(HIWORD(wParam)=BN_CLICKED)SendDlgItemMessage(hdlg,IDC_RADIO1,BM_SETCHECK,0,0);SendDlgItemMessage(hdlg,IDC_RADIO2,BM_SETCHECK,1,0);return 1;break;break;case WM_CLOSE:EndDialog(hdlg,0);return 1;return 0;,16,7.4.1 滚动条控件的功能特点与分类,滚动条控件最直接的功能是当应用程序显示的内容超过窗口的范围时
12、,用户可通过拖动滚动条遍历整个窗口内容。滚动条在功能上分为垂直与水平滚动条,分别实现窗口内容纵向和横向的滚动。,7.4 滚动条控件,17,8.4.2 滚动条控件的创建,SB_BOTTOM到滚动条最底端或最右端SB_RIGHT滚动到右边SB_LEFT滚动到左边SB_PAGEUP向上滚动一页SB_PAGEDOWN 向下滚动一页,18,8.4.3 常用滚动条操作函数,SetScrollRange:设置滚动条的滚动范围,int SetScrollRange(HWND hwnd,int nBar,/滚动条特性标识 int nMaxPos,/滚动条最大滚动位置 int nMinPos,/滚动条最小滚动位置
13、 BOOL bRedraw)/当滚动条改变时是否重绘;非0表示重绘,SB_CTL 为控件滚动条 SB_HORZ 为窗口水平滚动条 SB_VERT 为窗口垂直滚动条,SetScrollPos:设置滚动块的位置,int SetScrollPos(HWND hwnd,int nBar,/滚动条的特性标识,同SetScrollRange函数 int nPos,/滚动块的位置 BOOL bRedraw/意义同SetScrollRange函数),19,20,7.4.4 滚动控件示例,【例8-2】本例要求创建一个带滚动条的颜色框,在颜色框中,通过拉动滚动条,使其显示的区域产生变化,同时,可以通过颜色的设置,
14、来改变颜色框的颜色,21,LRESULT APIENTRY MainWndProc(.)HDC hDC;HBRUSH hBrush;static HWND hWndScrollBar;static SCROLLINFO stScrollInfo;static int nRectWidth;switch(message)case WM_CREATE:hWndScrollBar=CreateWindowEx(0L,SCROLLBAR,(LPSTR)NULL,WS_CHILD|SBS_VERT,10,30-GetSystemMetrics(SM_CYVSCROLL),19,100+2*GetSyst
15、emMetrics(SM_CYVSCROLL),hWnd,(HMENU)NULL,hInst,(LPVOID)NULL);stScrollInfo.cbSize=sizeof(SCROLLINFO);stScrollInfo.fMask=SIF_POS|SIF_RANGE|SIF_PAGE;stScrollInfo.nMin=1;stScrollInfo.nMax=100;stScrollInfo.nPos=1;stScrollInfo.nPage=10;/设置滚动条控件的各方面的特性参数。SetScrollInfo(hWndScrollBar,SB_CTL,制作垂直滚动条,滚动条结构,设置为
16、滚动条控件,22,1.case WM_VSCROLL:2.if(HWND)lParam!=hWndScrollBar)break;3.switch(LOWORD(wParam)4.case SB_LINEUP:nRectWidth+=1;break;5.case SB_LINEDOWN:nRectWidth-=1;break;6.case SB_PAGEUP:nRectWidth+=10;break;7.case SB_PAGEDOWN:nRectWidth-=10;break;8.case SB_THUMBPOSITION:nRectWidth=101-HIWORD(wParam);brea
17、k;9.default:return(DefWindowProc(hWnd,message,wParam,lParam);10.if(nRectWidth100)nRectWidth=100;12.stScrollInfo.fMask=SIF_POS;13.stScrollInfo.nPos=101-nRectWidth;14.SetScrollInfo(hWndScrollBar,SB_CTL,23,1.case WM_COMMAND:2.switch(LOWORD(wParam)3.case IDM_RGB:4.DialogBox(hInst,RGBDlg,hWnd,(DLGPROC)RG
18、BDlgProc);break;5.case IDM_DRAW:6.hDC=GetDC(hWnd);7.hBrush=CreateSolidBrush(RGB(255,255,255);8.SelectObject(hDC,hBrush);9.Rectangle(hDC,30,30,130,130);10.hBrush=CreateSolidBrush(RGB(crRGB0,crRGB1,crRGB2);11.SelectObject(hDC,hBrush);12.Rectangle(hDC,30,130-nRectWidth,30+nRectWidth,130);13.ReleaseDC(h
19、Wnd,hDC);14.break;15.case IDM_EXIT:16.PostQuitMessage(0);break;17.case IDM_ABOUT:18.DialogBox(hInst,AboutBox,hWnd,(DLGPROC)About);break;19.default:20.return(DefWindowProc(hWnd,message,wParam,lParam);21.22.break;23.case WM_DESTROY:PostQuitMessage(0);break;24.default:return(DefWindowProc(hWnd,message,
20、wParam,lParam);25.26.return(0);27.,24,1.BOOL APIENTRY RGBDlgProc(.)2.3.static int CurrentVal3,PrevVal3;4.static HWND hwScroll3;5.char szString10;6.int i;7.switch(message)8.9.case WM_INITDIALOG:/分别设置滚动条的范围和初始位置。10.for(i=0;i3;i+)11.12.CurrentVali=crRGBi;13.PrevVali=crRGBi;14.hwScrolli=GetDlgItem(hDlg,
21、IDC_RED+i);15.SetScrollRange(hwScrolli,SB_CTL,0,255,FALSE);16.SetScrollPos(hwScrolli,SB_CTL,CurrentVali,TRUE);17.SetDlgItemText(hDlg,IDC_VALRED+i,itoa(CurrentVali,szString,10);18.19.SetFocus(hwScroll0);20.break;,25,1./处理滚动条通知消息2.case WM_HSCROLL:3.i=0;4.while(hwScrolli!=(HWND)lParam)i+;5.switch(LOWOR
22、D(wParam)6.case SB_LINEDOWN:7.CurrentVali+;8.if(CurrentVali255)CurrentVali=255;9.break;10.case SB_LINEUP:11.CurrentVali-;12.if(CurrentVali0)CurrentVali=0;13.break;case SB_PAGEDOWN:CurrentVali+=(255-CurrentVali)/2;15.break;16.case SB_PAGEUP:CurrentVali-=CurrentVali/2;break;17.case SB_THUMBTRACK:Curre
23、ntVali=HIWORD(wParam);break;18.case SB_TOP:CurrentVali=0;break;19.case SB_BOTTOM:CurrentVali=255;break;,26,/设定滚动条的位置及其对应的文字1.SetScrollPos(hwScrolli,SB_CTL,CurrentVali,TRUE);2.SetDlgItemText(hDlg,IDC_VALRED+i,itoa(CurrentVali,szString,10);3.crRGBi=CurrentVali;4.SendMessage(hWndMain,WM_COMMAND,IDM_DRA
24、W,0L);5.break;6.case WM_COMMAND:7.switch(wParam)8.case IDOK:9.for(i=0;i3;i+)10.crRGBi=CurrentVali;11.EndDialog(hDlg,TRUE);return(TRUE);12.case IDCANCEL:13.for(i=0;i3;i+)14.crRGBi=CurrentVali;15.EndDialog(hDlg,TRUE);return(TRUE);16.17.break;18.19.return(FALSE);20.,27,BOOL APIENTRY About(HWND hDlg,UIN
25、T message,WPARAM wParam,LPARAM lParam)switch(message)case WM_INITDIALOG:return(TRUE);case WM_COMMAND:if(LOWORD(wParam)=IDOK|LOWORD(wParam)=IDCANCEL)EndDialog(hDlg,TRUE);return(TRUE);break;return(FALSE);,28,【例7-2】创建一个水平滚动条控件,用这个控件来控制字体的大小,字体大小由50到100线性变化;同时创建一个垂直滚动条,用此滚动条来控制字体的颜色,颜色由RGB(0,0,255)到RGB(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 可视化 程序设计 第七

链接地址:https://www.31ppt.com/p-6435940.html