一个继承于CWND的控件类。如何动态创建并设定其位置。

GISsirclyx 2010-07-05 10:21:40
我有个类CMyClass,是个注册控件类。继承于CWnd.现在我想直接动态创建它,却一直不成功。
一showWindow就出错。
感觉是create函数调用没成功,请问我该怎么调用Create函数?参数如何设置?
好像是很简单的问题,却困扰很久。

先谢谢各位
...全文
297 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
GISsirclyx 2010-07-06
  • 打赏
  • 举报
回复
有没有人来解惑?
没有就结贴鸟
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
LRESULT lResult = AfxCallWndProc(pWnd, hWnd, message, wParam, lParam); return lResult;

上面有点小问题
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
原因找到了。我在该控件类里写了个窗口处理回调函数。
LRESULT CALLBACK CTexturePreview::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
CWnd* pWnd;
pWnd = CWnd::FromHandlePermanent(hWnd);
if (pWnd == NULL){
pWnd = new CTexturePreview();
pWnd->Attach(hWnd);
}
ASSERT(pWnd->m_hWnd == hWnd);
ASSERT(pWnd == CWnd::FromHandlePermanent(hWnd));
LRESULT lResult = AfxCallWndProc(pWnd, hWnd, message, wParam, lParam); return 1;
}

在create函数调用时会进入这个窗口处理函数。但是一旦调用AfxCallWndProc就会出错。
但这问题怎么解决呢。为什么非动态创建的custom control就不会有这个问题
Eleven 2010-07-05
  • 打赏
  • 举报
回复
GetLastError()???
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hcyang 的回复:]
引用 10 楼 gissirclyx 的回复:
原因是第一个参数有问题。应该写注册类的类名。我这里是_T("CTexturePreview");
但是改了以后在创建时还是报错。仍然是在AfxCtxCreateWindowEx函数,这次无提示信息。直接崩溃。
终止在atldebugapi.cpp的AtlTraceVU函数

只能一点点调试了,原因可能有很多,先参考以下MSDN的sample……
[/Quote]

m_wndTexturePreview->Create(_T("CTexturePreview"),_T(""),WS_CHILD | WS_VISIBLE,
CRect(0,0,60,60),this,IDC_CS_TEXTURE_PREVIEW);

改成这样了。还是一样的错。不知道第三个参数样式会不会导致什么问题。
hcyang 2010-07-05
  • 打赏
  • 举报
回复
自己在资源头文件里定义一个没重复的?

可以的
hcyang 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gissirclyx 的回复:]
原因是第一个参数有问题。应该写注册类的类名。我这里是_T("CTexturePreview");
但是改了以后在创建时还是报错。仍然是在AfxCtxCreateWindowEx函数,这次无提示信息。直接崩溃。
终止在atldebugapi.cpp的AtlTraceVU函数
[/Quote]
只能一点点调试了,原因可能有很多,先参考以下MSDN的sample,然后一点一点改成你自己的代码。

void CMyDlg::OnCreateStatic()
{
CWnd* pWnd = new CWnd;
pWnd->Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,
CRect(0, 0, 20, 20), this, 1234);
}
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hcyang 的回复:]
CString strCaption;
strCaption.LoadString(IDC_TEXTURE_PREVIEW); //取按钮标题
m_wndTexturePreview->Create(strCaption,strCaption,WS_CHILD,CRect(0,0,60,60),this,IDC_TEXTURE_PREVIEW);

红字部分?
[/Quote]

请问最后一个参数应该写什么ID?自己在资源头文件里定义一个没重复的?
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
原因是第一个参数有问题。应该写注册类的类名。我这里是_T("CTexturePreview");
但是改了以后在创建时还是报错。仍然是在AfxCtxCreateWindowEx函数,这次无提示信息。直接崩溃。
终止在atldebugapi.cpp的AtlTraceVU函数
hcyang 2010-07-05
  • 打赏
  • 举报
回复
CString strCaption;
strCaption.LoadString(IDC_TEXTURE_PREVIEW); //取按钮标题
m_wndTexturePreview->Create(strCaption,strCaption,WS_CHILD,CRect(0,0,60,60),this,IDC_TEXTURE_PREVIEW);

红字部分?
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 muzizongheng 的回复:]
create失败了呗。 F11进去就知道了。

没见到你的RegisterClass掉用。 后面你create传递strCaption给参数classname 可能有问题。
[/Quote]

的确是创建失败了。我追进去在CWnd::CreateEx函数里调用AfxCtxCreateWindowEx出错
调试窗口输出
Warning: Window creation failed: GetLastError returns 0x0000057F
但不明白原因。
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xyzhaopeng 的回复:]
引用 2 楼 gissirclyx 的回复:

CString strCaption;
strCaption.LoadString(IDC_TEXTURE_PREVIEW); //取按钮标题
m_wndTexturePreview->Create(strCaption,strCaption,WS_CHILD,CRect(0,0,60,60),this,IDC_TEXTURE_PREVIEW……
[/Quote]

说错了。不是重载 = =!是映射。。
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 muzizongheng 的回复:]
create失败了呗。 F11进去就知道了。

没见到你的RegisterClass掉用。 后面你create传递strCaption给参数classname 可能有问题。
[/Quote]

在程序实例化的时候这个类的RegisterControlClass方法就调用了
动态创建一个CButton什么的都没问题。
cdsnpeter 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gissirclyx 的回复:]

CString strCaption;
strCaption.LoadString(IDC_TEXTURE_PREVIEW); //取按钮标题
m_wndTexturePreview->Create(strCaption,strCaption,WS_CHILD,CRect(0,0,60,60),this,IDC_TEXTURE_PREVIEW);

我重载了cwnd的onCreate事件……
[/Quote]
OnCreate是消息响应函数,需要你映射WM_CREATE这个消息
muzizongheng 2010-07-05
  • 打赏
  • 举报
回复
create失败了呗。 F11进去就知道了。

没见到你的RegisterClass掉用。 后面你create传递strCaption给参数classname 可能有问题。
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
这个控件类我本来是用来做CUSTOM control的。之前拖资源的方式创建是没问题的。
类里写了RegisterControlClass方法。
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
CString strCaption;
strCaption.LoadString(IDC_TEXTURE_PREVIEW); //取按钮标题
m_wndTexturePreview->Create(strCaption,strCaption,WS_CHILD,CRect(0,0,60,60),this,IDC_TEXTURE_PREVIEW);

我重载了cwnd的onCreate事件,发现调用create函数后并不会触发onCreate。这是怎么回事。。

cdsnpeter 2010-07-05
  • 打赏
  • 举报
回复
你现在是怎么Create的?
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
有没有人来解惑?
GISsirclyx 2010-07-05
  • 打赏
  • 举报
回复
改了很久。追到很深。发现。其实把AfxCallWndProc换成DefWndProc就可以了。
好像是用Create动态创建和采用Custom Control直接拖资源的用户控件类的消息处理方式不同。
1、用Create动态创建的控件类自动会调用消息映射函数。
2、而Custom Control直接拖资源方式的方法创建的要自己调用AfxCallWndProc来派发如OnCreate、OnSize等消息。
加载更多回复(2)

15,980

社区成员

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

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