初學MFC(一)



小學期的項目要用到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 // 字符串中字符的個數

);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章