Windows编程的初步了解

要使用c语言,调用WIN32 API进行Windows程序设计,首先要包含windows.h头文件,入口函数是WinMain函数,这点不同于控制台程序的main函数入口,WINAPI是一个宏定义,实际就是__stdcall调用Windows函数的意思。

句柄概念:一个对象的值(32位int数值),通过句柄可以找到对应的对象,具体又分为窗口句柄、实例句柄、设备环境句柄、图标光标句柄等。

具体步骤包括:创建窗口类,注册窗口类,创建窗口,更新窗口,循环等待窗口消息。

处理窗口消息需要调用窗口过程函数,LRESULT是宏定义long,CALLBACK类似于WINAPI,传参包括窗口句柄及消息类型等,每个窗口有自己的窗口过程函数。

除了自定义消息响应,也可使用缺省的窗口响应DefWindowProc。

  1. #include <windows.h>  
  2. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//回调函数声明  
  3. int WINAPI WinMain(HINSTANCE hInstance,  
  4.                    HINSTANCE hPrevInstance,  
  5.                    PSTR szCmdLine,  
  6.                    int iCmdShow)//WinMain入口函数  
  7. {  
  8.     static TCHAR szAPPName[]=TEXT("HelloWin");  
  9.     HWND hwnd;//窗口句柄  
  10.     MSG msg;//消息结构体  
  11.     WNDCLASS wndclass;//窗口类  
  12.     //窗口类成员变量赋值  
  13.     wndclass.style =CS_HREDRAW |CS_VREDRAW;//窗口类型水平重画和竖直重画  
  14.     wndclass.lpfnWndProc=WndProc;//窗口过程函数  
  15.     wndclass.cbClsExtra=0;//  
  16.     wndclass.cbWndExtra=0;  
  17.     wndclass.hInstance=hInstance;//窗口实例句柄  
  18.     wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//加载窗口图标  
  19.     wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//加载窗口光标  
  20.     wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口画刷背景  
  21.     wndclass.lpszMenuName=NULL;//菜单名字  
  22.     wndclass.lpszClassName=szAPPName;//窗口名称  
  23.     //注册窗口类  
  24.     if(!RegisterClass(&wndclass))  
  25.     {  
  26.         MessageBox(NULL,TEXT("This program requires Windows NT!"),szAPPName,MB_ICONERROR);//若注册失败,则弹出消息对话框  
  27.         return 0;  
  28.     }  
  29.     //创建窗口  
  30.     hwnd=CreateWindow(szAPPName,  
  31.         TEXT("The Hello Program"),  
  32.         WS_OVERLAPPEDWINDOW,  
  33.         CW_USEDEFAULT,  
  34.         CW_USEDEFAULT,  
  35.         CW_USEDEFAULT,  
  36.         CW_USEDEFAULT,  
  37.         NULL,  
  38.         NULL,  
  39.         hInstance,  
  40.         NULL);  
  41.     //显示窗口  
  42.     ShowWindow(hwnd,iCmdShow);//WinMain传递给iCmdShow的为SW_SHOWNORMAL  
  43.     UpdateWindow(hwnd);//更新窗口或者重画窗口,通过调用WM_PAINT消息  
  44.     //循环获取消息队列  
  45.     while(GetMessage(&msg,NULL,0,0))  
  46.     {  
  47.         TranslateMessage(&msg);//翻译键盘消息  
  48.         DispatchMessage(&msg);//发送消息  
  49.     }  
  50.     return msg.wParam;  
  51. }  
  52. //窗口过程函数  
  53. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)  
  54. {  
  55.     HDC hdc;//设备句柄  
  56.     PAINTSTRUCT ps;//PAINT结构体  
  57.     RECT rect;//RECT结构体  
  58.     switch(message)//判断消息类型  
  59.     {  
  60.     case WM_CREATE://创建窗口消息  
  61.         PlaySound(TEXT("1.mp3"),NULL,SND_FILENAME|SND_ASYNC);//播放声音  
  62.         return 0;  
  63.     case WM_PAINT://PAINT消息  
  64.         hdc=BeginPaint(hwnd,&ps);//开始PAINT  
  65.         GetClientRect(hwnd,&rect);//获得客户区域  
  66.         DrawText(hdc,TEXT("Hello,Windows 98!"),-1,&rect,  
  67.             DT_SINGLELINE|DT_CENTER|DT_VCENTER);//绘制字符串  
  68.         EndPaint(hwnd,&ps);//结束绘制  
  69.         return 0;  
  70.     case WM_DESTROY://销毁消息  
  71.         PostQuitMessage(0);//将结束消息加入消息队列  
  72.         return 0;  
  73.     }  
  74.     return DefWindowProc(hwnd,message,wParam,lParam);//返回缺省的窗口过程函数  
  75. }

阅读更多

没有更多推荐了,返回首页