kouzone.com 快播下载 快播增强版 快播最新般 快播资源 快播电影网 快播伦理片 快播电影搜索qvod免费电影 快播下载 快播增强版 快播最新般qvod资源 伦理片
查看文章 |
Windows程序入门教程
2007-04-12 23:14
Windows程序入门教程 前骤: 1.第一个windows程序: 先讲几个专有名词:HINSTANCE 由handle(句柄)和instance(实例) 句柄,类似于C中的指针,指向资源,是资源的标识。操作系统要管理和操作这些资源,都是通过句柄(HANDLE)来找到对应的资源。按资源的类型可以分为: 窗口句柄——HWND 实例句柄——HINSTANCE 图标句柄——HICON 光标句柄——HCURSOR 画刷句柄——HBRUSH 设备内容句柄——HDC 下面是一个简单的windows程序。
CODE:
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0); return 0 ; } WinMain的原函数 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 这个函数照着原函数写就行。 MessageBox的原函数: MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType) 参数解释: hWnd:为窗口句柄,h代指handle[句柄] lpText:要显示的消息, lp代指 long point[长指针] lpCaption:消息框的标题 uType:消息框的按扭的样式 其中lpText和lpCaption的内容可以用TEXT(“………… ”)或直接用(“…………”) 编写自己的窗口: #include<windows.h> 一:主函数——程序的入口点 int WINAPI WinMain( ) { ① 设计窗口类: WNDCLASS wndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW; . …… 十个字段 …… …… wndclass.lpszClassName=”Lei”; ② 注册窗口类: RegisterClass(&wndclass); ③ 创建窗口: HWND hwnd; hwnd=CreateWindow(); ④ 显示及更新窗口: ShowWindow(); UpdateWindow(); ⑤ 消息循环: MSG msg; While(GetMessage(&msg,NULL,0,0)) { TranlateMessage(&msg); DispatchMessage(&msg) } return msg.wParam; } 二:消息处理函数——操作系统调用 LRESULT CALLBACK WndProc( ) { PAINTSTRUCT ps; HDC hdc; RECT rect; switch(message) { case WM_PAINT: …… return 0; case WM_DESTORY: …… return 0; } return DefWindowProc() ; } 上面只是给出了一个窗口程序的模板块,也就是说一个窗口程序主要由这些组成。由上面我们知,要编出一个窗口程序,就要经过 设计窗口类、注册窗口类、创建窗口、显示及更新窗口。再通过系统调用WndProc函数(消息处理函数)来使程序不断运行以及使程序停止。 下面我们一个一个完成这些模块。 第零大块:程序入口点WinMain函数。照写。 第一大块:设计窗口类: 窗口依照某一窗口类别建立,窗口类别用以标识处理窗口消息的窗口消息处理程序。 先定义wndclass结构。接着初始化这结构的10个字段。。 WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW ; //定义窗口类的样式 //CS为CLASS和STYLE的第一个字母的缩写 wndclass.lpfnWndProc = WndProc ; //lpfn代指:指向函数的长指针, //fn为function的缩写。 //WndProc就是消息处理函数,这个函数名可以改,但一定要跟 //下文定义的函数名一样,不过,没必要改。这个函数通过系统//调用,但代码必需我们写。 wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; //这两个字段用于在窗口类别结构和Windows内部保存的窗// 口结构中预留一些额外空间 //设定为0,表示不使用它们。 wndclass.hInstance = hInstance ; //程序的执行实体句柄 wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //加载图标,当加载的图 //标是标准的图标时,LoadIcon的第一个参数必 //需指定为NULL。IDI为ID和I(ICON)的组合。 //IDI_APPLICTION为应用程序的图标。 wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //同上。IDC中的C为CURSOR //IDC_ARROW表示当我们的鼠标移到这个应用程序上的时候为一个前头光标。 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //取得绘制窗口背景的画刷对象 (HBRUSH)为强制转换类型。//这里指定为白色画刷,即这个程序得到的是白色背景。 wndclass.lpszMenuName = NULL ; //这个例子无菜单,所以菜单名为NULL wndclass.lpszClassName = “Lei” //这个类的类名。注意,这里的类名和下文 //的CreateWindow的第一个参数必需相同。这里定义这个类名为Lei 第二大块:注册窗口: RegisterClass(&wndclass); 第三大块:建立窗口(哈,终于到了创建窗口的时刻) 先定义窗口句柄:HWND hwnd; 然后调用创建窗口函数CreateWindow; 即为: HWND hwnd; hwnd = CreateWindow (“Lei”, //窗口类名,必需和上面的一致。 TEXT ( "The Hello Program"), // 窗口的标题 WS_OVERLAPPEDWINDOW, // 窗口的样式,以WS_开头的宏。 //#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \ // WS_CAPTION | \ // WS_SYSMENU | \ // WS_THICKFRAME | \ // WS_MINIMIZEBOX | \ // WS_MAXIMIZEBOX) // 可以看出这个窗口是一个既有标题(WS_CAPTION)又有系//统菜单(WS_SYSMENU ),也有最小化最大化按扭 //(WS_MINIMIZEBOX | WS_MAXIMIZEBOX) CW_USEDEFAULT, // 初始化X的坐标位置 CW_USEDEFAULT, //初始化Y的坐标位置 CW_USEDEFAULT, //初始化窗口的宽度 CW_USEDEFAULT, //初始化窗口的高度 NULL, //父窗口句柄,这里没有,所以设为NULL NULL, // 窗口菜单句柄,没有,所以设为NULL //注意:窗口菜单的系统菜单不同,系统菜单指 //击一个应用程序的最左上角的那个图标所出现的菜单。 hInstance, //程序的执行实体句柄 NULL) ; //建立参数。指标设定为NULL,可用这个参数//存取稍后程序中可能引用到的数据。 至此,这个创建窗口的函数已写完。 第四大块:显示及更新窗口 原函数:ShowWindow(HWND hWnd,int iCmdShow); UpdateWindow(HWND hWnd) 于是在这里我们可以写成: ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); 第五大块:消息循环: 呼叫UpdateWindow之后,窗口就出现在视讯显示器上。程序现在必须准备读入使用者用键盘和鼠标输入的数据。Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。 程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息: MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } 消息循环以GetMessage呼叫开始,它从消息队列中取出一个消息: GetMessage(&msg,NULL,0,0) 这一呼叫传给Windows一个指标,指向名为msg的MSG结构。第二、第三和第四个参数设定为NULL或者0,表示程序接收它自己建立的所有窗口的所有消息 TranslateMessage (&msg) ;将msg结构传给Windows,进行一些键盘转换 DispatchMessage (&msg) ;又将msg结构回传给Windows。然后,Windows将该消息发送给适当的窗口消息处理程序,让它进行处理。这也就是说,Windows将呼叫窗口消息处理程序 最后,因为主函数是int型的,所以得要返回值 return msg.wParam; 至此,这个主函数就已经写完了。 好了,现在写窗口消息处理函数了。 窗口消息处理函数: 原函数:LRESULT CALLBACK WndProc(WHND hwnd,UINT message, WPARAM wParam,LPARAM lParam) 一般来说,Windows程序写作者使用switch和case结构来确定窗口消息处理程序接收的是什么消息,以及如何适当地处理它。窗口消息处理程序在处理消息时,必须传回0。窗口消息处理程序不予处理的所有消息应该被传给名为DefWindowProc的Windows函数。从DefWindowProc传回的值必须由窗口消息处理程序传回。 在这个程序中,我们只处理两个消息:WM_PAINT 和WM_DESTROY (WM为Window Message的缩写)。 一.WM_PAINT [引用] 当窗口显示区域的一部分显示内容或者全部变为「无效」,以致于必须「更新画面」时,将由这个消息通知程序。显示区域为什么会无效呢? 在使用者改变HELLOWIN窗口的大小后,显示区域的显示内容重新变得无效 当使用者将HELLOWIN最小化,然后再次将窗口恢复为以前的大小时,Windows将不会保存显示区域的内容。 在移动窗口以致其相互重迭时,Windows不保存一个窗口中被另一个窗口所遮盖的内容。在这一部分不再被遮盖之后,它就被标志为无效。 对这个消息,我们来看一下这个例子 case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; 这个消息,几乎都是从hdc = BeginPaint (hwnd, &ps),然后由EndPaint (hwnd, &ps)结束。 在hdc = BeginPaint (hwnd, &ps) 之后就是呼叫GetClientRect这个函数。第一个参数是窗口句柄,第二个参数是一个指标,指向一个RECT型态的rectangle(矩形)结构。 DrawText可以输出文字(正如其名字所表明的一样)。由于该函数要输出文字,第一个参数是从BeginPaint传回的设备内容句柄,第二个参数是要输出的文字,第三个参数是 -1,指示字符串是以字节0终结的。DrawText最后一个参数是一系列位旗标,旗标指示了文字必须显示在一行上,水平方向和垂直方向都位于第四个参数指定的矩形中央。 WM_DESTROY消息 WM_DESTROY消息是另一个重要消息。这一个消息指示,Windows正在根据使用者的指示关闭窗口。该消息是使用者单击Close按钮或者在程序的系统菜单上选择 Close时发生的(在本章的后面,我们将详细讨论WM_DESTROY消息是如何生效的)。 HELLOWIN通过呼叫PostQuitMessage以标准方式响应WM_DESTROY消息: PostQuitMessage (0) ; 该函数在程序的消息队列中插入一个WM_QUIT消息。 好了,接下来,我们把这个程序的全部写下来。
CODE:
#include <windows.h> //这个程序所要包含的头文件
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //对消息处理函数的声明 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) //主函数,程序的入口点 { 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 = "Lei"; //窗口类类名,必需与下文一致 //注册窗口类 RegisterClass (&wndclass) ; //创建窗口 hwnd = CreateWindow ("Lei", // window class name TEXT ("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters ShowWindow (hwnd, iCmdShow) ;//显示窗口 UpdateWindow (hwnd) ;//更新窗口 //消息循环 while (GetMessage (&msg, NULL, 0, 0)) //从消息对列中取得一条消息 { TranslateMessage (&msg) ;// 将msg结构传给Windows,进行一些键盘转换 DispatchMessage (&msg) ;// 又将msg结构回传给Windows。然后,Windows //将该消息发送给适当的窗口消息处理程序,让它进行处理 } return msg.wParam ;// 结构的wParam字段是传递给PostQuitMessage函数的值(通// 常是0)。然后return叙述将退出WinMain并终止程序 } //窗口消息处理函数 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; //设备内容句柄 PAINTSTRUCT ps ; RECT rect ; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ;// 。窗口消息处理//程序不予处理的所有消息应该被传给名为DefWindowProc的Windows函数 } |
最近读者: