学习2周VC 做了个系统,怎样新建MDI子窗口,

janly 2006-08-16 11:50:11
来到这公司,我一点VC都不会,也招我进来了,真的太幸运了!
现在要我用VC做个同样的软件,上班2周,出是只了模型,现在面临的是怎么样来新建MDI子窗口
也是就是把我做的对话框当子窗口放入框架中。这个星期要完成,完成不了可能没得做,谢谢了!

如下是新建非模态对话框时的代码,要怎么修改过来
CSMG_list* dlg;
dlg=new CSMG_list;
dlg->Create(IDD_SMG_LIST);
dlg->ShowWindow(SW_SHOW);


如下是自动生成的MDI子窗口的代码,怎么看也不明白

// create a new MDI child window
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
pFrame->CreateNewChild(RUNTIME_CLASS(CChildFrame), IDR_SMGTYPE, m_hMDIMenu, m_hMDIAccel);
...全文
980 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
janly 2006-08-17
  • 打赏
  • 举报
回复
謝謝你了,基本功能我搞定了,我沒有修改什麼,只是加入了class CSMGDoc : public CDocument
自然就行了,但還有不足
主窗口啟動最大化
子窗口啟動最大化
子窗口的標題不能為空
子窗口能不能限制多個實例
weiit 2006-08-17
  • 打赏
  • 举报
回复
up
janly 2006-08-17
  • 打赏
  • 举报
回复
up
janly 2006-08-17
  • 打赏
  • 举报
回复
怎麼沒有人了
ldsjlzy 2006-08-16
  • 打赏
  • 举报
回复
注意OnNewDocument要返回FALSE,否则会创建两个子框架
ldsjlzy 2006-08-16
  • 打赏
  • 举报
回复
最快方法把dlg改成CFromView,以下代码经测试可行
在CYourDoc::OnNewDocument()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CMDIChildWnd* pChildWnd = pMainWnd->CreateNewChild(RUNTIME_CLASS(CMDIChildWnd), IDR_MAINFRAME );

CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CYourFromView);
context.m_pCurrentDoc = this;
CYourFromView* pNewView = STATIC_DOWNCAST(CYourFromView, pChildWnd->CreateView(&context));
}
janly 2006-08-16
  • 打赏
  • 举报
回复
CResult * pResult;
.....

這一段代碼是行,但新建出來的空的,我要子窗口是設計好的窗體,ID:IDD_SMG_LIST
我不是做記事本都來寫東東,我是做管理系統,多次新建還是打開的同一個窗體
怎麼樣讓這個我自己設計好的窗體放入框架中



billy145533 2006-08-16
  • 打赏
  • 举报
