C windows.h 建立視窗
阿新 • • 發佈:2021-02-19
技術標籤:C++
#include<windows.h>
#pragma comment(lib, "winmm.lib")
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, //hInstance是例項控制代碼,具體是一個數值
HINSTANCE hPrevInstance, //此引數通常總是定義為NULL
PSTR szCmdLine, //用來執行程式的命令列,有些Windows程式啟動時用它來把檔案裝入記憶體
int iCmdShow){//iCmdShow指明程式如何顯示(最大化?正常顯示?)
static TCHAR szAppName[] = TEXT("HelloWindows");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
// 用於類結構和Windows內部維護的視窗結構中預留一些額外空間
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(WHITE_BRUSH); //獲取一個圖形物件,這裡是一個用來對視窗的背景進行重繪的畫刷
wndclass.lpszMenuName = NULL; //指定視窗類的選單,NULL為不帶選單
wndclass.lpszClassName = szAppName; //視窗名
if(!RegisterClass(&wndclass)){//為應用程式註冊一個視窗類
// 註冊失敗
MessageBox(NULL,
TEXT("本程式需要windows NT"),
szAppName,
MB_ICONERROR
);
return 0;
}
// 函式原型:HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HANDLE hlnstance,LPVOID lpParam);
hwnd = CreateWindow(szAppName, //視窗名
TEXT("Hello Programe"),//視窗內容
WS_OVERLAPPEDWINDOW, //視窗風格
CW_USEDEFAULT, //初始X座標
CW_USEDEFAULT, //初始Y座標
CW_USEDEFAULT, //初始X方向的尺寸
CW_USEDEFAULT, //初始Y方向的尺寸
NULL, //父視窗控制代碼
NULL, //菜 單控制代碼,或依據視窗風格指明一個子視窗標識
hInstance, //程式例項控制代碼
NULL //建立引數, 指向一個值的指標,該值傳遞給視窗 WM_CREATE訊息
);
/*函式功能:該函式設定指定視窗的顯示狀態。
函式原型:BOOL ShowWindow(HWND hWnd, int nCmdShow);*/
ShowWindow(hwnd, iCmdShow);//建立完之後,開始顯示
// 如果視窗更新的區域不為空,UpdateWindow函式就傳送一個WM_PAINT訊息來更新指定視窗的客戶區。
// 函式繞過應用程式的訊息佇列,直接傳送WM_PAINT訊息給指定視窗的視窗過程,如果更新區域為空,則不傳送訊息。
UpdateWindow(hwnd);
/*GetMessage是從呼叫執行緒的訊息佇列裡取得一個訊息並將其放於指定的結構。
此函式可取得與指定視窗聯絡的訊息和由PostThreadMessage寄送的執行緒訊息。
此函式接收一定範圍的訊息值。GetMessage不接收屬於其他執行緒或應用程式的訊息。
獲取訊息成功後,執行緒將從訊息佇列中刪除該訊息。函式會一直等待直到有訊息到來才有返回值。*/
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg); //翻譯一些鍵盤訊息
DispatchMessage(&msg); //將訊息傳送給視窗過程
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
){
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message){
case WM_CREATE:
//播放聲音檔案
PlaySound(TEXT("hellowin.wav"),//播放視窗開啟的聲音
NULL,
SND_FILENAME | SND_ASYNC
);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); //標明視窗繪製開始
GetClientRect(hwnd, &rect); //獲取視窗客戶區的尺寸
// 顯示一個文字字元擦混
DrawText(hdc,
TEXT("Hello, windows 10"),
-1,
&rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER
);
EndPaint(hwnd, &ps); //結束視窗繪製
return 0;
case WM_DESTROY:
PostQuitMessage(0); //將退出訊息插入訊息佇列
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam); //執行預設的訊息處理
}