/************************************************************************/
/* Win32程序設計基礎 */
/************************************************************************/
/************************************************************************/
/* Win32程序的註釋,雖然很簡單,但是這是Win32程序設計的起步,所以詳細些 */
/************************************************************************/
/************************************************************************/
/* 導入包含文件WINDOWS.H,此文件包含了其它的Windows頭文件 */
/* WINDEF.H 基本類型定義 */
/* WINNT.H 支持Unicode的類型定義 */
/* WINBASE.H 內核函數 */
/* WINUSER.H 用戶接口函數 */
/* WINGDI.H 圖形設備接口函數 */
/************************************************************************/
#include <windows.h>
/************************************************************************/
/* 窗口對象的過程處理函數 */
/* LRESULT: 簡單定義爲LONG(long) */
/* CALLBACK:__stdcall,指在Windows本身和用戶的應用程序之間發生的函數調 */
/* 用的特殊調用序列。 */
/* HWND: 窗口句柄,32位數字,該參數爲接受消息的窗口的句柄, */
/* CreateWindow函數的返回值。 */
/* UINT: unsigned int 無符號整型32位, */
/* 該參數爲MSG結構中的message域相同,表示該消息的數字 */
/* WPARAM: UINT,32位消息參數 */
/* LPARAM: LONG,32位消息參數 */
/************************************************************************/
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/************************************************************************/
/* Windows應用程序的主函數,有四個參數,名稱固定爲WinMain,返回值爲int */
/* WINAPI 在WINDEF.H中定義,#define WINAPI __stdcall */
/* HINSTANCE:實例句柄,數字 */
/* 在32位系統中WinMain的第二個參數總爲NULL(定義爲0) */
/* 第三個參數用於運行程序的命令行, */
/* 某些Windows應用程序使用這個參數在程序啓動時將文件加載到內存 */
/* LPSTR/PSTR:指向字符串的指針,相當於 char * */
/* 第四個參數指出程序最初顯示的方式,正常,最大化,最小化等。 */
/************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR lpszCmdLine, int iCmdShow)
{
/************************************************************************/
/* 定義窗口類 */
/* TCHAR:char */
/* _T和TEXT宏,功能一致,通常沒用,在Unicode系統中, */
/* 自動把後面的字符串轉換爲寬字符串 */
/************************************************************************/
TCHAR tcClassName[] = TEXT("My Window"); //窗口類名字符串
/************************************************************************/
/* WNDCLASS:窗口類結構,定義了窗口的一般特性,可以創建不同的窗口 */
/* typedef struct */
/* { */
/* UINT style ; */
/* WNDPROC lpfnWndProc ; */
/* int cbClsExtra ; */
/* int cbWndExtra ; */
/* HINSTANCE hInstance ; */
/* HICON hIcon ; */
/* HCURSOR hCursor ; */
/* HBRUSH hbrBackground ; */
/* LPCTSTR lpszMenuName ; */
/* LPCTSTR lpszClassName ; */
/* } */
/* WNDCLASS, * PWNDCLASS ; */
/************************************************************************/
WNDCLASS wc; //窗口類屬性描述結構
wc.lpszClassName = tcClassName; //窗口類名
wc.lpszMenuName = NULL; //窗口類菜單資源名
wc.lpfnWndProc = WndProc; //窗口對象的過程處理函數,指向函數的指針
wc.hInstance = hInstance; //當前進程對象句柄,接收於WinMain參數
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //窗口背景刷子對象
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //圖標對象
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //光標對象
wc.cbClsExtra = 0; //同類窗口對象公共數據區大小
wc.cbWndExtra = 0; //當前窗口對象私有數據區大小
wc.style = CS_HREDRAW | CS_VREDRAW; //窗口類風格,水平或垂直尺寸改變後刷新
if (!RegisterClass(&wc)) //註冊窗口類,參數爲指向WNDCLASS結構的指針
{
/************************************************************************/
/* 窗口類註冊不成功的錯誤信息 */
/* MessageBox 消息框 */
/* 參數一:窗口句柄,如果沒有則爲NULL */
/* 參數二:消息框主體顯示的字符串 */
/* 參數三:消息框標題欄上的字符串 */
/* 參數四:winuser.h中定義的MB_開始的常數組合,消息框風格:按鈕,圖標 */
/* 爲0,則只有ok按鈕 */
/* 返回值:返回IDOK(1)。 */
/* 還可以返回IDYES、IDNO、IDCANCEL、IDABORT、IDRETRY、IDIGNORE等 */
/************************************************************************/
MessageBox(NULL, TEXT("RegisterClassError!"), TEXT("Error"), MB_ICONERROR);
return 0; //如果註冊失敗,返回並終止程序
}
/************************************************************************/
/* 定義窗口對象屬性,指定有關窗口的更詳細信息 */
/************************************************************************/
TCHAR tcWindowCaptionName[] = TEXT("Win32 API"); //窗口對象標題名稱
CREATESTRUCT cs; //窗口對象屬性描述結構,定義在WINUSER.H
cs.lpszClass = tcClassName; //窗口類名
cs.lpszName = tcWindowCaptionName; //窗口對象標題名稱,顯示在標題欄
cs.style = WS_OVERLAPPEDWINDOW; //窗口對象風格
cs.x = 100; //窗口對象在屏幕上的x座標
cs.y = 100; //窗口對象在屏幕上的y座標
cs.cx = 400; //窗口對象的寬度
cs.cy = 300; //窗口對象的高度
cs.hwndParent = NULL; //窗口對象的父窗口句柄
cs.hMenu = NULL; //窗口對象的菜單句柄或子窗口編號
cs.hInstance = hInstance; //當前進程的實例句柄,WinMain參數
cs.lpCreateParams = NULL; //創建參數指針,可以訪問以後想要引用的程序中的數據
/************************************************************************/
/* 創建窗口對象 */
/* 定義窗口句柄hWnd,值爲CreateWindows函數的返回值。 */
/* 即創建成功返回窗口的句柄,否則返回NULL */
/************************************************************************/
HWND hWnd = CreateWindow( cs.lpszClass,
cs.lpszName,
cs.style,
cs.x,
cs.y,
cs.cx,
cs.cy,
cs.hwndParent,
cs.hMenu,
cs.hInstance,
cs.lpCreateParams);
if (hWnd == NULL) //判斷創建是否成功
{
/************************************************************************/
/* 窗口對象創建不成功的錯誤提示 */
/************************************************************************/
MessageBox(NULL, TEXT("CreateWindowError!"), TEXT("Error!"),MB_ICONERROR);
return 0;
}
/************************************************************************/
/* 顯示窗口對象 */
/* 此時Windows內部已經創建了這個窗口。已經分配內存。 */
/* 但是要顯示在顯示器上還需要調用兩個函數。 */
/* ShowWindows(hwnd,iCmdShow) */
/* 第一個參數是剛剛用CreateWindow創建的窗口的句柄。 */
/* 第二個參數是傳給WinMain的iCmdShow。用來確定最初如何在屏幕上顯示窗口。*/
/* 也可以自定義選擇以選項: */
/* SW_SHOWNORMAL //常規 */
/* SW_SHOWMAXIMIZED //最大化 */
/* SW_SHOWMINNOACTIVE //只顯示在任務欄 */
/* UpdateWindow(hWnd) */
/* 導致客戶區域被繪製。通過給窗口過程(Wndproc)發送一個WM_PAINT消息實現 */
/************************************************************************/
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);//立即刷新窗口對象
/************************************************************************/
/* 消息檢索,消息循環 */
/* MSG:消息結構,被定義在WINUSER.H */
/* 消息循環以GetMessage調用開始,它從消息隊列中取出一個消息 */
/* 這一調用傳遞給Windows一個指向msg的MSG結構指針。 */
/* 第二、三、四個參數爲NULL或者0表示程序接收自己創建的所有窗口的所有消息*/
/* Windows用從消息隊列中取出的下一個消息填充msg結構的各個域 */
/* MSG:消息結構: */
/* typedef struct tagMSG */
/* { */
/* HWND hwnd ; //消息發向的窗口的句柄。 */
/* UINT message ; //消息標識符,一個數值,定義在Window頭文件中 */
/* WPARAM wParam ; //一個32位的消息參數,含義根據消息不同而不同 */
/* LPARAM lParam ; //同上 */
/* DWORD time ; //消息放入消息隊列時的時間 */
/* POINT pt ; //消息放入消息隊列時的鼠標座標 */
/* } */
/* MSG, * PMSG ; //結構名 */
/************************************************************************/
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
/************************************************************************/
/* 檢索消息;當檢索到WM_QUIT(其值爲0x0012)消息時,從消息循環中退出 */
/************************************************************************/
TranslateMessage(&msg);//將msg結構傳遞給Windows,進行虛擬鍵盤消息的轉換
DispatchMessage(&msg); //發送消息,由此操作系統調用相應的窗口過程處理消息
}
/************************************************************************/
/* 主窗口返回 */
/************************************************************************/
return msg.wParam;
}
/************************************************************************/
/* 窗口對象的過程處理函數 */
/* 四個參數與MSG結構中的前四個參數相同。 */
/* 程序通常不直接調用窗口過程,由Windows本身調用。 */
/* 程序可以通過SendMessage函數調用自己的窗口過程 */
/************************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
/************************************************************************/
/* 對消息進行分類處理 */
/* WINUSER.H爲每個消息定義以WM爲前綴的標識符 */
/*一般Windows程序元用switch和case結構來處理,此時必須返回0。 */
/*窗口過程不處理的其它消息必須傳遞給DefWindowProc函數, */
/*窗口過程返回該函數返回值 */
/************************************************************************/
switch (iMsg)
{
/************************************************************************/
/* 客戶區的繪製消息,窗口客戶區域無效時刷新 */
/************************************************************************/
case WM_PAINT:
{
/************************************************************************/
/* PAINTSTRUCT:繪圖結構,定義在WINUSER.H中 */
/* RECT:矩形結構 */
/* HDC:設備描述表句柄 */
/************************************************************************/
PAINTSTRUCT ps;
HDC hDC;
RECT rect;
/************************************************************************/
/* 對於WM_PAINT的處理幾乎總是從一個BeginPaint函數開始的: */
/* hDC = BeginPaint(hWnd, &ps) */
/* 而已一個EndPaint函數結束 */
/* EndPaint(hWnd, &ps) */
/* 兩個調用中第一個參數是程序的窗口句柄, */
/* 第二個參數是指向類型爲PAINTSTRUCT的結構指針 */
/************************************************************************/
hDC = BeginPaint(hWnd, &ps); //獲取顯示設備對象及繪製描述屬性
GetClientRect(hWnd, &rect); //獲取當前窗口對象客戶區矩形
SetBkMode(hDC,TRANSPARENT); //設置背景方式
SetTextColor(hDC, RGB(255, 0, 0)); //設置文本顏色
/************************************************************************/
/* 繪製文本 */
/* DrawText函數,第一個參數是從BeginPaint返回的設備描述表句柄 */
/* 第二個參數是要輸出的文本 */
/* 第三個參數是-1,表示文本串是以字節0終結的。 */
/* 第四個參數要繪製的矩形區域 */
/* 最後一個參數是系列標誌位,定義在WINDUSER.H中,水平、垂直中央,單行 */
/************************************************************************/
DrawText(hDC, TEXT("Hello, Win32!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndPaint(hWnd, &ps); //客戶區繪製結束,歸還顯示設備對象
return 0;
}
case WM_DESTROY: //接收到WM_DEFTROY消息
{
/************************************************************************/
/* 發送WM_QUIT消息,通知線程消息檢索循環,清除窗口主程序可以退出 */
/* PostQuitMessage(0)函數在消息隊列裏插入一個WM_QUIT消息 */
/************************************************************************/
PostQuitMessage(0);
return 0;
}
}
/************************************************************************/
/* 程序末處理的消息交給window系統的缺省窗口對象的過程處理函數處理 */
/************************************************************************/
return DefWindowProc(hWnd, iMsg, wParam,lParam);
}