初学Windows编程笔记1——窗口和消息
Windows程序設計(第五版)
第三章 窗口與消息
源程序見原書39頁
在Visual Studio 2010 C++下測試
//------------------Start-------------------
#include <windows.h>
?????? ?
void ShowMessage(LPCWSTR text)
{
?? ?MessageBox(NULL, text, TEXT("ShowMessage"), 0) ;
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ;?????? ?
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
??? static TCHAR szAppName[] = TEXT ("Hello World!") ;
??? HWND?? hwnd ;
??? MSG??? msg ;
??? WNDCLASS wndclass ;
??? wndclass.style??????? = CS_HREDRAW | CS_VREDRAW ;???????
??? wndclass.lpfnWndProc? = WndProc ;
?? ?wndclass.cbClsExtra?? ??? ?= 0 ;
??? wndclass.cbWndExtra? = 0 ;
??? wndclass.hInstance?? = hInstance ;
??? wndclass.hIcon?????? = LoadIcon (NULL, IDI_APPLICATION) ;
??? wndclass.hCursor????? = LoadCursor (NULL, IDC_ARROW) ;
??? wndclass.hbrBackground= (HBRUSH) GetStockObject (GRAY_BRUSH) ;
?? ?wndclass.lpszMenuName? = NULL ;
??? wndclass.lpszClassName= szAppName ;
??? RegisterClass(&wndclass);//Register
??? hwnd = CreateWindow( szAppName,????? // window class name???????
?????????????????? TEXT ("Hello World Program"),?? // window caption
?????????????????? WS_OVERLAPPEDWINDOW,? // window style
?????????????????? CW_USEDEFAULT,// initial x position
?????????????????? CW_USEDEFAULT,// initial y position
?????????????????? CW_USEDEFAULT,// initial x size
?????????????????? CW_USEDEFAULT,// initial y size
?????????????????? NULL,???????? // parent window handle
?? ??? ??? ??? ??? NULL,??????????? // window menu handle
?? ??? ??? ??? ??? hInstance,?? // program instance handle
?? ??? ??? ??? ??? NULL) ;????? // creation parameters
?? ?/*
?? ?CreateWindow的過程中便會開始調用CALLBACK WndPROC
?? ?*/
?? ?ShowWindow (hwnd, iCmdShow);
???????
??? UpdateWindow (hwnd); //好像有沒有這個updateWin效果都一樣???
?? ?
?????? ?
??? while (GetMessage (&msg, NULL, 0, 0))
??? {
??? //if(msg.message == (UINT)WM_RBUTTONDOWN)//debug
??? // ?? {MessageBox (? NULL, TEXT ("Right B D"), TEXT("Halo"), 0);}
??????? TranslateMessage (&msg);//注釋掉對好像當前程序沒有影響[翻譯一些鍵盤消息?]
?? ??? ?
?? ??? ?DispatchMessage (&msg) ;
?? ???? /*DispatchMessage(...)
?? ??? ?[我認為應該是將消息(控制權)返回給Window(附帶著將消息發送給窗口過程)]
注釋掉之后,右上角的最小最大關閉三個按鈕失效.
?? ??? ?且注釋掉之后對窗口的操作都不會回調給WndProc(...)處理
?? ??? ?*/
?? ??? ?
??? //if(msg.message == (UINT)WM_RBUTTONDOWN)
?? ??? // {MessageBox (? NULL, TEXT ("Right B D3"), TEXT("Halo"), 0);}
??? }
?????? ?
??? return msg.wParam ;?????? ?
}
?????? ?
//這個WndProc的調用真是非常詭異
//一般情況下,確實是跟在DispatchMessage之中的
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
??? HDC hdc;????? ?
??? PAINTSTRUCT ps;
??? RECT rect;
?????? ?
??? switch (message)
??? {
?????? ?
?? ?case WM_RBUTTONDOWN:
?? ??? ?MessageBox (? NULL, TEXT ("Right B D CALLBACK"), TEXT("Halo"), 0) ;
?? ??? ?return 0;
??? case WM_CREATE:?????? ?
?? ??? ?MessageBox (? NULL, TEXT ("Window is Creating."), TEXT("Halo"), 0) ;
??????? return 0 ;
??? case?? WM_PAINT:
?? ??? ?/*
?? ??? ?在ShowWindow的過程中就會開始Paint,而且這個過程會重復40次左右。為什么會重復這么多次?
?? ??? ?*/
?? ??? ??? ?//ShowMessage(TEXT("WM_Paint"));//debug
??????????? hdc = BeginPaint (hwnd, &ps) ;
??????????? GetClientRect (hwnd, &rect) ;
?????? ?
??????????? DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
?????? ?
?? ??? ??? ?DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
?????? ?
??????????? EndPaint (hwnd, &ps) ;
?????? ?
??????????? return 0 ;
?????? ?
??? case?? WM_DESTROY:
?? ??? ??? ?//如果是銷毀窗口消息
????????????MessageBox(NULL, TEXT ("Win Destroying..."), TEXT("Halo"), 0) ;
??????????? PostQuitMessage (0) ;
?????? ?
??????????? return 0;
?? ?default:
?? ??? ?return DefWindowProc (hwnd, message, wParam, lParam) ;
??? }
}
//------END------
?
(1)新建一個窗口。 此過程分3步走
(1.1)聲明(并賦初值)WndCLASS wndclass;
(1.2)注冊窗口類 RegisterClass(...);//只有注冊過的窗口類才會產生回調
(1.3)創建窗口CreateWindow(...);//這期間將會第一次回調WndProc(...)
(2)顯示窗口 ShowWindow(...);期間會(多次)回調WndProc(...) ,并發送WM_PAINT消息
(3)UpdateWindow(...);//更新窗口
(4)不斷地循環接受各種消息(在窗口成型后)
While(GetMessage(..))
{
TranslateMessage(...);//翻譯消息
DispatchMessage(...);//窗口成型之后,所有的回調都來自于他,如果注釋掉,在窗口成型之后將不會回調WndProc()
}
總結
以上是生活随笔為你收集整理的初学Windows编程笔记1——窗口和消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐几款软件和几个网站
- 下一篇: 读史以明志,把握好自己的明天