日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

初学Windows编程笔记1——窗口和消息

發布時間:2025/4/16 windows 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初学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——窗口和消息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。