请教:OnCreate()和PreCreateWindow()函数的作用有何区别?

romanwall 2007-07-18 08:25:24
如题,解释得越详细越好。
...全文
2300 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
andyflyrain 2011-10-28
  • 打赏
  • 举报
回复
学习了
dryfish1987 2010-05-25
  • 打赏
  • 举报
回复
CWnd::OnCreate()的作用是来创建一个windows的子窗口,并且将这个
窗口绑定在一个CWnd对象上面。这是创建一个窗口首先必须要做的两个
步骤的其中一个步骤,他是对虚函数create()的重载。
gebifangjian 2007-07-18
  • 打赏
  • 举报
回复
PreCreateWindow()顾名思义就是在窗口创建之前执行的,它的主要任务是对所要创建的窗口进行一些风格或者其他方面的初始化或者说是设置,可以这么说,如果说窗口好比一栋建筑,那么PreCreateWindow()要做的就是在还没有建筑的时候将建筑的图纸画出来,而OnCreate()要做的就是根据图纸将建筑构建起来.
lyg_zy 2007-07-18
  • 打赏
  • 举报
回复
以下是MFC的窗口创建函数源代码:
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)
{
// 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;
cs.cy = nHeight;
cs.hwndParent = hWndParent;
cs.hMenu = nIDorHMenu;
cs.hInstance = AfxGetInstanceHandle();
cs.lpCreateParams = lpParam;

/**
* 在窗口创建之前调用PreCreateWindow虚函数,给派生类修改窗口窗口风格CREATESTRUCT cs结构的机会
*/
if (!PreCreateWindow(cs))
{
PostNcDestroy();
return FALSE;
}
.......

/**
* 在CreateWindowEx函数执行完返回之前(窗口已经创建,还没有显示),函数发出WM_CREATE 消息,由你的OnCreate函数处理,这里由给了在显示窗口之前再一次改变窗口的一些特性的机会 */
HWND hWnd = ::CreateWindowEx(cs.dwExStyle, cs.lpszClass,
cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,
cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);

......
}
比如以下CRichEditView 的OnCreate函数
int CRichEditView::OnCreate(LPCREATESTRUCT lpcs)
{
if (CCtrlView::OnCreate(lpcs) != 0)
return -1;
GetRichEditCtrl().LimitText(lMaxSize);
GetRichEditCtrl().SetEventMask(ENM_SELCHANGE | ENM_CHANGE | ENM_SCROLL);
VERIFY(GetRichEditCtrl().SetOLECallback(&m_xRichEditOleCallback));
m_lpRichEditOle = GetRichEditCtrl().GetIRichEditOle();
DragAcceptFiles();
GetRichEditCtrl().SetOptions(ECOOP_OR, ECO_AUTOWORDSELECTION);
WrapChanged();
ASSERT(m_lpRichEditOle != NULL);
return 0;
}


WindAndSnow 2007-07-18
  • 打赏
  • 举报
回复
在窗口的CWnd::Create()/CreateEx()调用返回前,要调用PreCreateWindow(),对Create()/CreateEx()中的风格参数进行预处理设置.之后调用OnCreate进行实际的窗口创建,返回后,Create()/CreateEx()也返回,窗口创建结束.
jackylee888 2007-07-18
  • 打赏
  • 举报
回复
PreCreateWindow在窗口创建之前进行操作
OnCreate在窗口创建之后进行操作
romanwall 2007-07-18
  • 打赏
  • 举报
回复
MFC上的解释看过了,还是不太明白,它们的作用有何不同?
i_love_pc 2007-07-18
  • 打赏
  • 举报
回复
OnCreate:
The framework calls this member function when an application requests that the Windows window be created by calling the Create or CreateEx member function. The CWnd object receives this call after the window is created but before it becomes visible. OnCreate is called before the Create or CreateEx member function returns.

PreCreateWindow:
Called by the framework before the creation of the Windows window attached to this CWnd object.
WizardK 2007-07-18
  • 打赏
  • 举报
回复
都是被framework调用的
顺序是...Create/CreateEx->PreCreateWindow->OnCreate

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