View类的OnCreate函数导致界面无反应

yyg990441 2012-10-04 07:47:36
一个单文档程序,在View类的OnCreate函数里添加如下代码为什么导致界面启动的时候无反应?

int CS1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CButton btn;
btn.Create("btn_test", WS_CHILD|WS_BORDER|WS_VISIBLE|BS_PUSHBUTTON , CRect(0,0,100,100), this , 123);
btn.Detach();
return 0;
}
...全文
240 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2012-10-07
  • 打赏
  • 举报
回复
其实最简单就是:
CButton m_btn; 声明放在类的头文件中
剩下的由MFC处理。
yyg990441 2012-10-07
  • 打赏
  • 举报
回复
是否先把窗口函数改为::DefWindowProc
再Detach()就没有问题?
schlafenhamster 2012-10-07
  • 打赏
  • 举报
回复
Detach()函数把‘永久Permanent’句柄中的对应handle:pMap->RemoveHandle(m_hWnd);了。

附:2种句柄: ‘永久Permanent’句柄,和临时句柄。临时句柄在 OnIdle中被删除。

永久句柄在Detach中被删除。
yyg990441 2012-10-07
  • 打赏
  • 举报
回复
schlafenhamster,你的分析看上去很有道理 ,如果真的是这样的话,我十分想知道Detach()函数用来干什么?似乎只要一Detach(),窗口对应的pWnd就和窗口句柄解除关联,从而必然导致AfxWndProc断言失败。
schlafenhamster 2012-10-07
  • 打赏
  • 举报
回复
1。 你的代码在vc6上出错:
/////////////////////////////////////////////////////////////////////////////
// The WndProc for all CWnd's and derived classes

LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
// special message which identifies the window as using AfxWndProc
if (nMsg == WM_QUERYAFXWNDPROC)
return 1;

// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd->m_hWnd == hWnd);
if (pWnd == NULL || pWnd->m_hWnd != hWnd)
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}
2。因为:
HWND CWnd::Detach()
{
HWND hWnd = m_hWnd;
if (hWnd != NULL)
{
CHandleMap* pMap = afxMapHWND(); // don't create if not exist
if (pMap != NULL)
pMap->RemoveHandle(m_hWnd);
m_hWnd = NULL;
}

#ifndef _AFX_NO_OCC_SUPPORT
m_pCtrlSite = NULL;
#endif

return hWnd;
}
schlafenhamster 2012-10-07
  • 打赏
  • 举报
回复
MFC类Attach后是:
Under MFC, every window has the same window proc, which looks like this:
// simplified
LRESULT AfxWndProc(HWND hWnd,...)
{
pWnd = // get CWnd for this hWnd
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam,
lParam);
}
你看看Detach后,变成什么?
schlafenhamster 2012-10-06
  • 打赏
  • 举报
回复
btn.Detach();
把窗口(m_hWnd)都割断了,按钮的winproc不再有效。
yyg990441 2012-10-06
  • 打赏
  • 举报
回复
就是因为搞明白了才用Detach()函数的
schlafenhamster 2012-10-06
  • 打赏
  • 举报
回复
"试试在这里不用CButton类"
搞清楚C++类和窗口类的关系,才能搞明白。
yyg990441 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
1)如果vs环境下 考虑一下 TEXT(btn_Test)
2) onCreate()函数结束后, CButton对象就没有了 ,肯定不会显示

这两点你看明白后,就给你说为啥: Detach()函数,切断与对应窗口的联系

你的按钮都消失了 ,上哪去切断啊? 系统找不到,所以卡死!



方法:去掉那个Detach()函数 或者 按钮对象设为全局 或静态
[/Quote]
见10楼回复
yyg990441 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
btn.Detach();
把窗口(m_hWnd)都割断了,按钮的winproc不再有效。
[/Quote]
你知道我为什么要Detach吗?不就是怕局部对象析构导致CButton管理的m_hWnd被销毁吗?谁说把窗口(m_hWnd)都割断了,按钮的winproc不再有效?你试试在这里不用CButton类,直接CreateWindow产生一个Button试试。
Harper 2012-10-06
  • 打赏
  • 举报
回复
1)如果vs环境下 考虑一下 TEXT(btn_Test)
2) onCreate()函数结束后, CButton对象就没有了 ,肯定不会显示

这两点你看明白后,就给你说为啥: Detach()函数,切断与对应窗口的联系

你的按钮都消失了 ,上哪去切断啊? 系统找不到,所以卡死!



方法:去掉那个Detach()函数 或者 按钮对象设为全局 或静态
yyg990441 2012-10-05
  • 打赏
  • 举报
回复
嗯,我知道这样做可以。但是我就是想知道局部变量的CButton
Detach()后为什么不行。
yyg990441 2012-10-05
  • 打赏
  • 举报
回复
只能加到100分了啊,知道的大侠麻烦解释下。
zgl7903 2012-10-05
  • 打赏
  • 举报
回复
1 CButton btn; 声明放在类的头文件中
2 //btn.Detach();
yyg990441 2012-10-05
  • 打赏
  • 举报
回复
高手快来回答啊~~~
yyg990441 2012-10-04
  • 打赏
  • 举报
回复
WS_VISIBLE不需要showwindow,而且是界面无任何响应,不是简单的看不见按钮
bsnry 2012-10-04
  • 打赏
  • 举报
回复
需要showwindow?
yyg990441 2012-10-04
  • 打赏
  • 举报
回复
漏说了,为了简单,用VC6编的,不考虑unicode,直接用char

15,980

社区成员

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

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