[Win32]系列1

1.入口函数WinMain

 

  
  
  
  
  1. #include <windows.h> 
  2.  
  3. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  4.     LPSTR lpCmdLine, int nCmdShow) 
  5.     MessageBox(NULL, TEXT("一个最简单的Win32程序!"), TEXT("Win32程序"), MB_OK); 
  6.     return 0; 

WINAPI,APIENTRY,PASCAL等价的,

#define WINAPI __stdcall

调用约定,压栈方式等。

2.创建窗口

 

  
  
  
  
  1. #include <windows.h> 
  2.  
  3. LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); 
  4.  
  5. int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd) 
  6.     WNDCLASSEX wClass; 
  7.     ZeroMemory(&wClass,sizeof(WNDCLASSEX)); 
  8.     wClass.cbClsExtra=NULL; 
  9.     wClass.cbSize=sizeof(WNDCLASSEX); 
  10.     wClass.cbWndExtra=NULL; 
  11.     wClass.hbrBackground=(HBRUSH)COLOR_WINDOW; 
  12.     wClass.hCursor=LoadCursor(NULL,IDC_ARROW); 
  13.     wClass.hIcon=NULL; 
  14.     wClass.hIconSm=NULL; 
  15.     wClass.hInstance=hInst; 
  16.     wClass.lpfnWndProc=(WNDPROC)WinProc; 
  17.     wClass.lpszClassName=TEXT("窗口类名"); 
  18.     wClass.lpszMenuName=NULL; 
  19.     wClass.style=CS_HREDRAW|CS_VREDRAW; 
  20.  
  21.     if(!RegisterClassEx(&wClass)) 
  22.     { 
  23.         int nResult=GetLastError(); 
  24.         MessageBox(NULL, 
  25.             TEXT("注册窗口类失败."), 
  26.             TEXT("失败"), 
  27.             MB_ICONERROR); 
  28.     } 
  29.  
  30.     HWND hWnd=CreateWindowEx(NULL, 
  31.             TEXT("窗口类名"), 
  32.             TEXT("win32应用程序"), 
  33.             WS_OVERLAPPEDWINDOW, 
  34.             200, 
  35.             200, 
  36.             640, 
  37.             480, 
  38.             NULL, 
  39.             NULL, 
  40.             hInst, 
  41.             NULL); 
  42.  
  43.     if(!hWnd) 
  44.     { 
  45.         int nResult=GetLastError(); 
  46.  
  47.         MessageBox(NULL, 
  48.             TEXT("窗口创建失败."), 
  49.             TEXT("失败"), 
  50.             MB_ICONERROR); 
  51.     } 
  52.  
  53.     ShowWindow(hWnd,nShowCmd); 
  54.  
  55.     MSG msg; 
  56.     ZeroMemory(&msg,sizeof(MSG));/*清零*/ 
  57.  
  58.     while(GetMessage(&msg,NULL,0,0)) 
  59.     { 
  60.         TranslateMessage(&msg); 
  61.         DispatchMessage(&msg); 
  62.     } 
  63.  
  64.     return 0; 
  65.  
  66. LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 
  67.     switch(msg) 
  68.     { 
  69.         case WM_DESTROY: 
  70.         { 
  71.             PostQuitMessage(0); 
  72.             return 0; 
  73.         } 
  74.         break
  75.     } 
  76.  
  77.     return DefWindowProc(hWnd,msg,wParam,lParam); 
  
  
  
  
  1. 基本套路,可以把这个存个模版。


3.处理其他消息

   
   
   
   
  1. case WM_LBUTTONDOWN: 
  2.        TCHAR szFileName[MAX_PATH]; 
  3.        HINSTANCE hInstance = GetModuleHandle(NULL); 
  4.  
  5.        GetModuleFileName(hInstance, szFileName, MAX_PATH); 
  6.        MessageBox(hWnd, szFileName, TEXT("此程序是:"), MB_OK | MB_ICONINFORMATION);  
  7.        return 0;         

