开一个新窗口要注册窗口类。我的问题是想利用MFC已经注册的窗口类来开新窗口,候杰的《深入前出MFC》中也提到了5个已经被MFC注册的窗口类,如:AfxWnd42d。我在dotnet下做VC的程序,直接使用AfxWnd42d,错误是未声明。现在就不知道在dotnet已经被注册的窗口类名称是什么,是不是必须得注册一个新的窗框类才能开窗口。
期待高手的指点。
期待高手的指点。
解决方案 »
- 文件逐行处理,有必要用std::list么?
- vc在静态控件中绘图,如果控件大小超过屏幕如何保存
- 想在一个按钮上面加上图标,试了N多方法,一直不行,实在没撤了~~ 帮帮忙,在线等待
- 请问怎么在Dialog里面加入一个很大的位图作为背景呢?
- 100分!!请问各公司里网络安全事业部的人都在做什么?
- 如何在VC中写一个ActiveX把客户端的XML文档保存回Web服务器上去?
- 如何在EditBox中检测到Backspace键信息?
- 如何在对话框中加入一条横线,就像菜单上的一样
- vcvars32.bat的问题,以解决,我把此文件放到了AUTOEXEC.BAT里。我想问的是这两种BAT文件有何不同?
- 菜鸟问题,请大家帮忙。
- 在控制台程序中使用MFC的问题
- dll文件减肥的疑问
m_clsName = AfxRegisterWndClass( UINT nClassStyle, HCURSOR hCursor = 0, HBRUSH hbrBackground = 0, HICON hIcon = 0 ); 注册完了之后,在窗口类的PreCreateWindow函数中,cs.lpszClass = m_clsName; 那么窗口类就是新的类了。如果感觉AfxRegisterWndClass不怎么强大,用
BOOL AFXAPI AfxRegisterClass( WNDCLASS* lpWndClass );
我的问题其实就是是不是非得注册一个新的窗口类。理论上来说,MFC肯定已经注册了窗口类,不然就没法创建窗口了。用一个窗口类可以生成多个窗口,我就是想看看这些类的名称。候杰的书中介绍过,但是不详细。
不知有没有人对这一问题研究过,还往多指点。
{
// mask off all classes that are already registered
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
fToRegister &= ~pModuleState->m_fRegisteredClasses;
if (fToRegister == 0)
return TRUE; LONG fRegisteredClasses = 0; // common initialization
WNDCLASS wndcls;
memset(&wndcls, 0, sizeof(WNDCLASS)); // start with NULL defaults
wndcls.lpfnWndProc = DefWindowProc; //窗口过程
wndcls.hInstance = AfxGetInstanceHandle(); //实例句柄
wndcls.hCursor = afxData.hcurArrow; //光标 INITCOMMONCONTROLSEX init;
init.dwSize = sizeof(init); // work to register classes as specified by fToRegister, populate fRegisteredClasses as we go
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_WNDOLECONTROL_REG)
{
// OLE Control windows - use parent DC for speed
wndcls.style |= CS_PARENTDC | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpszClassName = _afxWndOleControl;
if (AfxRegisterClass(&wndcls))
fRegisteredClasses |= AFX_WNDOLECONTROL_REG;
}
if (fToRegister & AFX_WNDCONTROLBAR_REG)
{
// Control bar windows
wndcls.style = 0; // control bars don't handle double click
wndcls.lpszClassName = _afxWndControlBar;
wndcls.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
if (AfxRegisterClass(&wndcls))
fRegisteredClasses |= AFX_WNDCONTROLBAR_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;
}
if (fToRegister & AFX_WNDCOMMCTLS_REG)
{
// this flag is compatible with the old InitCommonControls() API
init.dwICC = ICC_WIN95_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WIN95CTLS_MASK);
fToRegister &= ~AFX_WIN95CTLS_MASK;
}
if (fToRegister & AFX_WNDCOMMCTL_UPDOWN_REG)
{
init.dwICC = ICC_UPDOWN_CLASS;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_UPDOWN_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_TREEVIEW_REG)
{
init.dwICC = ICC_TREEVIEW_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_TREEVIEW_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_TAB_REG)
{
init.dwICC = ICC_TAB_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_TAB_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_PROGRESS_REG)
{
init.dwICC = ICC_PROGRESS_CLASS;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_PROGRESS_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_LISTVIEW_REG)
{
init.dwICC = ICC_LISTVIEW_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_LISTVIEW_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_HOTKEY_REG)
{
init.dwICC = ICC_HOTKEY_CLASS;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_HOTKEY_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_BAR_REG)
{
init.dwICC = ICC_BAR_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_BAR_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_ANIMATE_REG)
{
init.dwICC = ICC_ANIMATE_CLASS;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_ANIMATE_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_INTERNET_REG)
{
init.dwICC = ICC_INTERNET_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_INTERNET_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_COOL_REG)
{
init.dwICC = ICC_COOL_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_COOL_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_USEREX_REG)
{
init.dwICC = ICC_USEREX_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_USEREX_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_DATE_REG)
{
init.dwICC = ICC_DATE_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_DATE_REG);
} // save new state of registered controls
pModuleState->m_fRegisteredClasses |= fRegisteredClasses; // special case for all common controls registered, turn on AFX_WNDCOMMCTLS_REG
if ((pModuleState->m_fRegisteredClasses & AFX_WIN95CTLS_MASK) == AFX_WIN95CTLS_MASK)
{
pModuleState->m_fRegisteredClasses |= AFX_WNDCOMMCTLS_REG;
fRegisteredClasses |= AFX_WNDCOMMCTLS_REG;
} // must have registered at least as mamy classes as requested
return (fToRegister & fRegisteredClasses) == fToRegister;
}
MFC内部也是用AfxRegisterWndClass注册的。其实真是的什么类名是一个什么鬼东西的数字,用spy++可以看到的。
CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd)
函数中这么做:
VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);
注册的初始类是AFX_WNDCOMMCTLSNEW_REG。
//AFXIMPL.H
#define AFX_WND_REG 0x00001
#define AFX_WNDCONTROLBAR_REG 0x00002
#define AFX_WNDMDIFRAME_REG 0x00004
#define AFX_WNDFRAMEORVIEW_REG 0x00008
#define AFX_WNDCOMMCTLS_REG 0x00010 // means all original Win95
#define AFX_WNDOLECONTROL_REG 0x00020
#define AFX_WNDCOMMCTL_UPDOWN_REG 0x00040 // these are original Win95
#define AFX_WNDCOMMCTL_TREEVIEW_REG 0x00080
#define AFX_WNDCOMMCTL_TAB_REG 0x00100
#define AFX_WNDCOMMCTL_PROGRESS_REG 0x00200
#define AFX_WNDCOMMCTL_LISTVIEW_REG 0x00400
#define AFX_WNDCOMMCTL_HOTKEY_REG 0x00800
#define AFX_WNDCOMMCTL_BAR_REG 0x01000
#define AFX_WNDCOMMCTL_ANIMATE_REG 0x02000
#define AFX_WNDCOMMCTL_INTERNET_REG 0x04000 // these are new in IE4
#define AFX_WNDCOMMCTL_COOL_REG 0x08000
#define AFX_WNDCOMMCTL_USEREX_REG 0x10000
#define AFX_WNDCOMMCTL_DATE_REG 0x20000#define AFX_WIN95CTLS_MASK 0x03FC0 // UPDOWN -> ANIMATE
#define AFX_WNDCOMMCTLSALL_REG 0x3C010 // COMMCTLS|INTERNET|COOL|USEREX|DATE
#define AFX_WNDCOMMCTLSNEW_REG 0x3C000 // INTERNET|COOL|USEREX|DATE
class style : CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW
no icon
arrow cursor
no background color
"AfxFrameOrView" is used for frame windows and views (including stand-alone CFrameWnds and CMDIChildWnds).
class style : CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
icon AFX_IDI_STD_FRAME
arrow cursor
COLOR_WINDOW background color
"AfxMDIFrame" is used for the MDI frame window (that is, the parent) created with CMDIFrameWnd::Create.
class style : CS_DBLCLKS [ reduces flash during resizing ]
icon AFX_IDI_STD_MDIFRAME
arrow cursor
no background color
"AfxControlBar" is used for the standard control bar implementation.
class style : 0 [ reduces flash during resizing, no double clicks ]
no icon
arrow cursor
gray background color (COLOR_BTNFACE)