使用VC++編寫了一個Windows窗口應用函數。

一、編寫一個Windows窗口應用函數

1、創建窗口 CreateWindow()函數

  • 具體的格式可以直接複製MSDN Library中的函數格式
  • 句柄很重要,類似指針,找到資源
  • 不會就查MSDN Library!!!

2、消息循環(操作系統--應用程序--消息隊列的關係)

  • 操作系統接收應用程序的窗口消息,將其投放到消息隊列中
  • 應用程序通過GetMessage()函數調用消息隊列中的消息
  • 應用程序調用DispatchMessage,將消息傳給操作系統
  • 系統利用WNDCLASS結構體中的lpfnWndProc成員保存的窗口過程函數的指針調用窗口過程函數,對消息進行處理

3、窗口過程函數 LRESULT CALLBACK WinSunProc()函數

(1)需要注意其中的VM_CLOSE和VM_DESTROY消息的區別

  • VM_CLOSE把窗口關了,但是其後台還在運行
  • VM_DESTROY把窗口關閉的同時,也關閉了後台的運行

(2)在處理VM_LBUTTONDOWN消息時,記得要釋放DC,否則會造成內存泄露

(3)使用if語句做判斷時,可以把常量寫在前面(x=1,1=x會報錯,1==x)

vc_redist win7 家庭版_消息循環

 

代碼

 

#include <windows.h>
#include <stdio.h>
 
//窗口過程函數
LRESULT CALLBACK WinSunProc(  
  HWND hwnd,      // handle to window,句柄--資源標識符
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);
 
//WinMain函數
int WINAPI WinMain(  
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
 WNDCLASS wndclass;
 wndclass.style=CS_HREDRAW | CS_VREDRAW;//窗口樣式
 wndclass.lpfnWndProc=WinSunProc;//函數指針,指向窗口函數過程,窗口過程函數是一個回調函數
 wndclass.cbClsExtra=0;//附加值設為0
 wndclass.cbWndExtra=0;//附加值設為0
 wndclass.hInstance=hInstance;//指向包含窗口過程的程序的實例句柄
 wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);//圖標
 wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);//光標
 wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//窗口的背景,需要做一個強制類型轉換
 wndclass.lpszClassName="Weixin2003";//指定菜單資源的名字
 wndclass.lpszMenuName=NULL;//指定窗口類的名字
 RegisterClass(&wndclass);//註冊窗口類
 
 //創建窗口,定義一個變量保存成功創建窗口後的句柄
 HWND hwnd;
 hwnd = CreateWindow("Weixin2003","XX大學",WS_OVERLAPPEDWINDOW,
 0,0,600,400,NULL,NULL,hInstance,NULL);
 
 //顯示及刷新窗口
 ShowWindow(hwnd,SW_SHOWNORMAL);
 UpdateWindow(hwnd);
 
 //定義消息結構體,開始消息循環
 MSG msg;
 while(GetMessage(&msg,NULL,0,0))
 {
 TranslateMessage(&msg);//虛擬鍵消息轉化為字符消息
 DispatchMessage(&msg);//分派一個消息到窗口過程
 
 }
 return msg.wParam;
}
 
//編寫窗口過程函數
LRESULT CALLBACK WinSunProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
 switch(uMsg)
 {
 case WM_CHAR:
 char szChar[20];
 sprintf(szChar,"char is %d",wParam);
 MessageBox(hwnd,szChar,"char",0);
 break;
 case WM_LBUTTONDOWN:
 MessageBox(hwnd,"mouse clicked","weixin",0);
 HDC hdc;
 hdc=GetDC(hwnd);
 TextOut(hdc,0,50,"編寫一個WinMain窗口界面",strlen("編寫一個WinMain窗口界面"));
 ReleaseDC(hwnd,hdc);
 break;
 case WM_PAINT:
 HDC hDC;
 PAINTSTRUCT ps;
 hDC=BeginPaint(hwnd,&ps);
 TextOut(hDC,0,0,"VC++學習第一課",strlen("VC++學習第一課"));
 EndPaint(hwnd,&ps);
 break;
 case WM_CLOSE:
 if(IDYES==MessageBox(hwnd,"是否可以結束?","weixin",MB_YESNO))
 {
 DestroyWindow(hwnd);
 }
 break;
 case WM_DESTROY:
 PostQuitMessage(0);//GetMessage函數只有在收到WM_DESTROY消息時才返回0,此時結束消息循環
 break;
 default:
 return DefWindowProc(hwnd,uMsg,wParam,lParam);
 }
 return 0;
}