MFC中自定義窗口類名技巧_第1頁
MFC中自定義窗口類名技巧_第2頁
MFC中自定義窗口類名技巧_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、轉(zhuǎn)載MFC 中封裝很多常用的控件,把類名也給封裝了,沒有提供明顯的接口出來,用 win api寫窗口程序,第一步就是注冊窗口類此時類名和標(biāo)題名是一起注冊的, 所以能把標(biāo)題很好地讓用戶來設(shè)定, 類名也應(yīng)該是很簡單的,可惜的是MFC 沒有這樣做,原因也許是window name 可以不停的改,而類名不能。窗口的類名是有Create 來確定的,要在Create 前,給窗口選擇一個已經(jīng)注冊的窗口類名,作為參數(shù)窗口 Create 就 ok 了, CWnd 的 Create 最終還是到了 CreateEx 中來,看看CreateEx就會清楚許多BOOL CWnd:CreateEx(DWord dwExSt

2、yle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, LPVOID lpParam /* = NULL */) return CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, pParentWnd-GetSafeHwnd

3、(), (HMENU)(UINT_PTR)nID, lpParam);BOOL CWnd:CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam) ASSERT(lpszClassName = NULL | AfxIsValidString(lpszClassName)| AfxIsValidAtom

4、(lpszClassName); ENSURE_ARG(lpszWindowName = NULL | AfxIsValidString(lpszWindowName); / allow modification of several common create parameters CREATESTRUCT cs; cs.dwExStyle = dwExStyle; cs.lpszClass = lpszClassName; cs.lpszName = lpszWindowName; cs.style = dwStyle; cs.x = x; cs.y = y; cs.cx = nWidth

5、; cs.cy = nHeight; cs.hwndParent = hWndParent; cs.hMenu = nIDorHMenu; cs.hInstance = AfxGetInstanceHandle(); cs.lpCreateParams = lpParam; if (!PReCreateWindow(cs) PostNcDestroy(); returnFALSE; AfxHookWindowCreate(this); HWNDhWnd= :AfxCtxCreateWindowEx(cs.dwExStyle, cs.lpszClass, cs.lpszName, cs.styl

6、e, cs.x, cs.y, cs.cx, cs.cy, cs.hwndParent,cs.hMenu, cs.hInstance, cs.lpCreateParams);#ifdef_DEBUG if (hWnd = NULL) TRACE(traceAppMsg, 0, Warning: Window creationfailed:GetLastError returns 0 x%8.8Xn, GetLastError(); #endif if(!AfxUnhookWindowCreate() PostNcDestroy(); / cleanup if CreateWindowEx fai

7、ls too soon if (hWnd = NULL) return FALSE; ASSERT(hWnd = m_hWnd); / should have been set in send msg hook return TRUE; 可以看到最后到了 :AfxCtxCreateWindowEx , 可以很容易地知道這里調(diào)用了 CreateWindowEx 來創(chuàng)建一個窗口在 前 面 有 一 個 PreCreateWindow(cs) ,而 cs 經(jīng) 過 PreCreateWindow 處 理 后 , 交給:AfxCtxCreateWindowEx 處理:AfxCtxCreateWindowE

8、x 在中轉(zhuǎn)給 CreateWindowEx , cs.lpszClass 就是類名,可以清楚了AfxCtxCreateWindowEx 的用心良苦我們可以重載的PreCreateWindow ,來修改類名,如下的代碼:/ TODO:在 此 添 加 專 用 代 碼 和 / 或 調(diào) 用 基類 /VERIFY(AfxDeferRegisterClass(AFX_WND_REG); /AfxEndDeferRegisterClass(AF X_WND_REG); /cs.lpszClass= AfxRegisterWndClass(NULL); WNDCLASSwndcls; memset(&wndc

9、ls, 0, sizeof(WNDCLASS); / start with NULL / defaults wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; /you can specify your own window procedure wndcls.lpfnWndProc = :DefWindowProc; wndcls.hInstance = AfxGetInstanceHandle(); wndcls.hIcon = NULL; / or load a different icon wndcls.hCursor =NULL;

10、wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wndcls.lpszMenuName = NULL; / Specify your own class name for using FindWindow later wndcls.lpszClassName = _T(MyNewClass); / Register the new class and exit if it fails if(!AfxRegisterClass(&wndcls) TRACE(Class Registration Failedn); return FALSE;

11、 cs.lpszClass = wndcls.lpszClassName; return TRUE; /return CWnd:PreCreateWindow(cs);其實就是為了把一個已經(jīng)注冊的類名字符串傳給CreateWindowEx ,從上面代碼中的注釋中來 看 , 我 還 用 了 一 種 讓 系 統(tǒng) 來 生 成 className 的 方 法 AfxRegisterWndClass 。CWnd:PreCreateWindow 不符合我的心意,注釋掉了,其實里面也沒什么就是判斷而已。而在 MFC 中 CWnd 其他派生類就不這么簡單了, 不過單純的修改類名, 就重載這個方法大多 就 ok

12、 了。是的,只是大多數(shù)可以的,可惜的是這個方法,對于Dialog 來說并不行,因為它不用CWnd:Create ,也就繞不到PreCreateWindow 上來了, 你可以重載對話框的這個方法, 斷點, 是斷不下來的。 因為 CDialog 的創(chuàng)建可以直接用系統(tǒng)的 api 來搞,不用再勞駕 CWnd 來中轉(zhuǎn)到 CReateWindowEx 了, 所以 就不能夠用上述方法來改對話框的類名了??聪滤膭?chuàng)建代碼了:BOOLCDialog:Create(LPCTSTRlpszTemplateName,CWnd*pParentWnd) ASSERT(IS_INTRESOURCE(lpszTemplate

13、Name)| AfxIsValidString(lpszTemplateName); m_lpszTemplateName = lpszTemplateName; / used for help if (IS_INTRESOURCE(m_lpszTemplateName) & m_nIDHelp = 0) m_nIDHelp = LOWORD(DWORD_PTR)m_lpszTemplateName);#ifdef _DEBUG if (!_AfxCheckDialogTemplate(lpszTemplateName, FALSE) ASSERT(FALSE); / invalid dial

14、og template name PostNcDestroy(); / cleanup if Create fails too soon return FALSE; #endif /_DEBUG HINSTANCEhInst =AfxFindResourceHandle(lpszTemplateName,RT_DIALOG); HRSRChResource= :FindResource(hInst, lpszTemplateName, RT_DIALOG); HGLOBAL hTemplate =LoadResource(hInst, hResource); BOOL bResult = CreateIndirect(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論