回复
class CResult : public CMDIChildWnd
{
DECLARE_DYNCREATE(CResult)
protected:

.....

弹出窗口:
CResult* pResult;
pResult = new CResult();
pResult->Create(NULL,"查询结果",WS_MAXIMIZE|WS_HSCROLL|WS_VSCROLL|WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_CHILD,CRect(0,0,400,300),(CMainFrame*)AfxGetMainWnd(),0);

pResult->ShowWindow(SW_SHOW);
billy145533 2006-08-16
  • 打赏
  • 举报
回复
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
pFrame->CreateNewChild(RUNTIME_CLASS(CChildFrame), IDR_SMGTYPE, m_hMDIMenu, m_hMDIAccel);
mfc包含了很多东西,刚开始学都是这样,云里雾里的,
STATIC_DOWNCAST(CMainFrame, m_pMainWnd)
RUNTIME_CLASS
都是宏,具体可以看它的实现
DYNAMIC_DOWNCAST提供runtime类型校验(IsKindOf
STATIC_DOWNCAST类似强制类型转换
RUNTIME_CLASS的作用就是引用由DECLARE_DYNAMIC宏引入的静态成员变
量。
ldsjlzy 2006-08-16
  • 打赏
  • 举报
回复
那代码不能放在void CSMGApp::OnFileNew() 中
要放在void CSMGDoc::OnNewDocument()
上面写得很清楚
formview类型要改为child型在form资源窗口的属性页内的styles下的sytle选项选择,默认是popup改成child
快买本MFC深入浅出看一下。
janly 2006-08-16
  • 打赏
  • 举报
回复
如果注釋了this 這行,運行後也不行,還有一個提示
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: D:\MyProjects\MFC\SMG\Debug\SMG.exe
File: viewform.cpp
Line: 69

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
中止(A) 重試(R) 忽略(I)
---------------------------
janly 2006-08-16
  • 打赏
  • 举报
回复
注意formview类型要改为child型
不明白,這個要在哪裡轉換,以上的錯誤是因為沒有轉換作成的嗎?
janly 2006-08-16
  • 打赏
  • 举报
回复
終於等到你的回答了,我修改為如下,還有一個錯誤,是this 這行
怎麼回事?



CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CMDIChildWnd* pChildWnd = pMainWnd->CreateNewChild(RUNTIME_CLASS(CMDIChildWnd), IDR_MAINFRAME );

CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CSMG_list);
context.m_pCurrentDoc = this;
CSMG_list* pNewView = STATIC_DOWNCAST(CSMG_list, pChildWnd->CreateView(&context));

// return FALSE;
----------------------------------------
D:\MyProjects\MFC\SMG.cpp(137) : error C2440: '=' : cannot convert from 'class CSMGApp *const ' to 'class CDocument *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.



ldsjlzy 2006-08-16
  • 打赏
  • 举报
回复
在下面方法加
void CSMGDoc::OnNewDocument()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CMDIChildWnd* pChildWnd = pMainWnd->CreateNewChild(RUNTIME_CLASS(CMDIChildWnd), IDR_MAINFRAME );

CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CYourFromView);
context.m_pCurrentDoc = this;
CYourFromView* pNewView = STATIC_DOWNCAST(CYourFromView, pChildWnd->CreateView(&context));

return FALSE;
}
注意formview类型要改为child型
ldsjlzy 2006-08-16
  • 打赏
  • 举报
回复
在下面方法加
void CSMGDoc::OnNewDocument()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CMDIChildWnd* pChildWnd = pMainWnd->CreateNewChild(RUNTIME_CLASS(CMDIChildWnd), IDR_MAINFRAME );

CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CYourFromView);
context.m_pCurrentDoc = this;
CYourFromView* pNewView = STATIC_DOWNCAST(CYourFromView, pChildWnd->CreateView(&context));

}
janly 2006-08-16
  • 打赏
  • 举报
回复
我按你的方法做了,己从CFormView继承
然後呢 在下面的怎麼寫代碼
void CSMGApp::OnFileNew()
{

}
ldsjlzy 2006-08-16
  • 打赏
  • 举报
回复
怎麼樣把对话框改為FormView来实现
----------------------------------
在vc的资源栏中先插入一对话框然后ctrl+w,提示create a new class选继承从CFormView
janly 2006-08-16
  • 打赏
  • 举报
回复
怎麼樣把对话框改為FormView来实现
我不是很會這東東,能不能說說你的郵箱。我把我的工程發給你幫我做一下。
raymonzhao 2006-08-16
  • 打赏
  • 举报
回复
lz没有用多方档视图模板吗?在APP中把文档,视图和子框架窗口同时加入一个模板.这样的话,子框架窗口和视图.文档都会自动建立.
m_pDocTemplateSel = new CMultiDocTemplate(
IDR_FCSTATTYPE,
RUNTIME_CLASS(CXXXDocument),
RUNTIME_CLASS(CXXXChildFrame),
RUNTIME_CLASS(CXXXView));
AddDocTemplate(m_pDocTemplateSel);
而你的对话框可以改用FormView来实现.
janly 2006-08-16
  • 打赏
  • 举报
回复
樓上的幾位高手,能否留下你們的郵箱,我發我的工程給你們幫我弄一下好嗎
加载更多回复(2)

15,979

社区成员

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

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