




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章图形化界面之一 - Win32 API编程入门10. 1 Windows编程环境10.1.1简要例子第九章中我们提到,Windows是一种多任务的操作系统。我们也知道,Windows是通过众多窗口来运行各类应用程序的操作系统。不但它自身如此,它也同样给用户提供了相同的多窗口运行环境,提供了很多图形化界面。C+本身的编程系统具有极其有限的窗口编程环境,见下例:例1使用提示框显示有限内容。/ wnd_MessageBox_1.cpp#include void main( )MessageBox ( NULL, Hello everybody!, MessageBox, NULL);char string10 = Value = ;for (int i=1; i4; i+)itoa(i, string+8, 10);MessageBox (0, TEXT(string), Display Box, 0);/* Results:程序运行后,先后出现四个提示框:第一个提示框的标题是MessageBox,它的提示内容为Hello everybody!。第二个提示框的标题是Display Box,它的提示内容为Value = 1。第三个提示框的标题是Display Box,它的提示内容为Value = 2。第四个提示框的标题是Display Box,它的提示内容为Value = 3。*/这个程序和以前所有程序不同之处在于:(1)它能显示图形(具体说是提示框);(2)为了显示图形,它可不包含头文件“iostream.h”,而是包含头文件“windows.h”。(3)如须删除这些提示框,用户必须按下“回车”或“空格”键,或者点击“确定”钮。如不删除前一个提示框,后一个提示框将不出现。这类提示框还具有与用户交互互动(interaction)的功能,见下例:例2 提示框与用户交互互动。/ wnd_MessageBox_2.cpp#include #include void main( )int iRet = MessageBox ( NULL, 肯定退出吗?, 请您确认, MB_YESNO);if (iRet = IDYES)cout 退出(yes),代码IDYES是:iRetendl;else cout不打算退出(no),其代码IDNO是:iRetendl;/* Results:如单击提示框的是(Y)钮,则程序显示退出(yes),代码IDYES是:6or:如单击提示框的否(N)钮,则程序显示不打算退出(no),其代码IDNO是:7*/此程序可根据用户对提示框的不同响应而作出不同运行结果。函数MessageBox的原型如下:int MessageBox (HWND hWnd,/h表示句柄类型,为整型变量,它是提示框的父窗口/(用于显示提示框的窗口)的句柄,NULL表示默认的父窗口是桌面LPCTSTR lpText,/lp代表长整数指针类型。此处为字符串,/ 就是提示框所显示的提示信息LPCTSTR lpCaption,/字符串,就是提示框的标题栏信息UINT uType/u代表无符号整数类型。此处为提示框类型,如下表所示);/ 命名规则请看9.1“匈牙利编程命名规则”。提示框类型(uType)内容MB_ABORTRETRYIGNORE提示框有三个按钮:Abort、Retry和IgnoreMB_OK(默认值,即NULL)提示框有一个按钮:OKMB_OKCANCEL提示框有两个按钮:OK和CancelMB_RETRYCANCEL提示框有两个按钮:Retry和CancelMB_YESNO提示框有两个按钮:Yes和NoMB_YESNOCANCEL提示框有三个按钮:Yes、No和Cancel下面还将对窗口句柄作详细解释。10.1.2工程的创建前面10.1.1所介绍的程序,虽能弹出提示框,供用户交互互动。但其功能极其有限。如须发挥真正的窗口功能,则应使用Windows编程技术来编写较为复杂的程序。Windows编程分为两类项目:Win32 API编程和MFC编程。Windows编程的第一类是Win32 API编程。第九章中提到,Win32 API是32位Windows操作系统的应用程序编程接口(API,Application Programming Interface)的简称。程序简称为Win32程序。现在Windows操作系统下运行的大多数应用程序都是Win32应用程序。Visual C+ 6.0支持的Win32项目有如下四种:(1) Win32 Application:【Win32应用程序】(2) Win32 Console Application:【Win32控制台应用程序】(3) Win32 Dynamic-link Library:【Win32动态链接库】(4) Win32 Static-link Library:【Win32静态链接库】本章主要介绍第一种,即Win32 Application:【Win32应用程序】项目。通过向导(Wizard)建立Win32应用程序的初步框架文件(代码和资源等),它直接使用Windows API编写程序而不用MFC库。创建这类工程将会看到最真实的Windows应用程序,它没有经过MFC的层层封装,没有一系列的类声明,有的只是一个以WinMain为开始点的应用程序。在这个应用程序中,由用户自己一步步地创建窗口、建立消息循环、接收Windows消息、发送Windows消息、编写自己的消息处理函数、撤销窗口等等。所有的Windows应用程序的运行机制在这种程序中全对用户敞开。第十一章末尾将很简单地介绍第三种,即Win32 Dynamic-link Library:【Win32动态链接库】。第十一章将介绍Windows编程的第二类:MFC项目,它利用Windows系统的各种类,将它们组合起来构成了一个应用程序的框架,它的目的就是让程序员在此基础上来建立Windows系统下的应用程序。MFC是“微软基础类”(Microsoft Foundation Class Library)的缩写;但有些书上愿意称之为“框架基础类”(Mainframe Foundation Class)。总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。VC+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地用图形来设计用户接口;ClassWizard用来协助添加代码到框架文件;最后即可编译生成应用程序。MFC项目就是通过这样一个基础类库实现了应用程序特定的逻辑。Visual C+6.0支持以下三种MFC项目:(1)MFC Activex Controlwizard:MFC【ActiveX控件】向导(2)MFC Appwizard dll :MFC应用程序向导【dll动态库工程】(3)MFC Appwizard exe :MFC应用程序向导【exe可执行工程】第十一章将讲解上述的第二和第三项。Win32 API编程不同于普通C+编程。C+编程时,不必预先创建工程(project),只须在编完源程序文件后,由系统自动创建工程。但在Win32 API编程时,必须事先创建工程。步骤如下:(一)从File菜单中选择“New”(或使用快捷键Ctrl + N),此时出现名为New的对话框。在此对话框中,单击或选择Projects标签。在下拉菜单中选择“Win32 Application”。同时在“Project name:”域中填入工程名,例如HelloEveryOne。此时系统为用户建立一个相同名称的子文件夹“HelloEveryOne”。用户可以在“Location:” 域中选择或修改该子文件夹的路径。同时保持另外两个域即“Create new workspace”和“Win32” 的内容不变。单击OK。(二)此时出现一个名为“Win32 Application Step 1 of 1” 的对话框。选择“A typical “Hello World!” application”选项。单击“Finish”。(三)此时又出现一个名为“New Project Information”的对话框。显示所创建的新工程的有关信息。如果信息合适,可单击“OK”,创建过程结束。如果信息有错,例如Project Directory有错,则可单击“Cancel”,重新创建工程。(四)工程创建之后,为用户提供一个源文件框架HelloEveryOne.cpp。其中留出很多空位,标以“/ TODO: Place code here.”或“/ TODO: Add any drawing code here.”等等,以供用户根据编程需要修改或补充必要的代码。但用户不受此限制,可以在任何地方修改或补充代码。本章的所有应用程序在建立过程中,都按照上述过程操作,建立工程后,只补充了主要源文件例如HelloEveryOne.cpp。其余文件没有改动。10.1.3头文件和系统生成的各类文件以上两个例子中,主要头文件不再是iostream.h,而是windows.h。这是Windows编程所用的最重要的头文件。有关内容如下:/* windows.h Master include file for Windows applications. */#include #include #include #include 这四个头文件是必须包含的。另外有一些头文件是有条件地包含的,故不在此提及。四个头文件的主要内容为:winbase.h - This module defines the 32-Bit Windows Base APIs。它包含所有内核函数的函数原型,还包含一些常量定义,例如:#define IGNORE 0 / Ignore signal#define INFINITE 0xFFFFFFFF / Infinite timeoutwinuser.h - USER procedure declarations, constant definitions and macros,它包含用户应用函数的函数原型、常量定义、宏定义等。其中包括以上程序所用的函数MessageBox()。wingdi.h GDI procedure declarations, constant definitions and macros。它包含图形设备接口(GDI,Graphics Device Interface)函数的函数原型、常量定义、宏定义等。windef.h - Basic Windows Type Definitions。它包含Windows编程所用基本数据类型定义。例如第九和第十两章中用到的定义:/函数调用约定#define CDECL _cdecl#define PASCAL _stdcall#define CALLBACK PASCAL#defineWINAPI _stdcall#define APIENTRY WINAPI /常量定义#define NULL 0或者#define NULL (void *)0)#define FALSE 0#define TRUE 1/数据类型定义Typedef int INT;typedef unsigned int UINT;typedef unsigned long DWORD;typedef int BOOL;typedef char TCHAR, *PTCHAR;typedef unsigned char BYTE;typedef unsigned short WORD;typedef UINT WPARAM;typedef LONG LPARAM;typedef LONG LRESULT;#define LOWORD(l) (WORD)(l)#define HIWORD(l) (WORD)(DWORD)(l) 16) & 0xFFFF)VC是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。按照以上10.1.2所述三个步骤创建工程之后,系统同时为该工程建立以下各种类型的12个文件,下面简要地介绍它们:(1)HelloEveryOne.cpp:该应用程序的主要源文件框架。(2)HelloEveryOne.h:该应用程序的主要头文件。(3)StdAfx.h和(4)StdAfx.cpp:这两个文件用于建立一个目标文件StdAfx.obj和一个预编译头文件HelloEveryOne.pch(precompiled header (PCH))。(5)resource.h:用于定义新的资源ID。(6)small.ico:小图标文件,包含此应用程序的一个较小面积(16x16)的图标,它被包含于资源文件HelloEveryOne.rc中。在将来创建的窗口中,此小图标被显示在窗口左上角。(7)HelloEveryOne.ico:图标文件,包含此应用程序的一个图标(32x32),它被包含于资源文件HelloEveryOne.rc中。(8)HelloEveryOne.dsp:工程文件(the project file),文本格式。 此文件包含工程级别上的信息,用于建立单个工程或子工程等。其它用户可分享该工程文件。(9)HelloEveryOne.dsw:工程区文件(the project workspace file),类似于工程文件。当须要重新调试工程时,首先应调用这两个工程文件。(10)HelloEveryOne.rc:资源文件。它包含程序所用的一系列窗口资源,包括图标、位图、和光标等。可供用户直接编辑。(11)HelloEveryOne.ncb:无编译浏览文件,编译工程后会自动生成。(12)ReadMe.txt:此文件告诉用户,系统已为用户建立了一系列文件。创建工程从而建立上述12个文件后,即可进行编译和连接的工作。在用户编写完源文件HelloEveryOne.cpp(这是用户的主要工作)之后,系统将各类资源编译、将源文件StdAfx.cpp和HelloEveryOne.cpp编译,最后进行连接。结果又建立了以下10个文件:(13)HelloEveryOne.obj:这是源文件HelloEveryOne.cpp编译后的目标文件。(14)StdAfx.obj:这是源文件StdAfx.cpp编译后的目标文件。(15)HelloEveryOne.plg:这是编译信息文件(HTML文件),保存了该程序的编译和连接过程的记录,包含编译时的error和warning信息。(16)HelloEveryOne.pch:预编译文件,文件非常大,存放着已经编译的部分代码,以便以后建立工程时不再编译它们,从而可以加快编译速度。(17)HelloEveryOne.pdb:数据库文件,记录了程序有关的一些数据和调试信息。(18)HelloEveryOne.exe:这是最主要的成果文件,程序的可执行文件。(19)HelloEveryOne.res文件。(20)HelloEveryOne.ilk文件。(21)vc60.idb文件。(22)vc60.pdb文件。10.2 典型程序之一 - 窗口中显示文本10.2.1源文件HelloEveryOne.cpp是一个最简单的例子,但却很典型。现在详细分析一下。例1创建一个窗口,并且在窗口中央显示文本“Hello Every One!”。 创建工程之后,系统为该工程建立了该应用程序的主要源文件的框架,供用户填入必需的代码。以下是填入代码后的源文件。/ HelloEveryOne.cpp : Defines the entry point for the application.#include stdafx.h#include resource.h/ Global Variables:HINSTANCE hInst;/ current instanceTCHAR szTitle = Demonstration!;/ The title bar textTCHAR szWindowClass = Hello Every One!;/ content to be shown/ Forward declarations of functions included in this code module:ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) / TODO: Place code here.MSG msg;HACCEL hAccelTable;/ Initialize global stringsMyRegisterClass(hInstance);/ Perform application initialization:if (!InitInstance (hInstance, nCmdShow) return FALSE;hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_HELLOEVERYONE);/ Main message loop:while (GetMessage(&msg, NULL, 0, 0) if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg) TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;/ FUNCTION: MyRegisterClass()/ PURPOSE: Registers the window class./ COMMENTS:/ This function and its usage is only necessary if you want this code/ to be compatible with Win32 systems prior to the RegisterClassEx/ function that was added to Windows 95. It is important to call this function/ so that the application will get well formed small icons associated/ with it.ATOM MyRegisterClass(HINSTANCE hInstance)WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= LoadIcon(hInstance, (LPCTSTR)IDI_HELLOEVERYONE);wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= (LPCSTR)IDC_HELLOEVERYONE;wcex.lpszClassName= szWindowClass;wcex.hIconSm= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);return RegisterClassEx(&wcex);/ FUNCTION: InitInstance(HANDLE, int)/ PURPOSE: Saves instance handle and creates main window/ COMMENTS:/ In this function, we save the instance handle in a global variable and/ create and display the main program window.BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) HWND hWnd; hInst = hInstance; / Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); return TRUE;/ FUNCTION: WndProc(HWND, unsigned, WORD, LONG)/ PURPOSE: Processes messages for the main window./ WM_COMMAND- process the application menu/ WM_PAINT- Paint the main window/ WM_DESTROY- post a quit message and returnLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)Int wmId;PAINTSTRUCT ps;HDC hdc;Int iRet;switch (message) case WM_COMMAND:wmId = LOWORD(wParam); / Parse the menu selections:switch (wmId)case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break;case IDM_EXIT:iRet = MessageBox ( NULL, 肯定退出吗?, 请您确认, MB_YESNO);if (iRet = IDYES) DestroyWindow(hWnd);break;default: return DefWindowProc(hWnd, message, wParam, lParam);break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);/ TODO: Add any drawing code here.RECT rt;GetClientRect(hWnd, &rt);DrawText(hdc, szWindowClass, -1, &rt, DT_SINGLELINE | DT_CENTER | DT_VCENTER );/ DrawText(hdc, szWindowClass, strlen(szWindowClass), &rt, /DT_SINGLELINE | DT_CENTER | DT_VCENTER );EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam); return 0;/ Message handler for about box.LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)switch (message)case WM_INITDIALOG:return TRUE;case WM_COMMAND:if (LOWORD(wParam) = IDOK | LOWORD(wParam) = IDCANCEL) EndDialog(hDlg, LOWORD(wParam);return TRUE;break;return FALSE;连接所得的文件HelloEveryOne.exe能显示用户窗口及其中的文本。10.2.2主函数现在详细地分析这一典型程序:程序中显式地包含两个头文件:stdafx.h和resource.h。它们是系统为此程序所专门建立的。其中stdafx.h又包含以下五个头文件:windows.h、stdlib.h、malloc.h、memory.h和tchar.h。在10.1.3中已知,windows.h又至少包含以下四个头文件: windef.h、winbase.h、wingdi.h和winuser.h。所以该程序隐式地包含了至少十个以上头文件。源文件中接着定义三个全局变量:HINSTANCE hInst; TCHAR szTitle = Demonstration!;和TCHAR szWindowClass = Hello Every One!。其中等号右侧的两个字符串是所创建窗口的标题和显示文本的内容。其中TCHAR定义如下:typedef char TCHAR, *PTCHAR;源文件中然后是四个函数的原型说明。它们是MyRegisterClass、InitInstance、WndProc和About。接着调用主函数WinMain()。普通C+主函数是main( ) ,这里不同,主函数是WinMain()。它的函数原型如下:int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow );其中函数返回值为int,调用约定修饰符为APIENTRY标明这是API入口函数,属于_stdcall调用约定。它在头文件windef.h中定义为:#defineWINAPI _stdcall#define APIENTRY WINAPI所以实际上为int _stdcall WinMain(); (第二章2.8.6“函数的调用约定”中已有详细阐述)。 主函数有四个形参,分别是:(1)hinstance:它是Windows为该应用程序实例生成的一个句柄。前面在第九章中已看过事件句柄。此处使用进程句柄。进程的实例句柄由操作系统Windows在程序入口函数WinMain( )中通过第一个参数HINSTANCE hinstExe传递给该函数,其实际值即为进程所使用的基本地址空间的地址。对于VC+所链接产生的程序,其默认的基本地址空间地址为0x00400000。在程序中,可以通过GetModuleHandle( )函数得到指定模块所使用的基本地址空间。当然,这个地址空间是虚拟(或相对)地址空间。句柄唯一地标识该程序,其它函数须要调用该程序时,即可使用此句柄。(2)hPrevInstance:该参数已经不再使用,只是微软为了保持兼容性而仍保留。(3)IpCmdLine:如果应用程序以命令行的形式被启动,则这个参数存放的是系统传递进来的命令行的参数。(4)nCmdShow:系统传入的用于定义主应用程序窗口最初显示的方式,可以是正常地显示或者是最大化地充满整个屏幕,或者是最小化地显示在任务列表栏中。以后该参数将被传递给ShowWindow函数(关于ShowWindow,将在以后介绍)。例如它可以是1。系统调用WinMain时,为这四个形参配备实参。WinMain主要做四件工作,可分为以下四个步骤:(1) 注册窗口类。(2) 创建窗口并显示。(3) 进入消息循环,在消息循环中用GetMessage和DispatchMessage来接收和分发消息。(4) 在窗口过程中对消息进行各种处理。10.2.3窗口的创建和显示现在逐步地分析主函数WinMain的工作:第一步骤是为窗口类注册,这是创建窗口前的必要步骤:WinMain首先声明两个局部变量,语句如下:MSG msg和HACCEL hAccelTable;其中MSG已在上一节中提到,它是一个消息数据结构体,而msg则是它的对象(实例),用于存放消息循环获得的消息;hAccelTable用于存放键盘加速键表的句柄。键盘加速键是应用程序运行时的快捷键,例如在使用Word编辑时,按下快捷键Ctrl+F就可打开查找对话框。加速键表就是加速键与用户窗口菜单命令的映射表。将来如果须要进行消息转换,该表将被TranslateMessage函数调用。WinMain函数接下来执行MyRegisterClass函数,进行窗口类的注册。MyRegisterClass是程序中自己定义的一个函数。它的主要功能是填充一个WNDCLASSEX结构体,再调用Windows API函数RegisterClassEx向系统进行注册。WNDCLASSEX是一个窗口类的结构体,它定义了一种类型的窗口行为特性。WNDCLASSEX的各成员及其定义如下:WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= LoadIcon(hInstance, (LPCTSTR)IDI_HELLOEVERYONE);wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= (LPCSTR)IDC_HELLOEVERYONE;wcex.lpszClassName= szWindowClass;wcex.hIconSm= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);它的各个成员字段的意义如下:(1)cbsize:它反映了WNDCLASSEX的大小。一般情况下给它赋值为sizeof (WNDCLASSEX)即可。(2)style:该字段决定了希望创建的窗口类的风格属性。常用的一些属性标志值如下表所示:标志描述CS_HREDRAW如移动或改变了窗口宽度,则刷新整个窗口CS_VREDRAW如移动或改变了窗口高度,则刷新整个窗口CS_OWNDC为该类中每个窗口分配一个单值的设备描述表CS_DBLCLKS当用户双击鼠标时,向窗口程序发送一个双击信息CS_SAVEBITS在一个窗口中保存用户图像,以便在该窗口被遮住、移动时,不必每次刷新屏幕。CS_NOCLOSE禁止系统菜单上的关闭命令(3)lpfnWndProc:指向窗口过程函数的指针。窗口过程函数的主要功能就是处理消息,拦截感兴趣的消息并且进行处理。窗口过程函数是一个回调函数,其作用将在本章10.2.6“对消息的处理”一节中阐述。当系统分发一个消息时,会自动寻找消息对应的目标窗口,并根据窗口类定义中的这个指针把消息投递到对应的窗口过程中去。本例中这个字段被赋值为WndProc,WndProc就是本应用程序的窗口处理过程。(4)cbClsExtra:类结构体的附加字节大小。一般为0。(5)cbWndExtra:窗口对象的附加字节大小。一般为0。(6)hInstance:窗口所属的应用程序的实例句柄。这里就简单地赋值为主函数WinMain传入的应用程序实例句柄。(7)hIcon:窗口的图标句柄。该句柄通过调用LoadIcon函数得到。LoadIcon的函数原型是:HICON LoadIcon ( HINSTANCE hInstance,/图标资源所在模块的句柄 LPCTSTR lpIconName/图标资源名称;此函数用于加载图标以供程序使用。如果形参hInstance取值为NULL,则表示使用系统默认的图表资源。第二个形参lpIconName可取下表所示的值:值说明IDI_APPLICATION默认应用程序图标IDI_ASTERISK星号IDI_EXCLAMATION惊叹号IDI_HAND手形图标IDI_QUESTION问号IDI_WINLOGOWindows徽号(8)hCursor:窗口的光标句柄,此参数决定了鼠标光标移到窗口中时的样式。此句柄通过调用LoadCursor函数得到。LoadCursor的用法与LoadIcon相似。(9)hbrBackground:窗口的背景画刷的颜色。当窗口移动或改变尺寸而须要刷新时,系统就根据此参数定义的画刷的颜色对窗口背景进行刷新。(10)lpszMenuName:菜单资源的名称,它是以一个空字符为结束符的字符串指针。(11)lpszClassName:窗口类名,它是以一个空字符为结束符的字符串指针。它的作用是给这个窗口类起一个名字,以后在调用CreateWindow函数时,指定这个名字时,系统就可以根据类名进行窗口的创建。(12)hIconSm:应用程序窗口的小图标的句柄。当应用程序窗口被最小化到工具栏时,就在工具栏上显示由这个参数指定的图标。在填充完WNDCLASSEX结构体后,下一步就是向系统注册这个结构体。注册结构体的API函数是RegisterClassEx(),它只接收一个参数,就是WNDCLASSEX结构体的地址,执行完这一句之后,窗口类就完成向系统的注册操作。第二步骤为创建窗口并显示窗口。WinMain函数接着调用InitInstance函数。InitInstance函数也是HelloEveryOne应用程序自定义的函数。这个函数主要完成的工作是调用系统函数CreateWindow创建窗口并调用函数ShowWindow来显示窗口。前者的函数原型是:HWND CreateWindow ( LPCTSTR lpClassName, /窗口类名 LPCTSTR lpWindowName,/窗口名称 DWORDdwStyle,/窗口风格 intx,/窗口位置的x坐标 inty, /窗口位置的y坐标 intnWidth,/窗口的宽度 intnHeight, /窗口的高度 HWNDhWndParent,/父窗口句柄 HMENUhMenu,/菜单句柄 HANDLE hInstance,/应用程序句柄 LPVOIDlpParam/窗口创建参数;当此函数执行成功时,它就返回一个新生成的窗口的句柄,否则就返回NULL。其参数定义如下:(1)lpClassName:窗口类名,这里的类名就是前面刚刚注册过的类名。(2)lpWindowName:窗口的标题栏的文本。(3)dwStyle:这是一个设定窗口外观和行为的参数。其常用参数如下:类型说明WS_BORDER创建一个有边框的窗口WS_CAPTION创建一个有标题栏的窗口WS_CHILDWINDOW(或WS_CHILD)创建一个子窗口(不能与WS_POPUP合用)WS_CLIPCHILDREN当在父窗口内绘制时,把子窗口占据的区域剪切在外,即不在该区域内绘图WS_CLIPSIBLINGS裁剪相互有关系的子窗口,不再被其它子窗口覆盖的区域内绘图,仅与WS_CHILD一起使用)WS_DISABLED创建一个初始被禁止的窗口WS_DLGFRAME创建一个有双边但无标题的窗口WS_HSCROLL创建一个带水平滚动杠的窗口WS_VSCROLL创建一个带垂直滚动杠的窗口WS_MAXIMIZE创建一个最大尺寸的窗口WS_MINIMIZE创建一个最小尺寸的窗口(即图标)WS_MAXIMIZEBOX创建一个带有极大框的窗口WS_MINIMIZEBOX创建一个带有极小框的窗口WS_OVERLAPPEDWINDOW创建一个重叠式窗口,重叠式窗口带有标题和边框WS_POPUP创建一个弹出式的窗口,不能与WS_CHILD合用WS_SYSMENU窗口带有系统选单框,仅用于带标题栏的窗口WS_THICKFRAME创建一个边框的窗口,使用户可以直接缩放窗口(4)x:窗口的左上角位置横坐标。如设定为CW_USEDEFAULT,则将使用系统默认的位置坐标。(5)y:窗口的左上角位置纵坐标。如x设定为CW_USEDEFAULT,则y将被忽略。(6)nWidth:窗口的宽度。如设定为CW_USEDEFAULT,则将使用系统默认的宽度值。(7)nHeight:窗口的高度。如nWidth设定为CW_USEDEFAULT,则该值将被忽略。(8)hWndParent:指向父窗口的句柄。如设定为NULL,则桌面就是新生成窗口的父窗口。(9)hMenu:指向附属于该窗口菜单的句柄。(10)hInstance:应用程序实例句柄。前面曾多次提到它的作用。(11) lpParam:附加参数。如果希望创建窗口,则窗口过程在收到WM_CREATE消息时附带的附加参数,就可以通过这个字段来进行设定。一般情况下,设定为NULL。窗口创建之后,并没有显示出来,而必须调用ShowWindow函数使窗口显示在屏幕上。ShowWindow的函数原型如下:BOOLShowWindow (
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年数据分析师高级面试题集
- 桡尺骨骨折课件
- 2025年图书馆特色资源建设方案策划师招聘面试题解
- 2025年双语数学教学职位应聘面试攻略模拟题及答案解析民办学校
- 2025年区域经济与可持续发展考试试题及答案
- 2025年电力行业安全监理员招聘安全知识预测试题集
- 2026届湖南省邵阳市邵阳县第一中学化学高三上期末教学质量检测试题含解析
- 2026届河南省扶沟高中化学高二第一学期期末考试模拟试题含答案
- 2025年法律行业人工智能应用考察试卷及解析答案
- 2025年注册验船师资格考试(A级船舶检验专业综合能力)综合试题及答案一
- 2025年广西南宁市宾阳县公开招聘乡村医生73人笔试备考试题及答案解析
- 2025年保安员理论考试题库及答案
- 2025年江苏省综合评标评审专家库专家考试(公共基础知识)历年参考题库含答案详解(5套)
- 2025废气处理合作协议合同范本
- 麻醉师进修汇报
- 基坑监测评审汇报
- 2025-2026年秋季学期各周国旗下讲话安排表+2025-2026学年上学期升旗仪式演讲主题安排表
- 物业公司电瓶车管理制度
- 肺占位性病变护理查房
- 广告创意与用户体验-第3篇-洞察阐释
- 幼儿园一日常规安全培训
评论
0/150
提交评论