使用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)
代碼
#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;
}
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。