我修改的程序是基于MFC的SDI,程序运行时默认状态是最大化,即一打开程序就是最大化状态,我在框架类下面添家如下代码:
void CMainFrame::ActivateFrame(int nCmdShow) 
{
// TODO: Add your specialized code here and/or call the base class
int nScreenCount=2;
int cxScreen = ::GetSystemMetrics(SM_CXSCREEN);
int cyScreen = ::GetSystemMetrics(SM_CYMAXIMIZED);
CRect rect; 
rect.left = 0;
rect.top = 0;
rect.right = cxScreen;
rect.bottom = cyScreen;//wei le bu bei ren wu lan zhe zhu
if(nScreenCount==2)
{
rect.right=rect.right/2;
}
else if(nScreenCount==4)
{
rect.right=rect.right/2;
rect.bottom=rect.bottom/2;
}
WINDOWPLACEMENT wndpl;
wndpl.length=sizeof(WINDOWPLACEMENT); wndpl.showCmd=SW_SHOW; wndpl.flags=WPF_SETMINPOSITION; wndpl.ptMinPosition=CPoint(0,0); wndpl.ptMaxPosition=CPoint(-::GetSystemMetrics(SM_CXBORDER),-::GetSystemMetrics(SM_CYBORDER)); wndpl.rcNormalPosition=rect; SetWindowPlacement(&wndpl);
nCmdShow=SW_SHOW;
CFrameWnd::ActivateFrame(nCmdShow);
}
在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)函数中设置为:
cs.style &= WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
| WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | ~WS_MAXIMIZEBOX/* | WS_MAXIMIZE*/;
这样程序运行起来好象根本没有执行这段代码,运行起来的默认状态还是最大化,当我双击标题栏或者点击还原按钮时,才达到我所要的效果(窗口占屏幕一半),请问各位这是什么原因,帮忙啊,急用,谢谢了。

解决方案 »

  1.   

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    cs.x = 0;
    cs.y = 0;
    cs.cx = 1024;
        cs.cy = 768;  cs.style = WS_BORDER | WS_CAPTION | WS_POPUPWINDOW | WS_MAXIMIZE;
        cs.style &= ~FWS_ADDTOTITLE;      
    cs.style &= ~WS_SYSMENU; if( !CFrameWnd::PreCreateWindow(cs) )
    return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs return TRUE;
    }
      

  2.   

    我已经试过了
    int nScreenCount=2;
    int cxScreen = ::GetSystemMetrics(SM_CXSCREEN);
    int cyScreen = ::GetSystemMetrics(SM_CYMAXIMIZED);
    CRect rect; 
    rect.left = 0;
    rect.top = 0;
    rect.right = cxScreen;
    rect.bottom = cyScreen;//wei le bu bei ren wu lan zhe zhu
    if(nScreenCount==2)
    {
    rect.right=rect.right/2;
    }
    else if(nScreenCount==4)
    {
    rect.right=rect.right/2;
    rect.bottom=rect.bottom/2;
    }
    cs.x = rect.left;
    cs.y = rect.top;
    cs.cx = rect.Width();
    cs.cy = rect.Height();这样还是不行
      

  3.   

    要控制一个框架的的最大最小尺寸,你需要做两件事情。  第一步:在CFrameWnd的继承类中处理消息WM_GETMINMAXINFO,结构MINMAXINFO设置了整个窗口类的限制,因此记住要考虑工具条,滚动条等等的大小。// 最大最小尺寸的象素点 - 示例
    #define MINX 200
    #define MINY 300
    #define MAXX 300
    #define MAXY 400void CMyFrameWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
    {
     CRect rectWindow;
     GetWindowRect(&rectWindow); CRect rectClient;
     GetClientRect(&rectClient); // get offset of toolbars, scrollbars, etc.
     int nWidthOffset = rectWindow.Width() - rectClient.Width();
     int nHeightOffset = rectWindow.Height() - rectClient.Height(); lpMMI->ptMinTrackSize.x = MINX + nWidthOffset;
     lpMMI->ptMinTrackSize.y = MINY + nHeightOffset;
     lpMMI->ptMaxTrackSize.x = MAXX + nWidthOffset;
     lpMMI->ptMaxTrackSize.y = MAXY + nHeightOffset;
    }
      第二步:在CFrameWnd的继承类的PreCreateWindow函数中去掉WS_MAXIMIZEBOX消息,否则在最大化时你将得不到预料的结果.BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
    {
     cs.style &= ~WS_MAXIMIZEBOX;
     return CFrameWnd::PreCreateWindow(cs);
    }
      

  4.   


    在CWinApp::InitInstance()调用pMainFrame->ShowWindow(m_nCmdShow)前设置CWinApp::m_nCmdShow为SW_SHOWMAXIMIZED
      

  5.   

    TO:carbon107(<软件开发思想.h>)
    谢谢了,幸亏你提醒我在CWinApp::InitInstance()调用pMainFrame->ShowWindow(m_nCmdShow)前设置CWinApp::m_nCmdShow为SW_SHOWMAXIMIZED
    要不然我还找不到原因呢,现在解决了,多谢。