#include <windows.h> //底層實作視窗 的頭檔案
//6處理視窗程序
//CALLBACK 代表__stdcall 引數的傳遞順序:從右到左 以此入堆疊,并且在函式回傳前 清空堆疊
LRESULT CALLBACK WindowProc(
HWND hwnd, //訊息所屬的視窗句柄
UINT uMsg, //具體訊息名稱 WM_XXXX 訊息名
WPARAM wParam, //鍵盤附加訊息
LPARAM lParam //滑鼠附加訊息
)
{
switch (uMsg)
{
case WM_CLOSE:
//所有xxxWindow為結尾的方法 ,都不會進入到訊息佇列中,而是直接執行
DestroyWindow(hwnd); //DestroyWindow 發送另一個訊息 WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN: //滑鼠左鍵按下
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
char buf[1024];
wsprintf(buf,TEXT("x = %d,y = %d"), xPos, yPos);
MessageBox(hwnd, buf, TEXT("滑鼠左鍵按下"), MB_OK);
break;
}
case WM_KEYDOWN: //鍵盤
MessageBox(hwnd, TEXT("鍵盤按下"), TEXT("鍵盤按下"), MB_OK);
break;
case WM_PAINT: //繪圖
{
PAINTSTRUCT ps; //繪圖結構體
HDC hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));
EndPaint(hwnd, &ps);
}
break;
}
//回傳值用默認處理方式
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
//程式入口函式
//WINAPI 代表__stdcall 引數的傳遞順序:從右到左 以此入堆疊,并且在函式回傳前 清空堆疊
int WINAPI WinMain(
HINSTANCE hInstance, //應用程式實體句柄
HINSTANCE hPrevInstance, //上一個應用程式句柄,在win32環境下,引數一般為NULL,不起作用了
LPSTR lpCmdLine, //char * argv[]
int nShowCmd) //顯示命令 最大化、最小化 正常
{
//1、設計視窗
//2、注冊視窗
//3、創建視窗
//4、顯示和更新
//5、通過回圈取訊息
//6、處理訊息 (視窗程序)
//1、設計視窗
WNDCLASS wc;
wc.cbClsExtra = 0; //類的額外的記憶體
wc.cbWndExtra = 0; //視窗額外的記憶體
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //設定背景
wc.hCursor = LoadCursor(NULL, IDC_HAND); //設定游標 如果第一個引數為NULL,代表使用系統提供的游標
wc.hIcon = LoadIcon(NULL, IDI_ERROR); //圖示 如果第一個引數為NULL,代表使用系統提供的游標
wc.hInstance = hInstance; //應用程式實體句柄 傳入WinMain中的形參即可
wc.lpfnWndProc = WindowProc; //回呼函式 視窗程序
wc.lpszClassName = TEXT("WIN"); //指定視窗類名稱
wc.lpszMenuName = NULL; //選單名稱
wc.style = 0; //顯示風格 0代表默認風格
//2、注冊視窗類
RegisterClass(&wc);
//3、創建視窗
/*
lpClassName, 類名
lpWindowName, 標題名
dwStyle, WS_OVERLAPPEDWINDOW 風格
x, 顯示坐標 CW_USEDEFAULT 默認值
y,
nWidth, 寬高
nHeight,
hWndParent, 父視窗 NULL
hMenu, 選單 NULL
hInstance, 實體句柄 hInstance
lpParam) 附加值 NULL
*/
HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
//4、 顯示和更新
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
//5、 通過回圈取訊息
/*
HWND hwnd; 主視窗句柄
UINT message; 具體訊息名稱
WPARAM wParam; 附加訊息 鍵盤訊息
LPARAM lParam; 附加訊息 滑鼠訊息
DWORD time; 訊息產生時間
POINT pt; 附加訊息 滑鼠訊息 x y
*/
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
/*
_Out_ LPMSG lpMsg, 訊息
_In_opt_ HWND hWnd, 捕獲視窗 填NULL代表捕獲所有的視窗
_In_ UINT wMsgFilterMin, //最小和最大的過濾的訊息 一般填入0
_In_ UINT wMsgFilterMax) //填0代表捕獲所有訊息
*/
//if (GetMessage(&msg, NULL, 0, 0) == FALSE)
//{
// break;
//}
//翻譯訊息
TranslateMessage(&msg);
//不為false
//分發訊息
DispatchMessage(&msg);
}
return 0;
}
uj5u.com熱心網友回復:
問題是啥?要是簡單的視窗程式 直接用MFC 或者QT
沒必要用winmain自己去畫。
uj5u.com熱心網友回復:
你剛開始學,這個基礎的winmain去寫下也好,了解這個運行機制。uj5u.com熱心網友回復:
我想知道MFC具體有什么用,需要什么基礎知識uj5u.com熱心網友回復:
MFC在WINDOWS功能強大,需要C++,WINDOWS的運行機制……………………《易筋經》慢慢修煉吧
uj5u.com熱心網友回復:
我更喜歡WIN32(Windows桌面應用),和你的代碼一樣,WIN32主要就是訊息機制,比如case XX之類的,MFC能做的WIN32都可以做出來,不過是時間問題,WIN32比MFC會自由很多,復雜性也低,要做中/大型開發的話就選WIN32.
小型開發(純粹為了效率)的,用MFC,畢竟不可能花一大堆時間在小專案上面,MFC就是給你寫好了界面,只需要關心功能了,但界面比WIN32的會丑一些.
如果真的要進MFC的話WIN32是一個很重要的基礎,那些很會MFC的人WIN32基礎是肯定很好的,所以還是從WIN32開始學要好.
檔案:
https://docs.microsoft.com/zh-cn/cpp/mfc/mfc-desktop-applications?view=vs-2019
注意:微軟已經在一定程度上放棄MFC,一些內容不會再更新,
uj5u.com熱心網友回復:
已經處理 的 訊息 要 return (不是break))不要再 calldef轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/10503.html
標籤:基礎類
上一篇:請教下Office自動化的介面
