1. 程式人生 > >MFC(2):底層實現視窗、MFC視窗建立與訊息對映、windows字符集和嚮導的使用

MFC(2):底層實現視窗、MFC視窗建立與訊息對映、windows字符集和嚮導的使用


=====================從底層去實現一個視窗===============

程式入口是WinMain函式

視窗的建立步驟:
-->  設計(WNDCLASS) 
-->  註冊(RegisterClass) 
-->  建立(CreateWindow) 
-->  顯示(ShowWindow、UpdateWindow) 
-->  訊息迴圈(MSG、GetMessage、DispatchMessage、TraslateMessage) 
MSG msg;
while(GetMessage(&msg, null, 0, 0))
{
    TraslateMessage(&msg);
    DispatchMessage(&msg);
}

-->  訊息處理函式(DefWindowProc、swicth判斷)
LREAULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_CLOSE: DestroyWindow(hWnd);    break;
    case WM_DESTROY: PostQuitMessage(0);    break; 
    case WM_LBUTTONDOWN: 
        {int xPos = LOWORD(wParam); int yPos = HIWORD(lParam); 
        char buf[1024];    wsprintf(buf, TEXT("x = %d, y = %d"), xPos, yPos);
        MessageBox(hWnd, buf, TEXT("滑鼠按下"), MB_OK);    }
    }
}

======================建立一個MFC程式==================

程式的入口是InitInstance,該函式是CWinApp的虛擬函式,程式設計師需要自己編寫該類的子類CMyApp並重寫該函式
程式具有唯一的全域性應用程式物件,CMyApp theApp;
BOOL CMyApp::InitInstance()
{
    CMyFrame * myFrame = new CMyFrame;
    
    m_pMainWnd = myFrame; //儲存指向應用程式的主視窗指標
    
    myFrame->ShowWindow(SW_SHOW);
    myFrame->UpdateWindow();
    return TRUE;
}

訊息對映機制:要對那個視窗使用訊息對映機制,就在該類的標頭檔案中宣告巨集DECLARE_MESSAGE_MAP()
在類的實現(原始檔)中,定義實現巨集IMPLEMENT_MESSAGE_MAP和分界巨集
BEGIN_MESSAGE_MAP(本類,他爹)
訊息巨集...
END_MESSAGE_MAP()

以 ON_WM_LBUTTONDOWN()為例:
標頭檔案中:afx_msg void OnLButtonDown(UINT, CPoint);
對應訊息巨集: ON_WM_LBUTTONDOWN()
原始檔中的實現:void OnLButtonDown(UINT, CPoint) 
                    {CString str; str.Format(TEXT("x = %d, y = %d"), point.x, point.y);
                     MessageBox(str, TEXT("滑鼠按下"));}
                 
以 ON_WM_POINT()為例:
標頭檔案中:afx_msg void OnPaint();
對應訊息巨集: ON_WM_POINT()
原始檔中的實現:void OnPaint() 
                { CPaint dc(this); //先請一個畫家
                  dc.TextOut(100, 100, "這事兒是畫家乾的");
                  dc.Ellipse(10, 10, 100, 100);}


======================Windows字符集====================

一個字元對應一個位元組 多位元組
一個字元對應單個位元組 寬位元組(unicode、GBK) wchar_t
多位元組轉寬位元組 L
TEXT()函式將字串轉換為當前格式,具備自適應編碼轉換功能
MFC中TCHAR具有自適應編碼轉換的字元

統計字串長度
int num = 0;
char* p = "aaaa";
num = strlen(p);

wchar_t *p2 = L"aaaa";
num = wcslen(p2)

char*與CString之間的轉換與逆轉換
char* p3 = "ccc";
CString str = CString(p3);// 呼叫建構函式

CStingA tmp = str;
char* p = tmp.GetBuffer();


==================MFC嚮導建立程式======================

新建專案-->MFC應用程式-->單個文件、MFC標準(一路下一步到生成的類)
生成了四個類:檢視類、應用程式類、文件類和主框架視窗類
MFC程式通常不看解決方案,而是看的類檢視(檢視-->類檢視)
類檢視分為上下兩欄:上欄點選可以進入標頭檔案,下欄點選進入相應的類函式

訊息處理都寫在Frame類中,右鍵-->屬性-->訊息-->add,自動生成程式碼;不想要在 訊息-->delete 即可邏輯刪除(即註釋掉)
不夠智慧的一點是delete邏輯刪除後,再add並不會開啟註釋而是重新再寫一份

主框架視窗類相當於相框,檢視類相當於相片;資料的儲存和載入由文件類完成,顯示和修改用檢視類來完成
要顯示的東西放在檢視類中
OnDraw和OnPaint區別:同時存在前者會覆蓋後者,因此不要同時出現;通常不會寫OnPaint

InitInstance為程式入口,PreCreateWindow為程式設計師提供了修改程式外觀的機會
OnCreate和Create的區別:前者負責註冊併產生視窗,後者不產生但在視窗顯示前設定視窗格式
Create --> WM_CREATE --> OnCreate

afx開頭的是全域性函式 AfxMessageBox
afx_msg是訊息函式的標識