怎样显示这样的一个窗口

boris963 2003-08-23 01:18:17
有一个类,派生自CFormView,构造函数是保护的,我现在想运行时动态创建这么一个窗口,并显示它,该怎么做呢?
是不是先CWnd* pView, 再用pView调用Create,之后用pView调用ShowWindow呢?但是Create中传递的第一个参数是一个派生类注册的ClassName,我怎么能知道这个ClassName呢
...全文
29 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
李秀国之印 2003-08-23
  • 打赏
  • 举报
回复
首先,将保护的虚构函数变为public
RUNTIME_CLASS(CFormViewEx);
if you want to get m_hWnd ,那么,你应该将CFomrViewEx用CCreateContext
关联到DocTemplete
请参阅
pDocTemplate = new CMultiDocTemplate(
IDR_MMTYPE,
RUNTIME_CLASS(CMmDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CMmView));
AddDocTemplate(pDocTemplate);

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{

return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}

boris963 2003-08-23
  • 打赏
  • 举报
回复
我按照上面的帖子写了,但通过调试发现创建完视图后,pYourView所指对象的m_hWnd值不存在,所以后面调用派生类的操作失败,该怎么办呢?
思危 2003-08-23
  • 打赏
  • 举报
回复
动态创建:
CRuntimeClass* pRunClass = RUNTIME_CLASS(CYouViewClass);
CYourViewClass* pYourView = pRunClass.CreateObject(); //创建你的视图
atEleven 2003-08-23
  • 打赏
  • 举报
回复
一楼正解,但没讲清楚.

1 从 CYourFormView 中重写虚函数.改为 public
直接调用CFormView::Create即可.

2 在创建的地方:
{
CYourFormView* pWnd = new CYourFormView;
pWnd->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,20,20),this,0);
...
}

在MFC内部,FormView的ClassName是等同于Modaless Dialog ,用Spy++可以看到.

对Create传入的前面两个参数,class name 和 windows title,根本不起任何作用(请参考CFormView::Create的内部实现)
boris963 2003-08-23
  • 打赏
  • 举报
回复
用NULL的话不是就按照CWnd的属性来创建了么?那系统怎么知道我创建的指针是指向基类的还是指向子类的,我还要用子类的指正来调用子类的函数啊!
MSDN上要创建一个CStatic时不是这么写的么:

void CMyDlg::OnCreateStatic()
{
CWnd* pWnd = new CWnd;
pWnd->Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,
CRect(0, 0, 20, 20), this, 1234);
}
duqiang2050 2003-08-23
  • 打赏
  • 举报
回复
用NULL就行

另外构造函数是保护的,是用于动态创建的,如果你不动态创建,可以把动态创建的宏都去掉,然后把构造函数和希构函数都改成public的

15,979

社区成员

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

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