4.资源的使用

首先需要编辑一个资源文件*.rc,我是用的

http://www.resedit.net/

ResEdit:

第一次使用让你指定平台的include目录:

资源的头文件是resource.h

   
   
   
   
  1. #ifndef IDC_STATIC 
  2. #define IDC_STATIC (-1) 
  3. #endif 
  4.  
  5. #define IDI_MYICON                              101 
  6. #define IDR_MYMENU                              103 
  7. #define IDR_CNMENU                              106 
  8. #define IDM_STUFF_GO                            40000 
  9. #define IDM_____O_1                             40000 
  10. #define IDM__GO_SOMEWHERE_ELSE1                 40001 
  11. #define IDM_____X_1                             40001 
  12. #define IDM_FILE_EXIT                           40002 
  13. #define IDM____G_1                              40002 
  14. #define IDM_STUFF_M01                           40003 
  15. #define IDM_______W_1                           40003 
  16. #define IDM_FILE_OPEN                           40004 
  17. #define IDM_____T_1                             40004 


资源App.rc:

 

   
   
   
   
  1. // Generated by ResEdit 1.5.6 
  2. // Copyright (C) 2006-2010 
  3. // http://www.resedit.net 
  4.  
  5. #include <windows.h> 
  6. #include <commctrl.h> 
  7. #include <richedit.h> 
  8. #include "resource.h" 
  9.  
  10.  
  11.  
  12.  
  13. // 
  14. // Menu resources 
  15. // 
  16. LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
  17. IDR_CNMENU MENU 
  18.     POPUP "文件(&F)" 
  19.     { 
  20.         MENUITEM "打开(&O)", IDM_____O_1 
  21.         MENUITEM "退出(&X)", IDM_____X_1 
  22.     } 
  23.     POPUP "材料(&S)" 
  24.     { 
  25.         MENUITEM "去(&G)", IDM____G_1 
  26.         MENUITEM "转到别处(&W)", IDM_______W_1 
  27.         MENUITEM "测试(&T)", IDM_____T_1 
  28.     } 
  29.  
  30.  
  31.  
  32. LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
  33. IDR_MYMENU MENUEX 
  34.     POPUP "&File", 0, 0, 0 
  35.     { 
  36.         MENUITEM "&Open", IDM_FILE_OPEN, 0, 0 
  37.         MENUITEM "E&xit", IDM_FILE_EXIT, 0, 0 
  38.     } 
  39.     POPUP "&Stuff", 0, 0, 0 
  40.     { 
  41.         MENUITEM "&Go", IDM_STUFF_GO, 0, 0 
  42.         MENUITEM "G&o Somewhere else", IDM__GO_SOMEWHERE_ELSE1, 0, 0 
  43.         MENUITEM "M01", IDM_STUFF_M01, 0, 0 
  44.     } 
  45.  
  46.  
  47.  
  48. // 
  49. // Icon resources 
  50. // 
  51. LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
  52. IDI_MYICON         ICON           "icon1.ico" 


这样就可以在创建窗口类时,为窗口指定一个默认的菜单:

 

    
    
    
    
  1. wClass.lpszMenuName=MAKEINTRESOURCE(IDR_MYMENU); 

当然可以创建窗口时,不用窗口类的:

 

     
     
     
     
  1. HMENU hMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_CNMENU)); 
  2. HWND hWnd=CreateWindowEx(NULL, 
  3.         TEXT("窗口类名"), 
  4.         TEXT("win32应用程序"), 
  5.         WS_OVERLAPPEDWINDOW, 
  6.         200, 
  7.         200, 
  8.         640, 
  9.         480, 
  10.         NULL, 
  11.         hMenu,/*菜单*/ 
  12.         hInst, 
  13.         NULL); 

加载了中文的菜单,而不用默认的英文菜单。

 

你可能感兴趣的:(编程,Win32,Win32,api,sdk,Win32SDK)