一、Win32專案設計
類似于console控制臺程式,win32視窗程式的入口函式類似于main()函式,稱之為WinMain函式:
int WINAPI wWinMain( HINSTANCE hInstance, //實體句柄 HINSTANCE hPrevInstance,//前一個實體句柄 PWSTR pCmdLine, //命令列引數,字串指標 int nCmdShow) //視窗顯示方法,一系列的宏
在此函式之中執行以下的步驟進行一個Win32專案視窗的創建
1.設計視窗
WNDCLASS wndcls; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0;// 附加記憶體 wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//背景 wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);//游標 wndcls.hInstance = hInstance;//實體句柄 wndcls.lpfnWndProc = WinMyProc;//視窗程序,訊息處理函式 wndcls.lpszClassName = TEXT("類名"); wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);//圖示 wndcls.lpszMenuName = NULL;//選單 wndcls.style = CS_HREDRAW | CS_VREDRAW;//水平垂直重畫
2.注冊視窗
RegisterClass(&wndcls);
3.創建視窗
void CreateWindowW(lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam);
HWND hwnd = CreateWindow(TEXT("類名"), TEXT("標題"), WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);
4.顯示與更新視窗
//顯示視窗 ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd);
5.訊息回圈
//取得訊息,分發訊息 MSG msg; while (GetMessage(&msg, hwnd, 0, 0)) { TranslateMessage(&msg);//翻譯,虛擬按鍵轉化為字符訊息 DispatchMessage(&msg);//分發訊息 }
Windows處理訊息程序:
訊息發出:
os:維護一個訊息佇列,將訊息加入佇列
app:從訊息佇列取訊息GetMessage
app:告知os,TranslateMessage(&msg);//翻譯 DispatchMessage(&msg);//分發訊息
os:視窗程序,訊息處理 WinMyProc
二、MFC單檔案與Win32程式的映射
利用向導生成MFC專案自動生成的四個類:
CMainFrame //框架類
CMyApp //應用程式類
CMyDoc //檔案類
CMyView //視圖類
其中,MainFrame和View視圖類都繼承于CWnd類,View類為整個表單的子視窗,Frame作為框架使用,包含選單和工具列,
MFC作為了封裝了Win32的程式的框架,同樣遵從上述的視窗創建程序的方法,只不過在程式中我們無法查看,
MFC視窗的創建程序:
1.App類創建全域變數,唯一一個App的全域物件
2.進入WinMain函式(在MFC源代碼中可查到)
3.WinMain() -> afxWinMain(),WinMain()函式中向下調函式
4.afxWinMain() -> InitInstance() ,利用父類指標呼叫虛函式,多型性使得子類方法得以呼叫
5.InitInstance會調一些父類方法實作了視窗的設計
6.接下來進入視窗的注冊,這部分在Frame類中的PreCreateWindow中得以體現,調基類方法注冊視窗
7.進入CFrame的Create方法中,多次呼叫CreateEx函式創建了整個表單(包含工具和選單)
8.Create中調PreCreateWindow方法,多型性使得其呼叫子類方法
9.繼而在mainwnd中進行showwindow和updatewindow
MFC的訊息回圈:
MFC編程中,添加一個訊息處理函式的程序中,1會在類中(.h)宣告一個訊息處理函式,2會在(.cpp)中實作,3會在(.cpp)中
BEGIN_MESSAGE_MAP()
ON_WM_CREATE()
END_MESSAGE_MAP()
之間添加宏,
訊息映射,為了解決大規模虛表的問題,
MFC的訊息映射:主要是在WinThread::Run中體現
句柄 關聯 物件指標 <----->一個靜態函式可以通過句柄獲取該物件指標
物件指標 傳 基類
基類 呼叫 WdnProc(虛函式) <---->訊息回圈
wndproc內部由onwndmsg實作,主要關注兩個方面1.是否存在訊息函式,2.是否存在MAP中的宏
如果存在的話,調子類的訊息處理函式,否則執行默認視窗程序,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/210976.html
標籤:.NET技术
