一个MDI的问题,大侠进来帮小妹一把,谢谢############################################
我新建了一个MDI应用程序,已经解决了:把初始的子窗口关闭的问题,现在我想这样:
点击新建按钮,出来一个Dialog可以对新建的子窗口的大小进行设定,点击Dialog上的ok后新建相应大小的子窗口,另外该子窗口不能最大化,不过能够随着父窗口的变化而相应调整比例。
好像有点罗索,不知道这样的功能能否实现,谢谢
问题点数:20、回复次数:14Top
1 楼xiangshifu99(做男人挺好)回复于 2003-09-03 23:31:01 得分 2
很好哪 取得子窗口的句柄,设置属性就可以了Top
2 楼cymlife(陈寞)回复于 2003-09-04 00:00:04 得分 10
写两个函数在如下:
CMDIChildWnd* CMainFrame::CreateNewChild(CRuntimeClass *pClass, UINT nResources, HMENU hMenu, HACCEL hAccel)
{
ASSERT(pClass != NULL);
CMDIChildWnd* pFrame = (CMDIChildWnd*) pClass->CreateObject();
ASSERT_KINDOF(CMDIChildWnd, pFrame);
// load the frame
CCreateContext context;
context.m_pCurrentFrame = this;
if (!pFrame->LoadFrame(nResources,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &context))
{
TRACE0("Couldn't load frame window.\n");
delete pFrame;
return NULL;
}
return pFrame;
}
void CMainFrame::FinalReleaseChild(CMDIChildWnd* pChildFrame, UINT nResources, HMENU hMenu, HACCEL hAccel)
{
if (pChildFrame != NULL)
{
CString strFullString, strTitle;
if (strFullString.LoadString(nResources))
AfxExtractSubString(strTitle, strFullString, CDocTemplate::docName);
// set the handles and redraw the frame and parent
pChildFrame->SetHandles(hMenu, hAccel);
pChildFrame->SetTitle(strTitle);
pChildFrame->InitialUpdateFrame(NULL, TRUE);
}
}
使用方法:
void myTest()
{
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
CMyChildFrame* pMyChildFrame = (CMyChildFrame*)pFrame->CreateNewChild(
RUNTIME_CLASS(CMyChildFrame), IDR_MYTYPE, m_hMDIMenu, m_hMDIAccel);
pFrame->FinalReleaseChild(pMyChildFrame , IDR_MYTYPE);
//做想做的事情
pMyChildFrame->MoveWindow(10, 10, 100, 100);
HMENU hSysMenu = ::GetSystemMenu(pMyChildFrame->m_hWnd, FALSE);
EnableMenuItem(hSysMenu, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED);
pMyChildFrame->SetWindowTitle("My Test");
pMyChildFrame ->ShowWindow(SW_SHOW);
}
Top
3 楼cymlife(陈寞)回复于 2003-09-04 09:42:08 得分 2
首先,创建一个CMyChildFrame的类,直接用CChildFrame也可以。
Test函数放在哪里都可以,比如CMainFrame::Test(),作为测试,它可以是对应一个菜单的消息映射函数。Top
4 楼cymlife(陈寞)回复于 2003-09-04 09:44:52 得分 0
哎,我可不是大侠哦!Top
5 楼flinming(flinming)回复于 2003-09-04 09:52:01 得分 0
当然可以实现。。一般是movewindow实现了Top
6 楼flinming(flinming)回复于 2003-09-04 10:51:17 得分 2
【点击新建按钮,出来一个Dialog可以对新建的子窗口的大小进行设定】
你就通过setwindowpos设置子窗体的大小
如果父窗体变化的时候,你就通过在父窗体的movesize事件了,取得父窗体当前得窗体大小
比如有个rect,你就根据这个坐标来控制子窗体得大小,通过子窗体movewindow到rect得区域Top
7 楼crazyeagle(疯狂鹰)回复于 2003-09-04 13:09:00 得分 0
类似观注!!Top
8 楼xiaoliuzi(小六子)回复于 2003-09-04 13:45:22 得分 0
upTop
9 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-04 17:35:08 得分 4
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
if( !CMDIChildWnd::PreCreateWindow(cs) )
return FALSE;
cs.cx = 100;
cs.cy = 300;
return TRUE;
}Top
10 楼xiaoliuzi(小六子)回复于 2003-09-05 08:41:52 得分 0
upTop
11 楼popyyb(subreina)回复于 2003-09-05 10:44:27 得分 0
大侠,我这样写,为什么要点击ok按钮两三次,才show出子窗体啊,为什么?
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
if( !CMDIChildWnd::PreCreateWindow(cs) )
return FALSE;
if( IDOK == m_pDlg.DoModal())
{
cs.cx= 720;//m_pDlg.sizeX;//100;
cs.cy= 576;//m_pDlg.sizeY;//200;
cs.x = 100;
cs.y = 100;
return TRUE;
}
else
return FALSE;
}Top
12 楼popyyb(subreina)回复于 2003-09-05 12:26:08 得分 0
?Top
13 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-05 15:33:07 得分 0
原因没有弄清楚
CChildFrame::CChildFrame()
{
m_x = 200;
m_y = 100;
if( IDOK == m_pDlg.DoModal())
{
m_x = dlg.m_x;
m_y = dlg.m_y;
}
}
这样可以解决
但你的原因没有弄清楚Top
14 楼popyyb(subreina)回复于 2003-09-05 22:44:48 得分 0
upTop



