MFC注册窗口类

    技术2022-11-26  42

    MFC带有注册("register")字样的函数不少呀!主要有下面几个:

    AfxDeferRegisterClass BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister) LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle,HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon) BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass)

    首先,AfxDeferRegisterClass与AfxEndDeferRegisterClass是一回事。看看下面那个宏就知道了。

    #define AfxDeferRegisterClass(fClass) AfxEndDeferRegisterClass(fClass)

    AfxEndDeferRegisterClass参数只有一个,注册的是系统预定义类。

    BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister) { ... if (fToRegister & AFX_WND_REG) { // Child windows - no brush, no icon, safest default class styles wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; wndcls.lpszClassName = _afxWnd; if (AfxRegisterClass(&wndcls)) fRegisteredClasses |= AFX_WND_REG; } if (fToRegister & AFX_WNDMDIFRAME_REG) { // MDI Frame window (also used for splitter window) wndcls.style = CS_DBLCLKS; wndcls.hbrBackground = NULL; if (_AfxRegisterWithIcon(&wndcls, _afxWndMDIFrame, AFX_IDI_STD_MDIFRAME)) fRegisteredClasses |= AFX_WNDMDIFRAME_REG; } if (fToRegister & AFX_WNDFRAMEORVIEW_REG) { // SDI Frame or MDI Child windows or views - normal colors wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); if (_AfxRegisterWithIcon(&wndcls, _afxWndFrameOrView, AFX_IDI_STD_FRAME)) fRegisteredClasses |= AFX_WNDFRAMEORVIEW_REG; } ... }

    AfxRegisterWndClass利用WNDCLASS里头的五个字段,构造一个类名,并注册它。

    LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon) { ... HINSTANCE hInst = AfxGetInstanceHandle(); if (hCursor == NULL && hbrBackground == NULL && hIcon == NULL) { ATL_CRT_ERRORCHECK_SPRINTF(_sntprintf_s(lpszName, _AFX_TEMP_CLASS_NAME_SIZE, _AFX_TEMP_CLASS_NAME_SIZE - 1, _T("Afx:%p:%x"), hInst, nClassStyle)); } else { ATL_CRT_ERRORCHECK_SPRINTF(_sntprintf_s(lpszName, _AFX_TEMP_CLASS_NAME_SIZE, _AFX_TEMP_CLASS_NAME_SIZE - 1, _T("Afx:%p:%x:%p:%p:%p"), hInst, nClassStyle, hCursor, hbrBackground, hIcon)); } WNDCLASS wndcls; if (::AfxCtxGetClassInfo(hInst, lpszName, &wndcls)) { ASSERT(wndcls.style == nClassStyle); return lpszName; } wndcls.style = nClassStyle; wndcls.lpfnWndProc = DefWindowProc; wndcls.cbClsExtra = wndcls.cbWndExtra = 0; wndcls.hInstance = hInst; wndcls.hIcon = hIcon; wndcls.hCursor = hCursor; wndcls.hbrBackground = hbrBackground; wndcls.lpszMenuName = NULL; wndcls.lpszClassName = lpszName; if (!AfxRegisterClass(&wndcls)) AfxThrowResourceException(); return lpszName; }

    AfxRegisterClass是最终调用的函数了,它又调用API函数RegisterClass。

    最新回复(0)