簡単なWin 32プログラムを解説します
19653 ワード
一、Windowsプログラムと普通のC或いはC++プログラムの違い
CやC++などの言語を学んだことがある人はみな知っています.私たちが書いたプログラムはすべて入り口、main関数ですが、Win 32プログラムでは、私たちの入り口関数は何ですか.それはどのように運行して、私たちがCあるいはC++で書いたコンソールプログラムと何が違いますか?
まず、Win 32プログラムと私たちのコンソールのプログラムの重要な違いは、Win 32プログラムがメッセージ応答プログラムであることです.例えば、ボタンをクリックすると、メッセージonButoonが生成され、その後、このメッセージが私たちのプログラムが維持しているメッセージキューに入り、プログラムの実行中にキュー内のメッセージを絶えず取り出します.対応する処理を行います.プログラムを終了するメッセージが取り出されるまで.
二、MSGの構造と構成を理解する
まず、Windowsのプログラムがメッセージに基づいてトリガーされる以上、Windowsはどのようにメッセージを定義しますか?以下にMSDNで説明するドキュメントの定義を示します.
CやC++などの言語を学んだことがある人はみな知っています.私たちが書いたプログラムはすべて入り口、main関数ですが、Win 32プログラムでは、私たちの入り口関数は何ですか.それはどのように運行して、私たちがCあるいはC++で書いたコンソールプログラムと何が違いますか?
まず、Win 32プログラムと私たちのコンソールのプログラムの重要な違いは、Win 32プログラムがメッセージ応答プログラムであることです.例えば、ボタンをクリックすると、メッセージonButoonが生成され、その後、このメッセージが私たちのプログラムが維持しているメッセージキューに入り、プログラムの実行中にキュー内のメッセージを絶えず取り出します.対応する処理を行います.プログラムを終了するメッセージが取り出されるまで.
二、MSGの構造と構成を理解する
まず、Windowsのプログラムがメッセージに基づいてトリガーされる以上、Windowsはどのようにメッセージを定義しますか?以下にMSDNで説明するドキュメントの定義を示します.
typedef struct tagMSG { // msg
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
:
HWND hwnd:hwnd , ; , C C++ , , , (HICON), (HCURSOR), (HWND), (HINSTANCE) 。 。
UINT message:message UINT( C C++ unsign int) , , 。message , , VC++ , WM_KEYDOWN。
WPARAM wParam: , message 。
LPARAM lParam: wParam , , message 。 wParam , 。
DWORD time:DWORD C C++ unsigned long ,time 。
POINT pt:POINT , , LONG x y, 。
MSG 。
、 WinMain
, C C++ main ,Win32 main , WinMain , :
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
);
:
HINSTANCE hInstance:
hInstance 。 。
HINSTANCE hPrevInstance:
hPrevInstance 。
LPSTR lpCmdLine:lpCmdLine , , ? C C++ main
char *argv[]。
int nCmdShow: , , , 。
WinMain main , , 。
WINAPI ? , __stdcall, , VC , __cdecl。
、
? , , , VC ( )WNDCLASS。 , :
typedef struct _WNDCLASS {
UINT style;
// ,
WNDPROC lpfnWndProc; // ,
int cbClsExtra; // , 0
int cbWndExtra; // , 0
HANDLE hInstance; // , WinMain
HICON hIcon; // , , LoadIcon
HCURSOR hCursor; // , , LoadCursor
HBRUSH hbrBackground; // , (HBRUSH)
GetStockObject 。
LPCTSTR lpszMenuName; //
LPCTSTR lpszClassName; //
} WNDCLASS;
: , ,
, , 。 , , , 。 ,
lpfnWndProc 。 , lpfnWndProc 。
VC Windows , , (bit) 。 1 , , 0 , 。 1 , 。 , , , (bit) 1, bit 0。
UINT , | , &~ 。
, WinMain
WNDCLASS ,
WNDCLASS , , R
egisterClass(&wndcls) , WNDCLASS 。 HWND hwnd; CreateWindow, hwnd。 ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd); 。
、
, ,Windows , ? , , , 。
, MSG ,
MSG msg;
:
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
:
GetMessage , MSG , msg ; ,NULL ; ; 。 0, 。 BOOL , WM_QUIT , FALSE; , , 。
TranslateMessage , 、 , 。
DispatechMessage , 。 , , 。
、 ( )
LRESULT CALLBACK WinSunProc(
HWND hwnd, //
UINT uMsg, //
WPARAM wParam, // MSG
LPARAM lParam // MSG
);
CALLBACK _stdcall,LRESULT long 。
, WNDCLASS , switch , , , switch default:return DefWindowProc(hwnd,uMsg,wParam,lParam); case , , 。