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被传到哪里去了,在哪里起作用具体创建窗口的函数是什么,先谢了
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.   

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

  2.   


    恩恩,这些表示都了解的,但是无论是第一次调用PreCreateWindow,还是回调,cx,cy的值传出之后又被传到哪里去了呢?
    引用(CREATESTRUCT& cs)可以说是相当于设置cx,cy吧,将它们的信息告诉了GetIconWndClass,然后呢?GetIconWndClass又将它们储存在哪里,告诉了哪些函数,进行了哪些操作呢?
      

  3.   

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