




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章 Windows程序基础在本学习情境中主要掌握:(1) Windows 程序结构(2) Windows控件使用2.1 Windows程序结构2.1.1 WinMain函数C语言中的main()函数一样,Windows程序是从WinMain()函数开始和结束的WinMain()函数是在WINBASE.H中定义的,如图1所示。图1 WinMain函数头文件其原形如下:int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )其中第一个参数(HINSTANCE hInstance)是程序的实例句柄,这个实例句柄是程序的唯一标识第二个参数(HINSTANCE hPrevInstance)是用做检查是否有多个程序实例运行,但由于Windows9X和NT(包括更高版本)是32位操作系统,所以这个参数总是NULL第三个参数(LPSTR lpCmdLine)是一个指向字符串的指针,用来保存运行程序时的命令行参数第四个参数(int nShowCmd)用来指定程序开始的时候如何显示2.1.2 窗口创建过程第一步:定义并注册窗口类。在Windows中要创建一个窗口首先要定义窗口类然后注册这个窗口类定义窗口类要通过填充WNDCLASS结构体来完成,此结构体是在WINUSER.H中定义的,其原形如下:typedef struct tagWNDCLASSA UNIT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; WNDCLASS;第一个成员变量style指定这一类型窗口的样式,这些样式可通过按位或操作组合起来。常用样式如下: CS_HREDRAW: 当水平长度改变或移动窗口时,重画整个窗口 CS_VREDRAW: 当垂直长度改变或移动窗口时,重画整个窗口 CS_DBLCLKS: 允许向窗口发送双击鼠标键的消息 CS_NOCLOSE: 禁止系统菜单的关闭选项 第二个成员变量lpfnWndProc是一个函数指针,指向窗口过程函数,窗口过程函数是一个回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。针对Windows的消息处理机制,窗口过程函数被调用的过程如下:(1)在设计窗口类的时候,将窗口过程函数的地址赋值给lpfnWndProc成员变量。(2)调用RegisterClass(&wndclass)注册窗口类,系统就拥有了窗口过程函数的地址。(3)当应用程序接收到某一窗口的消息时,调用DispatchMessage(&msg)将消息回传给传统。系统则利用先前注册窗口类时得到的函数指针,调用窗口过程函数对消息进行处理。lpfnWndProc成员变量的类型是WNDPROC的定义:typedef LRESULT (CALLBACK *WNDPROC)(HWND,UINT,WPARAM,LPARAM);WNDPROC是函数指针类型。第三个成员变量cbClsExtra指定紧随在 WNDCLASS 数据结构后分配的字节数。系统将其初始化为零。 第四个成员变量cbWndExtra:指定紧随在窗口实例之后分配的字节数,系统将其初始化为零。第五个成员变量hInstance 标识该窗口类的窗口过程所在的模块实例的句柄,不能为NULL。 第六个成员变量hIcon:标识该窗口类的图标。hIcon字段必须是一个图标的句柄;若hIcon字段为NULL,那么系统将提供一个默认的图标。 在为hIcon变量赋值时,可以调用LoadIcon函数来加载一个图标资源,返回系统分配给该图标的句柄。函数原型声明如下所示:HICON LoadIcon (HINSTANCE hInstance, LPCTSTR lpIconName);第七个成员变量hCursor标识该窗口类的光标,hCursor必须是一个光标资源的句柄。若hCursor字段为NULL,则无论何时鼠标移到应用程序窗口时,应用程序必须显式设置光标形状。 在为hCursor变量赋值时,可以调用LoadCursor函数来加载一个光标资源,返回系统分配给该光标的句柄。函数原型声明如下:HCURSOR LoadCursor (HINSTANCE hInstance, LPCTSTR lpCursorName);第八个成员变量hbrBackground:标识了该窗口类的背景画笔。hbrBackground字段必须是用于绘制背景的物理刷子的句柄,也可以为其指定一个标准的系统颜色值。可以调用GetStockObject函数来得到系统得标准画刷。GetStockObject函数的原型声明如下:HGDIOBJ GetStockObject(int fnObject);GetStockObject函数可以返回多种资源对象的句柄,还可以用于获取画笔、字体和调色板的句柄。第九个成员变量lpszMenuName 指向NULL结束的字符串,该字符串描述菜单的资源名,如同在资源文件里显示的名字一样。若使用一个整数标识菜单,可以使用MAKEINTRESOURCE宏。如果lpszMenuName为NULL,那么该窗口类的窗口将没有默认菜单。 第十个成员变量 lpszClassName 指向NULL结束的字符串,指定窗口类的名字。设计完窗口类(WNDCLASS)后,需要调用RegisterClass函数对其进行注册,注册成功后,才可以创建该类型的窗口,注册函数的原型声明如下:ATOM RegisterClass(CONST WNDCLASS *lpWndClass);该函数只有一个参数,即上面所设计的窗口类对象的指针。例:if(!RegisterClass(&wndclass) return 0;第二步:创建窗口在完成了定义窗口类和注册窗口类,现在要来创建这个窗口并显示它。创建一个窗口要使用CreateWindow()函数来完成,具体方法如下:hwnd=CreateWindow(LPCTSTR lpClassName, /窗口类名 LPCTSTR lpWindowName, /窗口标题 DWORD dwStyle, /窗口样式 int x, /窗口最初的X位置 int y, /窗口最初的Y位置 int nWidth, /窗口最初的X大小 int nHeight, /窗口最初的Y大小 HWND hwndParent, /父窗口句柄 HMENU hMenu, /窗口菜单 HANDLE hInstance, /应用程序实例句柄LPVOID lpParam /附加的数据指针 ); 参数lpClassName指定窗口类的名称,即WNDCLASS中第十个成员变量lpszClassName成员指定的名称。参数lpWindowName指定窗口的名字。如果窗口样式指定了标题栏,那么这里指定的窗口名字将显示在标题栏上。参数dwStyle指定创建的窗口的样式。要注意区分WNDCLASS类中的style成员与CreateWindow函数的dwStyle参数,前者是指定窗口类的样式,基于该窗口类创建的窗口都具有这些样式,后者是指定某个具体的窗口的样式。可以给创建的窗口指定WS_OVERLAPPEDWINDOW类型,该类型的定义为:#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)WS_OVERLAPPED:产生一个层叠的窗口,一个层叠的窗口有一个标题栏和边框。WS_CAPTION:创建一个有标题栏的窗口。WS_SYSMENU:创建一个在标题栏上带有系统菜单的窗口,要和WS_CAPTION类型一起使用。WS_THICKFRAME:创建一个具有可调边框的窗口。WS_MINIMIZEBOX:创建一个具有最小化按钮的窗口,必须同时设定WS_SYSMENU类型。WS_MAXIMIZEBOX:创建一个具有最大化按钮的窗口,必须同时设定WS_SYSMENU类型。CreateWindow函数的参数x,y,nWidth,nHeight分别指定窗口左上角的x,y坐标,窗口的宽度、高度。如果参数x被设定为CW_USEDEFAULT,那么系统为窗口选择默认的左上角坐标并忽略y参数。如果参数nWidth被设为CW_USEDEFAULT,那么系统为窗口选择默认的宽度和高度,参数nHeight被忽略。参数hwndParent指定被创建窗口的父窗口的句柄。参数hMenu指定窗口菜单的句柄。参数hInstance指定窗口所属的应用程序实例的句柄。参数lpParam 作为WM_CREATE消息的附加参数lParam传入的数据指针。在创建多文档界面的客户窗口时,lpParam必须指向CLIENTCREATESTRUCT结构体。多数窗口的这个参数设置为NULL。如果窗口创建成功,CreateWindow函数将返回系统为该窗口分配的句柄,否则,返回NULL。需要注意的是,在创建窗口之前应先定义一个窗口句柄变量来接收窗口之后返回的句柄值。第三步:显示及更新窗口窗口创建以后,可以调用ShowWindow函数来显示窗口,函数的原型声明如下:BOOL ShowWindow( HWND hWnd, int nCmdShow);参数hWnd即CreateWindow函数返回的窗口句柄。参数nCmdShow指定窗口的显示状态。常用的显示状态:SW_SHOWNORMAL:激活并显示窗口。SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。SW_HIDE:隐藏窗口并激活其他窗口。SW_SHOWMAXIMIZED:激活窗口并将其最大化显示。SW_SHOWMINIMIZED:激活窗口并将其最小化显示。在调用ShowWindow函数后,接着调用UpdateWindow来刷新窗口,函数的原型声明如下:BOOL UpdateWindow( HWND hWnd);参数hWnd指CreateWindow函数返回的窗口句柄。2.1.3 消息循环在创建窗口、显示窗口、更新窗口后,需要编写一个消息循环,不断地从消息队列中取出消息,并进行响应。要从消息队列中取出消息,需要调用GetMessage()函数,函数原型声明如下:BOOL GetMessage( LPMSG lpMsg, HWND hWnd , UINT wMsgFilterMin, UINT wMsgFilterMax);参数lpMsg指向一个消息(MSG)结构体,GetMessage从线程的消息队列中取出的消息将保存在该结构体对象中。typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;第一个成员变量hwnd表示消息所属的窗口。我们通常开发的程序都是窗口应用程序,一个消息一般都是与某个窗口相关联的。例如,在某个活动窗口中按下鼠标左键,产生的按键消息就是发给该窗口的。在Windows程序中,用HWND类型的变量来标识窗口。第二个成员变量message指定了消息的标识符。在Windows中,消息是由一个数值来表示的,不同的消息对应不同的数值。但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM是Window Message的缩写)的形式,XXX对应某种消息的英文拼写的大写形式。例如,鼠标左键按下消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR,等等。在程序中我们通常都是以WM_XXX宏的形式来使用消息的。第三、第四个成员变量wParam和lParam,用于指定消息的附加信息。例如,当我们收到一个字符消息的时候,message成员变量的值就是WM_CHAR,但用户到底输入的是什么字符,那么就由wParam和lParam来说明。wParam、lParam表示的信息随消息的不同而不同。第五、第六个两个变量time和pt分别表示消息投递到消息队列中的时间和鼠标的当前位置。Windows会为每一个当前运行的程序建立一个消息队列,用来完成用户与程序的交互为了让程序能够处理这个消息队列,我们要使用一个消息循环从消息队列中取出消息: while(GetMessage(msg,NULL,0,0) TranslateMessage(msg); DispatchMessage(msg); 消息循环从GetMessage()函数开始,首先从消息队列中取出一个消息,然后通过TranslateMessage(msg)函数将msg结构传递给Windows进行转换,最后使用DispatchMessage(msg)函数将msg结构回传给Windows,再由Windows将此消息发送到相应的窗口过程中进行处理2.1.4 编写窗口过程函数窗口过程函数要处理Windows发来的消息,就需要定义一个窗口过程函数在填充wndclass结构的时候我们定义了窗口的消息处理函数wndclass.lpfnWndProc=WndProc;WndProc,这个函数就是用来处理窗口消息的窗口过程函数其定义形式如下:LRESULT CALLBACK WndProc( HWND hwnd, UNIT message, WPARAM wParam, LPARAM lParam )这四个参数和MSG结构的前四个域是相同的。第一个参数(HWND hwnd)是接收消息的窗口句柄,它和CreateWindow()函数的返回值相同。第二个参数(UNIT message)是用来标识该消息的数字。第三个参数和第四个参数是位的消息参数,用来提供消息的更多信息。在定义完窗口过程函数后,我们就可以在窗口过程函数中来处理由Windows发来的窗口消息。一般使用switch和case语句来判断收到的是什么消息,并相应的处理这个消息。switch(message) case WM_CREATE: . . return 0; case WM_PAINT: . . return 0; default:return DefWindowProc(hwnd,message,wParam,lParam); 2.1.5 窗口实现过程(1)首先建立一个Win32 Application类型的工程,如图2所示。图2 建立Win32 Application类型的工程(2)选择An Empty Project类型的工程,如图3所示。图3选择An Empty Project类型的工程(3)为SimpleWin工程增加一个C+ Source File的源文件,如图4所示。图4 增加C+源文件(4)在C+源文件中编写程序的相关代码。#include /窗口过程函数的声明LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)/窗口句柄HWND hwnd; /消息结构MSG msg;/窗口类WNDCLASS wndclass;/窗口类的初始化wndclass.style=CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=SimpleWin;/窗口的注册if(!RegisterClass(&wndclass)MessageBox(NULL,窗口注册失败!,SimpleWin,0);return 0;/窗口的创建hwnd=CreateWindow(SimpleWin, /窗口类名 石家庄职业技术学院, /窗口标题 WS_OVERLAPPEDWINDOW, /窗口样式 CW_USEDEFAULT, /窗口最初的X位置 CW_USEDEFAULT, /窗口最初的Y位置 CW_USEDEFAULT, /窗口最初的X大小 CW_USEDEFAULT, /窗口最初的Y大小 NULL, /父窗口句柄 NULL, /窗口菜单句柄 hInstance, /应用程序实例句柄 NULL); /创建窗口的参数ShowWindow(hwnd,nCmdShow); /显示窗口UpdateWindow(hwnd); /更新窗口,包括窗口的客户区/进入消息循环while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_CREATE:return 0;case WM_LBUTTONDOWN:MessageBox(NULL,你好,VC+!,提示,0);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;return DefWindowProc(hwnd,message,wParam,lParam);(5)程序运行结果如图5所示。图5 程序运行结果2.1.6 使用控件(1)将原来设计的求一元二次方程的根类加入到工程中,如图6所示。图6 将文件加入到工程中(2)选择Root.h和Root.cpp文件加入到工程中,如图7所示。图7 选择Root.h和Root.cpp文件其中Root.h中的代码为:#ifndef CLASS_ROOT_1#define CLASS_ROOT_1class Rootprivate:float Ra,Rb,Rc;double root2;public:Root()Root(float a,float b,float c)Ra=a;Rb=b;Rc=c;Root()void SetRoot(float a,float b,float c)Ra=a;Rb=b;Rc=c;int GetRoot();double Root1();double Root2();#endif其中Root.cpp中代码为:#include #include #include Root.hint Root:GetRoot()double delta,deltasqrt;delta=Rb*Rb-4.0*Ra*Rc;if(delta0) cout此方程无正实数解endl; return 0;deltasqrt=sqrt(delta);if(Ra!=0)root0=(-Rb+deltasqrt)/(2.0*Ra);root1=(-Rb-deltasqrt)/(2.0*Ra);return 2;elseif(Rb!=0) root0=root1=-Rc/Rb;return 1;elsereturn 0;double Root:Root1()return root0;double Root:Root2()return root1;(3)在SimpleWin的源文件基础上进行修改,代码如下:#include #include #include #include Root.h/窗口过程函数的声明LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)/窗口句柄HWND hwnd; /消息结构MSG msg;/窗口类WNDCLASS wndclass;/窗口类的初始化wndclass.style=CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=SimpleWin;/窗口的注册if(!RegisterClass(&wndclass)MessageBox(NULL,窗口注册失败!,SimpleWin,0);return 0;/窗口的创建hwnd=CreateWindow(SimpleWin, /窗口类名 石家庄职业技术学院, /窗口标题 WS_OVERLAPPEDWINDOW, /窗口样式 CW_USEDEFAULT, /窗口最初的X位置 CW_USEDEFAULT, /窗口最初的Y位置 CW_USEDEFAULT, /窗口最初的X大小 CW_USEDEFAULT, /窗口最初的Y大小 NULL, /父窗口句柄 NULL, /窗口菜单句柄 hInstance, /应用程序实例句柄 NULL); /创建窗口的参数ShowWindow(hwnd,nCmdShow); /显示窗口UpdateWindow(hwnd); /更新窗口,包括窗口的客户区/进入消息循环while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;char str80;LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)HDC hdc;PAINTSTRUCT ps;static HWND hwndButton,hwndEdit3;char strEdit80;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 6.4 直线与圆的位置关系说课稿-2025-2026学年中职基础课-基础模块 下册-人教版(2021)-(数学)-51
- 3.1构成物质的基本微粒(第4课时)教学设计-2023-2024学年九年级化学沪教版上册
- 第30课 もう11時だから寝よう说课稿新版标准日本语初级下册-新版标准日本语
- 部编版八年级道德与法治上册9.2维护国家安全说课稿
- 2025年人工智能产品经理实战模拟题库及答案解析
- 2025年人力资源经理竞聘面试题集及解析
- 三年级语文下册 第一单元 3 荷花第1课时说课稿 新人教版
- 2023一年级数学下册 六 小小存钱罐-人民币的认识信息窗2 小小存钱罐-人民币的简单计算说课稿 青岛版六三制
- 2025年中国茶文化研究指南及模拟考试题库
- 2025年市场营销实战模拟题及答案指南
- 糖尿病患者的个性化诊治策略
- 经络腧穴学-课件
- 智能垃圾分类回收箱
- 中州国信特殊资产管理断供保房服务相关问题解答
- 烟草评级员业务报告范文
- 2025年三基三严考试题题库(含答案)
- 湖北省重点高中智学联盟2024-2025学年高三上学期10月联考物理试题(解析版)
- 《智慧运输运营》全套教学课件
- 2024新教材高中历史 第八单元 中华民族的抗日战争和人民解放战争 第25课 人民解放战争教学设计 部编版必修中外历史纲要上
- 《统计分析与SPSS的应用(第7版)》课件全套 第1-12章 SPSS统计分析软件概述
- 机收甘蔗杂质含量抽样检测操作规程
评论
0/150
提交评论