怎样在MFC Extention DLL 中创建FrameWnd 50分在线跪求,各位高手帮个忙吧◎!!!

koko_han 2007-12-03 12:57:48
我试着用CFrameWnd.Create去创建窗口,老出现Assertion Faild,create函数的pParentWnd参数该怎样设置呢?
...全文
99 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
thenshesaid 2007-12-03
  • 打赏
  • 举报
回复
跟到PreCreateWindow中发现在RegisterClass前初始化WNDCLASS的时候, 调用了AfxXXXGetInstanceHandle来初始化ws.hInstance
AfxXXGetInstanceHandle中
ASSERT (afxCurrentInstanceHandle != NULL);
这里是断言触发的地方.
--------------------------------------------------------
所以在运行frameWnd.Create之前可以
afxCurrentInstanceHandle = AfxGetInstanceHandle ();//初始化hInstance

VS2008下Run OK.
yxz_lp 2007-12-03
  • 打赏
  • 举报
回复
即使正确设置了pParentWnd,还是会引发断言失败,因为Create的调用会发送WM_CREATE消息,继而引发下面的代码调用

int CFrameWnd::OnCreate(LPCREATESTRUCT lpcs)
{
ENSURE_ARG(lpcs != NULL);
CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;
return OnCreateHelper(lpcs, pContext);//这句将引发CreateView的调用
//除非你调用Create的时候正确设置了CCreateContext的结构。
}
yxz_lp 2007-12-03
  • 打赏
  • 举报
回复
下面是CFrameWnd.Create的伪代码

BOOL CFrameWnd::Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
LPCTSTR lpszMenuName,
DWORD dwExStyle,
CCreateContext* pContext)
{
HMENU hMenu = NULL;
if (lpszMenuName != NULL)
{
// load in a menu that will get destroyed when window gets destroyed
HINSTANCE hInst = AfxFindResourceHandle(lpszMenuName, ATL_RT_MENU);
if ((hMenu = ::LoadMenu(hInst, lpszMenuName)) == NULL)
{
TRACE(traceAppMsg, 0, "Warning: failed to load menu for CFrameWnd.\n");
PostNcDestroy(); // perhaps delete the C++ object
return FALSE;
}
}

m_strTitle = lpszWindowName; // save title for later

if (!CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,
rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
pParentWnd->GetSafeHwnd(), hMenu, (LPVOID)pContext))//显然pParentWnd设为NUll,会断言失败
{
TRACE(traceAppMsg, 0, "Warning: failed to create CFrameWnd.\n");
if (hMenu != NULL)
DestroyMenu(hMenu);
return FALSE;
}

return TRUE;
}

不赞成这样使用CFrameWnd,还是在文档/视图结构里使用框架
koko_han 2007-12-03
  • 打赏
  • 举报
回复
to Zhoujianbei: 我没有创建Resource, 我想通过create成员函数创建。
to shanhqk: 我的父窗口的确设置为NULL但是依然提示Assertion faild
shanhqk 2007-12-03
  • 打赏
  • 举报
回复
是父窗口的句柄,可以设置为NULL
zhoujianhei 2007-12-03
  • 打赏
  • 举报
回复
使用
CFrameWnd::LoadFrame(nIDResource, dwDefaultStyle,
0, 0)
试试。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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