小學期的項目要用到MFC,然而只能自學啦,找到一個自學網站挺好的,開始了第一天的自學~
http://v.dxsbb.com/jisuanji/555/#Introduce
知道了一個叫MSDN 的幫助系統,很好用的趕腳
首先要對C++的窗口程序有一個大致的瞭解,一開始總是知識點比較多的,只能默默地記着了
1.MSG類
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM 1Param;
DWORD time;
POINT pt;
}
1.1 HWND hWnd 窗口句柄:存儲窗口這個變量
句柄:資源的標識,操作系統通過句柄找到對應的資源,有圖標句柄(HICON),光標句柄(HCURSOR),窗口句柄(HWND),實用程序實例句柄(HINSTANCE)等等
1.2 UINT message 消息
UINT :unsigned int 無符號整數,用整數來表示消息
message 只是告訴操作系統有message的到來,而不知道message的內容,比如知道有鍵盤按下,卻不知道按下的是哪個鍵
1.3 WPARAM wParam 系統中定義的一個宏
指定message消息中的附加信息,知道message的具體內容,如鍵盤按下時記錄鍵的ASCLL碼
1.4 LPARAM 1Param
與1.3中 WPARAM wParam的功能相同,但是用名字來區分不同含義,使人看到名字便可知道該消息代表的意思
1.5 DWORD time:消息投遞出去的時間
DWORD :double word,雙16位,代表32位
1.6 POINT pt 點的結構體
這個點代表當消息被投遞時光標在屏幕上的的座標
2.Windows程序的入口函數
int WINAPI WinMain(
HINSTANCE hInstance, //實例句柄,當前運行的實例
HINSTANCE hPrevInstance,//實例句柄,先前運行的實例
LPSTR lpCmdLine,
//LP:長指針,STR字符串
int nCmdShow
//顯示的狀態,最大化,最小化,隱藏等
);
3.窗口的創建
3.1設計窗口類
typedef struct _WNDCLASS {
UINT style; //窗口類的類型
WNDPROC lpfnWndProc; //窗口過程(不是很懂,需要回顧)
int cbClsExtra; //類額外的數據,可以追加附加內存
int cbWndExtra; //窗口額外數據,註冊時可附加窗口內存
HINSTANCE hInstance; //實例句柄,當前運行的實例的實例號
HICON hIcon; //圖標句柄,窗口圖標的更換在這個變量的函數中修改
HCURSOR hCursor; //改變光標進入窗口時的形狀
HBRUSH hbrBackground;//畫刷,設定窗口背景顏色
LPCTSTR lpszMenuName; //LP長指針,C表示常量,整個代表32位的指針指向一
個常量類型的字符串,代表菜單名字
LPCTSTR lpszClassName;//類的名字
} WNDCLASS
3.2窗口的註冊
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;//註冊的這個窗口具有什麼特性,用或 運算將它們組合起來
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_STUDY));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);//進入窗口時光標的形狀,使用系統默認 的話前一個參數爲NULL,後面是光標形 狀對應的宏
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_STUDY);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
3.3窗口的創建
HWND CreateWindow(
LPCTSTR lpClassName,//註冊的類名,要與註冊的相對應
LPCTSTR lpWindowName,//窗口名字,標題欄那裏顯示的
DWORD dwStyle,//窗口類型,設置是否有最大化最小化按鈕等,去掉按鈕只需先對該按鈕取反,再進 行與操作
int x,//窗口水平座標,左上角爲座標原點,向右x增加,向下y增加
int y,//窗口垂直座標
int nWidth,//窗口寬度
int nHeight,//窗口高度
HWND hWndParent,//父窗口句柄
HMENU hMenu,//菜單句柄
HANDLE hlnstance,//實例句柄
LPVOID lpParam)//數據指針,作爲窗口創建消息的附加參數
ShowWindow(
__in HWND hWnd,//保存想要顯示的窗口的句柄
__in int nCmdShow);//窗口創建時顯示的狀態,如最大化,最小化等
UpdateWindow(
__in HWND hWnd);//刷新窗口
3.4
BOOLbRet;
while((bRet=GetMessage(&msg,hWnd,0,0))!=0)
{
if(bRet==-1)
{
//handletheerrorandpossiblyexit
}
else
{
TranslateMessage(&msg);//進行消息轉換
DispatchMessage(&msg);//將消息傳到回調函數
}
}
GetMessage(
LPMSG lpMsg,//消息結構體的指針,從消息隊列中取出消息
HWND hWnd,//獲取窗口的對應句柄,如果爲NULL,表示獲取所有窗口的句柄
UINT wMsgFilterMin,//設定消息最小值,用於篩選消息
UINT wMsgFilterMax)//設定消息最大值,用來篩選消息,如果兩個都爲0,表示對所有消息都感興 趣,不進行篩選
4.窗口主消息的處理
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
LRESULT 代表返回值爲NULL,其他參數的類型不允許改動
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜單選擇:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);//只能在WM_PAINT中使用,GetDC只能在其他地方用
// TODO: 在此添加任意繪圖代碼...
EndPaint(hWnd, &ps);//只能在WM_PAINT中使用,ReleaseDC只能在其他地方使用
break;
case WM_DESTROY:
PostQuitMessage(0);//請求線程中止
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);//不感興趣的消息交給系統處 理
}
return 0;
}
WINUSERAPI int WINAPI MessageBoxA(
HWND hWnd,//當前窗口
LPCSTR lpText,//字符串,消息顯示的文本
LPCSTR lpCaption,//窗口的標題
UINT uType);//消息框的類型,確定消息框的按鈕有哪些,如確定,是否等,直接填0代 表確定
BOOL TextOut(
HDC hdc, // 設備描述表句柄
int nXStart, // 字符串的開始位置 x座標
int nYStart, // 字符串的開始位置 y座標
LPCTSTR lpString, // 字符串,要輸出的文本內容
int cbString // 字符串中字符的個數
);