首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

好吧,提出一个MFC的概念性有关问题

2012-04-15 
好吧,提出一个MFC的概念性问题MFC(注一下吧,代码是看vs2010的...)BOOL CMainFrame::PreCreateWindow(CREAT

好吧,提出一个MFC的概念性问题
MFC(注一下吧,代码是看vs2010的...)

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 函数的参数CREATESTRUCT,

参考源代码,实在传入函数LPCTSTR CFrameWnd::GetIconWndClass(DWORD dwDefaultStyle, UINT nIDResource)中新定义的,

那么cs中的参数cx,cy被改动后,怎么对实际的frame创建产生影响呢?

AfxCtxGetClassInfo(AfxGetInstanceHandle(), cs.lpszClass, &wndcls)
AfxRegisterWndClass(wndcls.style, wndcls.hCursor, wndcls.hbrBackground, hIcon);
貌似没有提到cx,cy的问题

下面是MFC的源代码。。。就是明确一下cx,cy被传到哪里去了,在哪里起作用。。。具体创建窗口的函数是什么,先谢了

C/C++ code
LPCTSTR CFrameWnd::GetIconWndClass(DWORD dwDefaultStyle, UINT nIDResource){    ASSERT_VALID_IDR(nIDResource);    HINSTANCE hInst = AfxFindResourceHandle(        ATL_MAKEINTRESOURCE(nIDResource), ATL_RT_GROUP_ICON);    HICON hIcon = ::LoadIconW(hInst, ATL_MAKEINTRESOURCEW(nIDResource));    if (hIcon != NULL)    {        CREATESTRUCT cs;        memset(&cs, 0, sizeof(CREATESTRUCT));        cs.style = dwDefaultStyle;        PreCreateWindow(cs);            // will fill lpszClassName with default WNDCLASS name            // ignore instance handle from PreCreateWindow.        WNDCLASS wndcls;        if (cs.lpszClass != NULL &&            AfxCtxGetClassInfo(AfxGetInstanceHandle(), cs.lpszClass, &wndcls) &&            wndcls.hIcon != hIcon)        {            // register a very similar WNDCLASS            return AfxRegisterWndClass(wndcls.style,                wndcls.hCursor, wndcls.hbrBackground, hIcon);        }    }    return NULL;        // just use the default}


[解决办法]
这个涉及到几个方面的理解。

1,框架以引用的方式Notify了程序员,【CREATESTRUCT& cs】窗口就要被创建了!
2,程序员有机会重写这个虚函数【好像是虚函数】,来修改CREATESTRUCT& cs的成员的值,来参与创建前的一些参数。
3,框架的流程,程序员是要知道的,这里你要知道MFC在CreateWIndow之前,会回调PreCreateWindow这个函数。

[解决办法]
CREATESTRUCT& cs的cx,cy参数的目的不就是给CreateWindow函数用的吗,设置窗口的宽高。


热点排行