一个基于FormView的程序,打开文件时窗口自动变小

gg 2000-05-28 03:47:00
一个基于FormView的工程,一启动时最大化,但打开一个文件后自动
变小了一些。如果最小化后又最大化,就会恢复正常。不知怎么回事。
哪位大侠相助,谢谢先。
void CMYView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit(FALSE)
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style = WS_OVERLAPPED and WS_CAPTION and WS_MAXIMIZEBOX
and WS_SYSMENU and WS_MINIMIZEBOX and WS_MAXIMIZE;
cs.cx=(int)GetSystemMetrics(SM_CXSCREEN);
cs.cy=(int)GetSystemMetrics(SM_CYSCREEN);
return TRUE;
}
...全文
350 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gg 2000-05-31
  • 打赏
  • 举报
回复
各位:
我又详细跟踪了一次AfxGetapp()->OpenDocumentFile(FileName)的处理过程,觉得如下过程可以达到要求,虽然少了许多安全性的检测。
void CMyView::OnFileOpen()
{
CMyDoc* pDoc=GetDocument();
if(pDoc->SaveModified())
{
char szFilter[] ="My工程文件(*.msp) and *.msp and 所有文件(*.*) and *.* and and ";
CFileDialog OpenDlg(TRUE, NULL, NULL, NULL, szFilter);
if(OpenDlg.DoModal()==IDOK)
{
CString str;
str=OpenDlg.GetPathName();
pDoc->OnOpenDocument(str);
pDoc->SetPathName(str);
//其它处理
......
Invalidate();
}
}
}

这个问题就讨论到这儿吧,反正我也达到目的了。Kenny先生积极帮助,特给予20分,其他人等相应给分。
Kenny 2000-05-30
  • 打赏
  • 举报
回复
你的代码不是太明白。但我敢肯定,在NewFile时,pDoc->OnOpenDocument(...)是不会被执行到的。除非你在OnNewDocument()中,SetPathName(...)改变新文件名,否则文件名是不会被改变的。
要检测现在打开的文件是否需存盘,在Doc类的OnCloseDocument()中须调用CanCloseFrame()。
gg 2000-05-30
  • 打赏
  • 举报
回复
可是在View类中重载CWinapp::OnFileOpen()出现新问题:
我使用
CMCTSIMDoc* pDoc=GetDocument();
pDoc->OnOpenDocument(OpenDlg.GetPathName());
打开文件,但显然太简单,首先,它没有检测现在打开的文件是否需要存盘,另外,如果当前打开文件为空,则我在修改一些东西存盘时,它会提示存盘文件名,就如同FileNew那样,不知怎样解决最好。
如果用AfxGetapp()->OpenDocumentFile(FileName),又会出现老现象。看来要在Doc类中找函数了。我跟踪了AfxGetapp()->OpenDocumentFile(FileName)的处理过程,但没明白所以然。
gg 2000-05-30
  • 打赏
  • 举报
回复
我的意思是用上面的代码打开文件,好象程序并不认为你打开了一个文件,而以为你新建了一个文件,所以在你存盘时提示文件名。而且如果已经打开了一个文件,另外打开一个文件时,它不会提示存盘。
longx 2000-05-29
  • 打赏
  • 举报
回复
你不要在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
中设置 cx,cy,在CWinApp的InitInstance中设置
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd->UpdateWindow();

gg 2000-05-29
  • 打赏
  • 举报
回复
呵呵,加上就会有Asseration错误,不行啊。
不过这个问题有新进展,因为我原来的打开文件用的是框架的默认打开操作,即CWinapp::OnFileOpen()。框架会在打开文件后调用OnInitialUpdata(),导致该
问题。我在View类中重载该消息,不调用OnInitialUpdata(),就不会发生该现象。
很明显,是OnInitialUpdata()中的函数让其发生该情况的。但谁能更详细解释怎么
导致的。我会给分的。
gg 2000-05-29
  • 打赏
  • 举报
回复
wdf:
1.可能用WS_POPUP和WS_BORDER。关于各个属性的作用,请参考MSDN的Window styles。
2.你只需取得系统信息GetSystemMetrics,然后根据cx,cy的值设定控件的位置(在OnInitialUpdata里面处理)
ps:好像应该你给我加分。呵呵。
wdf 2000-05-29
  • 打赏
  • 举报
回复
感谢gg大侠的解答,现另有两入门问题相问,请勿见笑:

1. MDI 应用程序中的窗体,修改哪个属性能使 ChildFrame 的边框看起来象对话框
的边框。

2.基于 Formview 的应用程序应怎么做,使其能在 800*600 和 600*480 两种显示
模式都能使用(使控件的位置正常).
gg 2000-05-29
  • 打赏
  • 举报
回复
longx:
1)让其最大化时,现象并不会消除。
2)最大化的窗体能通过鼠标移动,感觉不对头。
wdf:
对于SDI,一般在CMainFrame::PreCreateWindow中设置cs.style&=~WS_THICKFRAME,就可以使Frame不能调整大小,Form的大小应该是不会变的,它是一种资源,定义以后不会变。对于MDI,你必须从CMDIChildWnd(MDI中默认产生子窗口的类)继承一个新类,然后手动改工程中CMDIChildWnd为你自己的类,再重载你自己类中的PreCreateWindow函数,改相应的标志,如WS_THICKFRAME。举例如下:
BOOL CMyChildWnd::PreCreateWindow(CREATESTRUCT& cs)
{
// Create a child window without the maximize button
cs.style &= ~WS_MAXIMIZEBOX;

// Call the base-class version
return CMDIChildWnd::PreCreateWindow(cs);
}
Kenny:
OnInitUpdata()中调用ResizePartToFit(FALSE)是Wizard生成的,你可以试验一下。你关于OnSize的说明我非常赞同,给您10分。
Kenny 2000-05-29
  • 打赏
  • 举报
回复
还有啊,CFormView::OnInitUpdate()中,已调用了一次ResizeParentToFit(FALSE),如果再调用一次会出现你所说的情况。也就是说,你自己的OnInitUpdate()中对ResizeParentToFit(FALSE)的调用是多此一举!
Kenny 2000-05-29
  • 打赏
  • 举报
回复
在OnSize中加入
GetParentFrame()->RecalcLayout();
ResizeParentToFit(FALSE);
是可以的,只是在窗口创建显示之前,就有至少两次WM_SIZE消息进来,如果相避免此问题,就得如此:
If (::IsWindow(m_hWnd))
{
CFrameWnd *pFrame = GetParentFrame();
if (pFrame && ::IsWindow(pFrame->GetSafeHwnd())
pFrame->RecalcLayout();
ResizeParentToFit(FALSE);
}
wdf 2000-05-29
  • 打赏
  • 举报
回复
Mr. longx
看了您的解答,有一类似问题想请教 : MDI 应用程序中, 基于 Formview 的窗体,
在资源中用鼠标拖动改变窗体大小,然后在 OnInitialUpdate() 中加入
GetParentFrame()->RecalcLayout();
ResizeParentToFit(FALSE);
编译运行确能将 childframe 大小变为Formview的大小,但如何确保在运行时childframe
和Formview大小保持不变呢 ? 在OnSize()中加入上述语句 , 则Asseration.
如何解决 ?
Sniper 2000-05-28
  • 打赏
  • 举报
回复
你试试在CMyView::OnSize()里加上
GetParentFrame()->RecalcLayout();
ResizeParentToFit(FALSE)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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