Windows编程模型与API调用示例

Windows编程模型与API调用示例

 

Windows编程模型示意图:

 Windows编程模型与API调用示例_第1张图片 

 

 

打开VS2010,选择语言VC++,创建一个WIN32项目,例如叫DEMO。

 

打开DEMO.CPP文件,会看到VS已经帮我们写了几个函数(这几个函数其实是VS帮我们包了一层,原生函数后面会介绍):

 

////注册窗体函数

ATOM                                   MyRegisterClass(HINSTANCEhInstance);

 

////初始化

BOOL                                    InitInstance(HINSTANCE,int);

 

////处理windows消息的函数

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

 

注册窗口

WNDCLASSEX wcex;
 
         wcex.cbSize = sizeof(WNDCLASSEX);
         wcex.style                           = CS_HREDRAW | CS_VREDRAW;////窗口的风格
         wcex.lpfnWndProc  = WndProc;////窗口消息处理函数的指针
         wcex.cbClsExtra                = 0;////分配给窗口类结构之后的额外字节数
         wcex.cbWndExtra             = 0;////分配给窗口实例之后的额外字节数
         wcex.hInstance                 = hInstance;////窗口所对应的应用程序句柄
         wcex.hIcon                         =LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CGAMEDEMO));////窗口的坐标
         wcex.hCursor           = LoadCursor(NULL, IDC_ARROW);////窗口的鼠标
         wcex.hbrBackground       = CreateSolidBrush(RGB(100,0,0)); ////窗口的背景(这里调用了CreateSolidBrush API函数)
         wcex.lpszMenuName      = NULL,//MAKEINTRESOURCE(IDC_CGAMEDEMO);////窗口的菜单资源名称
         wcex.lpszClassName       = szWindowClass;////窗口类的名称
         wcex.hIconSm          = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
         return RegisterClassEx(&wcex);////注册窗口


 

创建窗口

hWnd =CreateWindow(
           szWindowClass,////创建窗口所用的窗口类的名称
          NULL,// szTitle, ////窗口标题
          WS_OVERLAPPEDWINDOW,////窗口风格,定义为普通型
      0,////窗口位置的X坐标
          0,////窗口位置的Y坐标
          1000,////窗口的宽度
          1000, ////窗口的高度
          NULL,////父窗口句柄
          NULL, ////菜单句柄
          hInstance,////应用程序句柄
          NULL);////一般为NULL


 

显示窗口

if (!hWnd)
   {
      return FALSE;
   }
   ////告诉系统显示窗口
   ShowWindow(hWnd, nCmdShow);
 
   ////立即显示窗口
   UpdateWindow(hWnd);
 


消息循环

 

         // 主消息循环:
         while (GetMessage(&msg, NULL, 0,0))
         {
                   if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
                   {
                            TranslateMessage(&msg);
                            DispatchMessage(&msg);
                   }
         }
 


消息处理函数以及API调用

 

/*

为了演示鼠标事件,在这里放了几个变量,存鼠标的坐标

*/

int a ,b;
char ac[25];
char bc[25];
char ret[50];
 
////HWND hWnd,窗口句柄
////UINT message,主消息
////WPARAM wParam,副消息1(例如,如果主消息是键盘消息,这里存键值)
////LPARAM lParam副消息2
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam)
{
         intwmId, wmEvent;
         PAINTSTRUCTps;
         HDC hdc;
 
         switch(message)
         {
        
        case WM_KEYDOWN:////键盘消息
                   switch(wParam){////从副消息中拿出键盘值
         caseVK_SPACE:
                   MessageBox(hWnd,_T("按下了空格键"),_T("test"),MB_OK);
                   break;
                   }
                   break;
 
         ////右键按下
         caseWM_RBUTTONDOWN:
                  
                   a= LOWORD(lParam);////从副消息里面拿鼠标点击的X坐标
                   b= HIWORD(lParam);////拿Y坐标
                   itoa(a,ac,10);
             itoa(b,bc,10);
 
                   strcat(ret,ac);
                   strcat(ret,",");
                   strcat(ret,bc);
 
                   MessageBoxA(hWnd,ret,"test",MB_OK);
                   strcpy(ret,"");
 
                   break;
         ////左键按下
         caseWM_LBUTTONDOWN:
 
                  
                   MessageBoxA(hwnd,
“按下了左键","test",MB_YESNO|MB_HELP|MB_ICONERROR);
                   break;
 
 
         caseWM_COMMAND:////菜单消息(因为用的VS,所以创建项目时候IDE给带了这个)
                   wmId    = LOWORD(wParam);
                   wmEvent= HIWORD(wParam);
                   //分析菜单选择:
                   switch(wmId)
                   {
                   caseIDM_ABOUT:
                            DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                            break;
                   caseIDM_EXIT:
                            DestroyWindow(hWnd);
                            break;
                   default:
                            returnDefWindowProc(hWnd, message, wParam, lParam);
                   }
                   break;
         caseWM_PAINT:
                   hdc= BeginPaint(hWnd, &ps);
                   //TODO: 在此添加任意绘图代码...
                   EndPaint(hWnd,&ps);
                   break;
         caseWM_DESTROY:////窗体销毁
                   PostQuitMessage(0);
                   break;
         default:
                   returnDefWindowProc(hWnd, message, wParam, lParam);
         }
         return0;
}


你可能感兴趣的:(编程,windows,api,null,callback)