windows程序设计(C语言版)第9章-子视窗控制项

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

ProgrammingWindows程式开发设计指南(Windows95程序设计第五版)第327页第九章子视窗控制项回忆第七章的CHECKER程式。这些程式显示了矩形网格。当您在一个矩形中按下滑鼠按键时,该程式就画一个x;如果您再按一次滑鼠按键,那么x就消失。虽然这个程式的CHECKER1和CHECKER2版本只使用一个主视窗,但CHECKER3版本却为每个矩形使用一个子视窗。这些矩形由一个叫做ChildProc的独立视窗讯息处理程式维护。如果有必要,无论矩形是否被选中,都可以给ChildProc增加一种向其父视窗讯息处理程式(WndProc)发送讯息的手段。通过呼叫GetParent,子视窗讯息处理程式能确定其父视窗的视窗代号:hwndParent=GetParent(hwnd);其中,hwnd是子视窗的视窗代号。它可以向其父视窗讯息处理程式发送讯息:SendMessage(hwndParent,message,wParam,lParam);那么message应该设定为什么呢?您可以随意地设定,数值大小可以与WM_USER相同或更大,这些数字代表和预先定义的WM_讯息不冲突的讯息。也许对这个讯息,子视窗可以将wParam设定为它的子视窗ID。如果在该子视窗单击,那么lParam可以被设为1;如果未在该子视窗上单击,那么lParam将被设为0。这是处理方式的一种选择。事实上,这是在建立一个「子视窗控制项」。当子视窗的状态改变时,子视窗处理滑鼠和键盘讯息并通知父视窗。使用这种方法,子视窗就变成了其父视窗的高阶输入装置。它将与自己在萤幕上的图形外观相应的处理,对使用者输入的回应以及在发生重要的输入事件时通知另一个视窗的方法给封装起来。虽然您可以建立自己的子视窗控制项,但是也可以利用一些预先定义的视窗类别(和视窗讯息处理程式)来建立标准的子视窗控制项,您一定在别的Windows程式中看到过这些控制项。这些控制项采用的形式有:按钮、核取方块、编辑方块、清单方块、下拉式清单方块、字串标签和卷动列。例如,如果想在您的试算表程式的某个角落放置一个标有「Recalculate」的按钮,那么您可以通过呼叫CreateWindow来建立这个按钮。您不必担心滑鼠操作、按钮显示操作或按下该按钮时的自动闪烁操作,这些是由Windows内部完成的。您所要做的只是拦截WM_COMMAND讯息——当按钮被按下时,它通过这一讯息通知您的视窗讯息处理程式。真的这样简单吗?是的,一点也没错。子视窗控制项在对话方块中最常用。在第十一章中您将会看到,子视窗控制项的位置和尺寸,是在范例程式的资源描述叙述中的对话方块模板里定义的。ProgrammingWindows程式开发设计指南(Windows95程序设计第五版)第328页但是,您也可以使用预先定义的,在普通视窗显示区域里的子视窗控制项。您可以呼叫一次CreateWindow来建立一个子视窗,并通过呼叫MoveWindow来调整子视窗的位置和尺寸。父视窗讯息处理程式向子视窗控制项发送讯息,子视窗控制项向父视窗讯息处理程式传回讯息。在建立普通视窗时,首先定义视窗类别,并使用RegisterClass将其注册到Windows中,然後用CreateWindow命令依据该视窗类别建立一个普通视窗,从第三章开始,我们就是这么做的。但是,当您使用预先定义的某个控制项时,不必为子视窗注册视窗类别,视窗类别已经存在於Windows之中,并且有一个预先定义的名字。您只需在CreateWindow中把它们用作视窗类别参数。CreateWindow中的视窗样式参数准确地定义了子视窗控制项的外形和功能。Windows内建了处理发送给依据这些视窗类别建立的子视窗讯息的视窗讯息处理程式。直接在您的视窗上使用子视窗控制项完成某些任务,这些任务的层次低於在对话方块中使用子视窗控制项所要求的层次。这里,对话方块管理器在您的程式和控制项之间增加一个隔离层。值得一提的,您可能会发现在您的视窗上建立的子视窗控制项,没有利用Tab键或方向键将输入焦点从一个控制项移动到另一个控制项的内部功能。子视窗控制项能够获得输入焦点,但是获得後,它将不能把输入焦点传回给父视窗。这就是本章要解决的问题。Windows程式设计的文件在两个地方讨论了子视窗控制项:首先是,简单的常用控制项,我们可以在/PlatformSDK/UserInterfaceServices/Controls的文件所描述的无数对话方块中看到。这些子视窗包括按钮(其中包括核取方块的单选按钮)、静态控制项(例如文字标签)、编辑方块(您可以在此编辑一行或多行文字)、卷动列、清单方块和下拉式清单方块。除下拉式清单方块以外,在Windows1.0中就包括了这些控制项。这部分的Windows文件还包括RichText文字编辑控制项,它与编辑方块相似,但还允许编辑不同字体与样式的格式化文字,以及桌面应用工具列。相对於「常用控制项」,还有一些神秘的特殊控制项。这些控制项在/PlatformSDK/UserInterfaceServices/ShellandCommonControls/CommonControls描述。本章不讨论常用控制项,但它们将出现在本书的其他部分。在这部分的Windows文件中,很容易找到您想从别的Windows应用程式中应用到您自己的应用程式里头那些部分资讯。按钮类别下面我们将通过叫做BTNLOOK(「buttonlook」)的程式来开始介绍按钮ProgrammingWindows程式开发设计指南(Windows95程序设计第五版)第329页视窗类别,如程式9-1所示。BTNLOOK建立10个子视窗按钮控制项,每个控制项对应一个标准的按钮样式,因此共有10种标准按钮样式。程式9-1BTNLOOKBTNLOOK.C/*--------------------------------------------------------------------------BTNLOOK.C--ButtonLookProgram(c)CharlesPetzold,1998---------------------------------------------------------------------------*/#includewindows.hstruct{intiStyle;TCHAR*szText;}button[]={BS_PUSHBUTTON,TEXT(PUSHBUTTON),BS_DEFPUSHBUTTON,TEXT(DEFPUSHBUTTON),BS_CHECKBOX,TEXT(CHECKBOX),BS_AUTOCHECKBOX,TEXT(AUTOCHECKBOX),BS_RADIOBUTTON,TEXT(RADIOBUTTON),BS_3STATE,TEXT(3STATE),BS_AUTO3STATE,TEXT(AUTO3STATE),BS_GROUPBOX,TEXT(GROUPBOX),BS_AUTORADIOBUTTON,TEXT(AUTORADIO),BS_OWNERDRAW,TEXT(OWNERDRAW)};#defineNUM(sizeofbutton/sizeofbutton[0])LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){staticTCHARszAppName[]=TEXT(BtnLook);HWNDhwnd;MSGmsg;WNDCLASSwndclass;wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);ProgrammingWindows程式开发设计指南(Windows95程序设计第五版)第330页wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName;if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT(ThisprogramrequiresWindowsNT!),szAppName,MB_ICONERROR);return0;}hwnd=CreateWindow(szAppName,TEXT(ButtonLook),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,iCmdShow);UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}returnmsg.wParam;}LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){staticHWNDhwndButton[NUM];staticRECTrect;staticTCHARszTop[]=TEXT(messagewParamlParam),szUnd[]=TEXT(___________________),szFormat[]=TEXT(%-16s%04X-%04X%04X-%04X),szBuffer[50];staticintcxChar,cyChar;HDChdc;PAINTSTRUCTps;inti;switch(message){caseWM_CREATE:cxChar=LOWORD(GetDialogBaseUnits());ProgrammingWindows程式开发设计指南(Windows95程序设计第五版)第331页cyChar=HIWORD(GetDialogBaseUnits());for(i=0;iNUM;i++)hwndButton[i]=CreateWindow(TEXT(button),button[i].szText,WS_CHILD|WS_VISIBLE|button[i].iStyle,cxChar,cyChar*(1+2*i),20*cxChar,7*cyChar/4,hwnd,(HMENU)i,((LPCREATESTRUCT)lParam)-hInstance,NULL);return0;caseWM_SIZE:rect.left=24*cxChar;rect.top=2*cyChar;rect.right=LOWORD(lParam);rect.bottom=HIWORD(lParam);return0;caseWM_PAINT:InvalidateRect(hwnd,&rect,TRUE);hdc=BeginPaint(hwnd,&ps);SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));SetBkMode(hdc,TRANSPARENT);TextOut(hdc,24*cxChar,cyChar,szTop,lstrlen(

1 / 57
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功