当前位置:高等教育资讯网  >  中国高校课件下载中心  >  大学文库  >  浏览文档

兰州大学信息学与工程学院:《Windows SDK程序设计基础》Windows程序的基本结构(程建军)

资源类别:文库,文档格式:PDF,文档页数:13,文件大小:521.67KB,团购合买
一、Windows窗口程序的基本结构 二、 Windows程序的基本结构
点击下载完整版文档(PDF)

2007年暑期学校课程 2007年12月7日·实验楼A405 信息学与工程学 Windows SDK程序设计基础 Windows程序的基本结构 程建军 小结 访问主页 标题页 1909 第1页共13页 返回 兰州大学 全屏显示 信息科学与工程学院 关闭 退出 chengjianjun@lzu.edu.cn

Windows§SÄ( ( ¯ Ì  I K  JJ II J I 1 1   13  ˆ £  ¶ w « ' 4 ò Ñ ⑧ 2007cÛÏÆ‘§ 2007c127F· ¢¢A405 Windows SDK §SOÄ: § ï  = ² Œ Æ & E ‰ Æ † ó § Æ  chengjianjun@lzu.edu.cn

大 信息学与工程学 主要内容 Windows窗口程序的基本结构 Windows程序的基本结构 小结 WinMain函数 窗口过程 访问主页 Windows程序的消息机制 标题页 MSG结构体类型 消息队列与消息循环 第2页共13页 返回 Windows程序从启动到结束的过程 全屏显示 关闭 退出

Windows § S  Ä  (  ( ¯ Ì  I K  JJ II J I 1 2   13  ˆ £  ¶ w « ' 4 ò Ñ Ì ‡ S N ⑧ Windows I  § S  Ä  (  ⑧ WinMain ¼ ê ⑧ I  L § ⑧ Windows § S žE Å › ⑧ MSG (  N a . ⑧ žE è  †žE Ì ‚ ⑧ Windows § S l éÄ ( å  L §

Windows程序的基本结构 例:简单的 Windows窗口程序 #include "windows. h" 信息科学与工程学 char szclassName ]="FirstWindow"; char szAppTitle[]="我们的第一个Windows窗口程序"; char szStrDisp[]="大家好,第一个窗口演示程序!希望能起到抛砖引玉的作用"; LRESULT CALLBACK WinProc(HWND hwin, UInT uMsg WPARAM wPrm, LPARAM 1Prm) Windows程序的基本结构 小结 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE LPSTR IpCmdLine, int nCmdShow){ WNDCLASS wCi 访问主页 HWND hwin; MSG msgMessage; 标题页 wc. hInstance=hInstance; wc. hIcon=LoadIcon(NULL, IDI_APPLICATION); wc. hCursor=LoadCursor(NULL, IDC_ ARROW); 第3页共13页 wc. hbrBackground=(HBRUSH )GetStockobject (WHITE_BRUSH); 返回 wC. IpfnWndProc=WinProc; wc. IpszClassName=szClassName; 全屏显示 wC. IpszMenuName=NULL; 关闭 wC. style=_HREDRAW CS_VREDRAW; wC. cbclsExtra=; 退出 wC. cbWndExtra=;

Windows§SÄ( ( ¯ Ì  I K  JJ II J I 1 3   13  ˆ £  ¶ w « ' 4 ò Ñ ⑧ Windows§SÄ( ~µ{üWindowsI§S #include "windows.h" char szClassName[]="FirstWindow"; char szAppTitle[]="·‚1‡WindowsI§S"; char szStrDisp[]="Œ[Ч1‡Iü«§SœF"Uå<ڌŠ^"; LRESULT CALLBACK WinProc(HWND hWin,UINT uMsg,WPARAM wPrm,LPARAM lPrm); int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow){ WNDCLASS wc; HWND hWin; MSG msgMessage; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpfnWndProc=WinProc; wc.lpszClassName=szClassName; wc.lpszMenuName=NULL; wc.style=CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra=0; wc.cbWndExtra=0;

if(! RegisterClass(&wc)) MessageBox(NULL,"注册窗口类失败","错误",MBOK); 海疗 return -1 hwin=CreateWindow(szClassName, szAppTitle, WS_OVERLAPPEDWINDOW CW USEDEFAULT, CW USEDEFAULT CW USEDEFAULT, CW USEDEFAULT Windows程序的基本结构 小结 NULL, NULL, hInstance, 0) if(!hwin) MessageBox(NUL,"创建窗口失败","错误",MB_OK) return -1 访问主页 标题页 Sh。w啊 indow(h啊in, nCmdshow); UpdateWindow(hWin) while(GetMessage(&msgMessage, NULL, 0,0)) 第4页共13页 TranslateMessage(&msgMessage)i DispatchMessage(&msgMessage) 全屏显示 return 0: 关闭

Windows§SÄ( ( ¯ Ì  I K  JJ II J I 1 4   13  ˆ £  ¶ w « ' 4 ò Ñ if(!RegisterClass(&wc)){ MessageBox(NULL,"5þIa}","†Ø",MB_OK); return -1; } hWin=CreateWindow(szClassName,szAppTitle,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,0); if(!hWin){ MessageBox(NULL,"MïI}","†Ø",MB_OK); return -1; } ShowWindow(hWin,nCmdShow); UpdateWindow(hWin); while(GetMessage(&msgMessage,NULL,0,0)){ TranslateMessage(&msgMessage); DispatchMessage(&msgMessage); } return 0; }

LRESULT CALLBACK WinProc(HWND hWin, UINT uMsg, WPARAM wPrm, LPARAM IPrm)i switch(uMsg) case WM DESTROY Windows程序的基本结构 小结 P。 stouitMessage(0); break; 访问主页 defau1七 标题页 return DefwindowProc(hWin, uMsg, wPrm, pRm)i 第5页共13页 全屏显示 关闭

Windows§SÄ( ( ¯ Ì  I K  JJ II J I 1 5   13  ˆ £  ¶ w « ' 4 ò Ñ LRESULT CALLBACK WinProc(HWND hWin,UINT uMsg,WPARAM wPrm,LPARAM lPrm){ switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWin,uMsg,wPrm,lPrm); } return 0; }

Win main函数: Windows程序的入口点 函数原型为 int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst LPSTR lpCmdLine, int nShowCmd) 其中 Windows程序的基本结构 IE APIENTRY define AP IENTRY WINAPI 小结 WINAP是系统函数调用的约定,代替早先的 FAR PASCA,由系统 自动转换成合适的调用方式。FAR早期定义成fax,指跨段的存 访问主页 取,Win32不再使用,在32位的ⅤC中其定义是空; PASCAI指函数参 标题页 数从左到右求值,函数调用返回时由被调用函数自己清理栈 E HINSTANCE是 Windows中定义的一种句柄类型, hInst是当前应用程序 实例的句柄 第6页共13页 工PsR是指向字符串的32位指针类型,相当于chax*类 型,1 pEmoLine是指向命令行参数的指针 全屏显示 n ShowEd指定程序的窗口的显示方式 关闭 米

Windows§SÄ( ( ¯ Ì  I K  JJ II J I 1 6   13  ˆ £  ¶ w « ' 4 ò Ñ ⑧ WinMain()¼êµWindows§S\: ¼ê.µ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd); Ù¥µ ✑ APIENTRY =⇒ #define APIENTRY WINAPI WINAPI´XÚ¼êN^½§O@kFAR PASCAL§dXÚ gÄ=†¤Ü·N^ª"FAR@Ͻ¤far§ªã §Win32Ø2¦^§332 VC¥Ù½Â´¶PASCAL¼êë êl†m¦Š§¼êN^ˆ£ždN^¼êgCnÒ ✑ HINSTANCE´Windows¥½Â«éYa.§hInst´cA^§S ¢~éY ✑ LPSTR´  • i Î G 32   a . § ƒ  uchar *a .§lpCmdLine´•·-1ëê ✑ nShowCmd½§SIw«ª

吚 WINDCLASS结构体类型:指定窗口的形状、图标、鼠标光标等属性 海疗 定义如下 typedef struct_WNDCLASS U工NT //窗口样式 WNDPROC IpfnWndProc //指向窗口过程的指针 int cbClsExtra //分配给 WINDCLASS结构体变量的额外字节数 int //分配给窗口实例的额外字节数 Windows程序的基本结构 cbWndExtra 小结 HINSTANCE hInstance //应用程序的句柄 HICON hIcon //窗口图标的句柄 HCURSOR cUrsor //鼠标光标的句柄 HBRUSH hbrBackground;//背景画刷的句柄 访问主页 LPCTSTR IpszMenuName //窗口菜单名 标题页 LPCISTR1 pszClassName;//窗口类的名称 3 WNDCLASS, *PWNDCLASS 其中 第7页共13页 DPOROC是指向窗口过程(函数)的指针类 型, HICON、 HCURSOR和 HBRUSH也都是句柄类型, PCTSTR是指向常 量字符串的32位指针类型,相当于 const char*类型 全屏显示 关闭 米

Windows§SÄ( ( ¯ Ì  I K  JJ II J I 1 7   13  ˆ £  ¶ w « ' 4 ò Ñ ✑ WNDCLASS(Na.µ½I/G!ãI!àI1Iá5 ½ÂXe typedef struct _WNDCLASS { UINT style; //Iª WNDPROC lpfnWndProc; //•IL§ int cbClsExtra; //©‰WNDCLASS(NCþ i!ê int cbWndExtra; //©‰I¢~ i!ê HINSTANCE hInstance; //A^§SéY HICON hIcon; //IãIéY HCURSOR hCursor; //àI1IéY HBRUSH hbrBackground; //µxMéY LPCTSTR lpszMenuName; //Ièü¶ LPCTSTR lpszClassName; //Ia¶¡ } WNDCLASS, *PWNDCLASS; Ù¥µ ✑ WNDPOROC´  •I  L §(¼ ê)  a . §HICON!HCURSORÚHBRUSH Ñ ´ é Y a . §LPCTSTR´  • ~ þiÎG32 a.§ƒuconst char *a.

le Register1ass:向系统注册一个窗口类,以备后面创建该窗口类的 窗口,其函数原型为: 海疗 ATOM RegisterClass(CONST WNDCLASS *lpWndclass) 该函数调用成功,返回非0值,否则返回0 Ie CreateWindow:创建窗口,该函数的原型为: HWND CreateWindow( Windows程序的基本结构 LPCTSTR lpClassName, / registered class name 小结 LPCTSTR lpWindowName, / window name DWORD dwstyle // window style int x // horizontal position of window 访问主页 int y, // vertical position of window 标题页 int nwidth, / window width int nHeight window height HWND hWndparent handle to parent or owner window hmeNu hMenu / menu handle or child identifier HINSTANCE hInstance, / handle to application instance 第8页共13页 LPVOID IpParam // window-creation data 全屏显示 ShowWindow:以指定的方式显示创建的窗口 关闭 UpdateWindow:刷新窗口的客户区

Windows§SÄ( ( ¯ Ì  I K  JJ II J I 1 8   13  ˆ £  ¶ w « ' 4 ò Ñ ✑ RegisterClassµ•XÚ5þ‡Ia§±￾¡MïTIa I,Ù¼ê.µ ATOM RegisterClass(CONST WNDCLASS *lpWndClass); T¼êN^¤õ§ˆ£š0Š§ÄKˆ£0 ✑ CreateWindowµMïI§T¼ê.µ HWND CreateWindow( LPCTSTR lpClassName, // registered class name LPCTSTR lpWindowName, // window name DWORD dwStyle, // window style int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window HMENU hMenu, // menu handle or child identifier HINSTANCE hInstance, // handle to application instance LPVOID lpParam // window-creation data ); ✑ ShowWindowµ±½ªw«MïI ✑ UpdateWindowµM#Ir«

消息机制、消息循环、窗口过程 海疗 消息机制 用户在窗口上的操作有很大随意性,故 Windows窗口程序的执行没 有固定的路径,而有很大的随机性。 Windows程序的执行是事件驱 动的,窗口上发生某个事件,系统捕获该事件后用消息给应用程序 进行通知。 Windows程序的基本结构 小结 消息用一个结构体类型定义: typedef struct tagMSG t 访问主页 HWNDhwnd; //窗口句柄 标题页 UINT messagei //消息(事件)标识 WPARAM WParam //消息的第一附加数据,依 message而不同 LPARAM IParam; //消息的第二附加数据,依 message而不同 DWORD time //事件通知时的时间 POINT //事件通知时鼠标光标的位置,屏幕座标 第9页共13页 FMSG, *PMSG; 全屏显示 每个窗口都维护一个消息队列,系统通知给应用程序的事件以消息 关闭 形式存放在此队列中

Windows§SÄ( ( ¯ Ì  I K  JJ II J I 1 9   13  ˆ £  ¶ w « ' 4 ò Ñ ⑧ žEś!žÊ!IL§ ✑ žEś ^r3IþöŠk錑¿5§WindowsI§S‰1v k½´»§ k錑Å5"Windows§S‰1´¯‡° ħIþu),‡¯‡§XÚÓ¼T¯‡￾^žE‰A^§S ?1Ï" žE^‡(Na.½Âµ typedef struct tagMSG { HWND hwnd; //IéY UINT message; //žE£¯‡¤I£ WPARAM wParam //žE1N\ê⧝message ØÓ LPARAM lParam; //žE1N\ê⧝message ØÓ DWORD time; //¯‡Ïžžm POINT pt; //¯‡ÏžàI1I §¶4ŒI }MSG, *PMSG; z‡IÑ‘o‡žEè§XÚωA^§S¯‡±žE /ª3dè¥

消息循环 while(GetMessage(&msgMessage, NULL,0, 0))t TranslateMessage(&msgMessage)i DispatchMessage(&msgMessage)i 小结 循环不断调用 GetMessage()从消息队列中取出消息,调 用 TranslateMessage()对键盘消息进行转换,然后再调 访问主页 用 DispatchMessage?分发给窗口过程进行处理 标题页 t GetMessage:从消息队列中取出标识为w_gUrr的消息时,返回0; 否则返回非0值;消息队列中无消息时,阻塞程序 ★ TranslateMessage 把虚拟按键消息转换为字符按键消息,并将转 第10页共13页 换后得到的字符按键消息重新放入消息队列,等待下一轮循环取出 该消息进行处理 全屏显示 ★ DispatchMessage:把消息分发给窗口过程进行处理 关闭

Windows§SÄ( ( ¯ Ì  I K  JJ II J I 1 10   13  ˆ £  ¶ w « ' 4 ò Ñ ✑ žÊ while(GetMessage(&msgMessage,NULL,0,0)){ TranslateMessage(&msgMessage); DispatchMessage(&msgMessage); } Ì ‚ Ø ä N ^GetMessage()l ž E è  ¥  Ñ ž E § N ^TranslateMessage()é … ž E ? 1 = † § , ￾ 2 N ^DispatchMessage©u‰IL§?1?n * GetMessageµlžEè¥ÑI£WM_QUITžEž§ˆ£0¶ ÄKˆ£š0Š¶žEè¥ÃžEž§{l§S * TranslateMessageµrJ[U…žE=†iÎU…žE§¿ò= †￾iÎU…žE­#\žEè§eÓ̂Ñ TžE?1?n * DispatchMessageµržE©u‰IL§?1?n

点击下载完整版文档(PDF)VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
共13页,试读已结束,阅读完整版请下载
相关文档

关于我们|帮助中心|下载说明|相关软件|意见反馈|联系我们

Copyright © 2008-现在 cucdc.com 高等教育资讯网 版权所有