创建窗口的代码及分析.docx_第1页
创建窗口的代码及分析.docx_第2页
创建窗口的代码及分析.docx_第3页
创建窗口的代码及分析.docx_第4页
创建窗口的代码及分析.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include #include LRESULT CALLBACK WinSunProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter);int WINAPI WinMain( HINSTANCE hInstance, / handle to current instance HINSTANCE hPrevInstance, / handle to previous instance LPSTR lpCmdLine, / command line int nCmdShow / show state)WNDCLASS wndcls;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);wndcls.hInstance=hInstance;wndcls.lpfnWndProc=WinSunProc;wndcls.lpszClassName=;wndcls.lpszMenuName=NULL;wndcls.style=CS_HREDRAW | CS_VREDRAW;/“|”表示或者,“&”在原有特征中去掉某特征;RegisterClass(&wndcls);HWND hwnd;hwnd=CreateWindow(,WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);MSG msg;while(GetMessage(&msg,NULL,0,0)/若第二个参数为hwnd则只对hwnd处理,NULL对所有消息处理 / 必须设为NULL,否则死循环,机器变慢;TranslateMessage(&msg);DispatchMessage(&msg);/该步骤执行回调函数WinSunProc;/循环return 0;/或者return msg.wParam;LRESULT CALLBACK WinSunProc( HWND hwnd, / handle to window那个窗口 UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter)HPEN hpen;HPEN holdpen;switch(uMsg)case WM_CHAR:char szChar20;sprintf(szChar,char is %d,wParam);/将字符串和int型连接,赋给szChar;MessageBox(hwnd,szChar,weixin,0);break;case WM_LBUTTONDOWN:MessageBox(hwnd,mouse clicked,weixin,0);HDC hdc;hdc=GetDC(hwnd);/用hdc保存GetDc函数返回的与特定窗口相关联的句柄,指定画布; hpen=CreatePen(PS_SOLID,3,RGB(255,0,0);/创建画笔,RGB红绿蓝参数; holdpen=(HPEN)SelectObject(hdc,hpen);/将hpen和hdc联系,保存返回值; Ellipse(hdc,100,100,200,200);/实现左击画一个内切圆;SelectObject(hdc,holdpen);/保存,恢复以前的默认值;TextOut(hdc,0,50,computer programing training,strlen(computer programing ); /在指定位置输出文字;ReleaseDC(hwnd,hdc);/使用完后释放资源,否则引起内存泄露;break;case WM_PAINT:/当部分窗口无效时重绘窗口,HDC hDC;/定义变量hdcPAINTSTRUCT ps;hDC=BeginPaint(hwnd,&ps);/获得上下文的句柄,(窗口,用于接收绘制信息的结构体指针);TextOut(hDC,0,0,hello,strlen(hello);EndPaint(hwnd,&ps);/仅PAINT中用begin.end.,其他地方用GetDc得到句柄;break;case WM_CLOSE: if(IDYES=MessageBox(hwnd,really quit?,hello,MB_YESNO)/IDYES写前面减少出错 DestroyWindow(hwnd);/销毁窗口后向窗口过程发送WM_DESTROY消息,但此时程序并未退出break;case WM_DESTROY:PostQuitMessage(0);/向应用程序的消息队列投递WM_QUIT消息并返回;break;default:return DefWindowProc(hwnd,uMsg,wParam,lParam);/调用默认窗口过程,对应用程序/未处理的其他消息提供默认处理return 0;创建一个完整的窗口需要经过下面四个操作步骤:设计一个窗口类;注册窗口类;创建窗口;显示及更新窗口Windows程序的入口函数WinMainint WINAPI WinMain( HINSTANCE hInstance, / handle to current instanc 实例句柄,唯一标识运行中的实例,数值 HINSTANCE hPrevInstance, / handle to previous instance 前一个实例句柄 总是NULL; LPSTR lpCmdLine, / command line以空终止的字符串,制定传给应用程序的命令行参数 int nCmdShow / show state窗口如何显示,最大化最小化隐藏。);窗口的设计typedef struct _WNDCLASS UINT style; /窗口样式,CS_HREDRAW,CS_VREDRAW,CS_NOCLOSE(禁用关闭按钮),CS_DBLCLKS(双击时向窗口过程发总鼠标双击消息) WNDPROC lpfnWndProc; /成员变量lpfnWndProc是函数指针,只想窗口过程函数,也称回调函数,当应用程序收到给某一窗口的消息时,就应该调用某一函数来处理这条消息,由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。一个窗口过程与某一个特定的窗口类相关联,通过WNDCLASS结构体中的lpfnWndProc变量指定,给予该窗口类创建的窗口实验同一个窗口过程。 int cbClsExtra; /附加内存空间,所有窗口共享,存储类的附加信息,初始化0; int cbWndExtra; /为窗口的结构分配和追加指定数目窗口附加内存空间,设置为0; HANDLE hInstance; /制定保护窗口过程的程序的实例句柄; HICON hIcon; /窗口类的图标句柄;NULL为默认图标; 为变量复制时,可以调用LoadIcon函数加载图标资源,返回句柄; HCURSOR hCursor; /光标句柄/必须是一个光标资源的句柄,如果这个成员为NULL,那么无论何时鼠标进入程序窗口,应用程序都必须明确设置光标的形状。 HBRUSH hbrBackground; /背景句柄画刷,重绘是擦除窗口背景, LPCTSTR lpszMenuName; 以空终止的字符串,菜单资源的名字,NULL没有默认菜单; LPCTSTR lpszClassName; 以空终止的字符串,窗口类的名字 WNDCLASS; 补充:1.UINT cbSize; /用来保存本结构体的所占字节数winclass.cbSize = sizeof (WNDCLASSEX);这是将本结构体的大小(占字节数)赋值给其成员变量cbSize,以后Windows系统只要访问cbSize就可知道wndclass的大小了,就不必每次都要用sizeof(WNDCLASSEX)来获取大小。2. stype是一个UINT即unsigned int的类型(共32位二进制位)。stype的可能值为如下的组合CS_HREDRAW 若移动或改变了窗口宽度,则刷新整个窗口CS_VREDRAW 若移动或改变了窗口高度,则刷新整个窗口CS_OWNDC 为该类中的每个窗口分配一个单值的设备描述表CS_DBLCLKS 当用户双击鼠标时向窗口程序发送一个双击的信息,同时,光标位于属 于该类的窗口中CS_PARENTDC 略CS_NOCLOSE 禁止系统菜单上的关闭命令CS_SAVEBITS 略注册窗口类:原型:ATOM RegisterClass(CONST WNDCLASS *lpWndClass);参数为上一步设计的窗口类对象的指针;创建窗口:例如:hwnd=CreateWindow( ,WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);如果x被设为CW_USEDEFAULT,那么系统为窗口选择默认的左上角坐标并忽略y参数。如果nWidth 设为CW_USEDEFFAULT,默认宽和高,nHeight忽略;子窗口,父窗口显示和更新窗口:ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);消息循环:MSG msg;while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return 0;消息由MSG结构体表示:typedef struct tagMSG HWND hwnd; /消息所属的窗口,用HWND类型的变量标识窗口; UNIT message; /消息的标识符,消息由数值标识,windows将消息对应的值定义为WM_XXX宏,如WM_CHAR,WM_LBUTTONDOWN WPARAM wParam; /附加信息;说明到底输入了什么样的字符,unsigned int LPARAM lParam; /附加信息,说明用户到底输入了什么样的字符;long DWORD time; /消息投递到queue中的时间; POINT pt; /鼠标当前位置;MSG;窗口过程函数:绘制文本:TextOut函数是用来显示文本的最常用的GDI函数,原型如下: BOOL TextOut( HDC hdc, / 设备描述表句柄 int nXStart, / 文本显示的水平起始位置 int nYStart, / 文本显示的垂直起始位置 LPCTSTR lpString, / 要显示的文本int cbString / 要显示的文本长度示例:case WM_PAINT: /绘制窗口 hdc = BeginPaint(hWnd, &ps); RECT rt; GetClientRect(hWnd, &rt); :SetBkColor(hdc,:GetSysColor(COLOR_BACKGROUND); :SetTextColor(hdc,RGB(255,255,255); DrawText(hdc, My window created by win32 API,-1,&rt, DT_CENTER); EndPaint(hWnd, &ps); return :DefWindowProc(hWnd, message, wParam, lParam); break;典型错误:1. unresolved externals error executing link,exe 选错了工程类型,应该是Win32 Application;2. 消息循环第二个参数必须为NULL;windows 编程的响应消息:消息名称 消息含义 WM_CREATE 应用程序创建一个窗口 WM_DESTROY 一个窗口被销毁 WM_MOVE 移动一个窗口 WM_SIZE 改变一个窗口的大小 WM_ACTIVATE 一个窗口被激活或失去激活状态 WM_SETFOCUS 获得焦点后 WM_KILLFOCUS 失去焦点 WM_ENABLE 改变Enable状态 WM_SETREDRAW 设置窗口是否能重画 WM_SETTEXT 应用程序发送此消息来设置一个窗口的文本 WM_GETTEXT 应用程序发送此消息来复制对应窗口的文本到缓冲区 WM_GETTEXTLENGTH 得到与一个窗口有关的文本的长度(不包含空字符) WM_PAINT 要求一个窗口重画自己 WM_CLOSE 当一个窗口或应用程序要关闭时发送一个信号 WM_QUERYENDSESSION 当用户选择结束对话框或程序自己调用ExitWindows函数 WM_QUIT 用来结束程序运行或当程序调用postquitmessage函数 WM_QUERYOPEN 当用户窗口恢复以前的大小位置时,把此消息发送给某个图标 WM_SHOWWINDOW 当隐藏或显示窗口是发送此消息给这个窗口 WM_DRAWITEM 当控件的可视外观改变时发送此消息给这些控件的拥有者 WM_SETFONT 当绘制文本时程序发送此消息得到控件要用的颜色 WM_GETFONT 应用程序发送此消息得到当前控件绘制文本的字体 WM_SETHOTKEY 应用程序发送此消息让一个窗口与一个热键相关连 WM_GETHOTKEY 应用程序发送此消息来判断热键与某个窗口是否有关联 WM_QUERYDRAGICON 此消息发送给最小化窗口 WM_KEYDOWN 按下一个键 WM_KEYUP 释放一个键 WM_CHAR 按下某键,并已发出WM_KEYDOWN,WM_KEYUP消息 WM_SYSKEYDOWN 当用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论