程序初始即最大化窗口,并且在程序过程中不能由用户来
改变窗口大小也不能移动窗口的方法。欢迎大家探讨~
    我用的是C/SDK,是这样实现的:
    CreateWindow,指定无最大化按钮风格(~WS_MAXIMIZEBOX),
    ShowWindow,指定初始最大化(SW_MAXIMIZE),
    在窗口过程中对两个非客户区鼠标消息进行处理。防止
    用户移动窗口或者双击标题栏改变窗口大小。
    case WM_NCLBUTTONDBLCLK:
     if (wParam == HTCAPTION)
return 0 ;
    case WM_NCLBUTTONDOWN:
if (wParam == HTCAPTION)
return 0 ;
不知道这样的处理方法是否有漏洞?
另外看到一些其他方法:
1,重载WM_GETMINMAXINFO。(见程序员2001年下半年合定本,
但是它还要求在CreateWindow中,去掉WS_THICKFRAME风格。
我试下来,发现去掉这一风格后,创建的窗口把WINDOWS任务栏
覆盖了...)2,处理WM_SYSCOMMAND消息。使SC_MOVE,SC_RESTORE消息直接
return。(CSDN论坛中有这样的帖子。据说试验成功,但是在
我这里却有问题。在MSDN中的帮助中这样写的:
A window receives this message when the user chooses a 
command from the window menu (formerly known as the system 
or control menu) or when the user chooses the maximize button,
 minimize button, restore button, or close button.
 意思似乎是在用户选择系统菜单的时候才会发出这个消息,因此应该
 不能起到我们希望的作用。我试验下来也是如此。不过那帖子用的好象是
 MFC写的。MFC我不会,所以不知道到底怎么样)
 不知道还有其他方法吗?

解决方案 »

  1.   

    CMenu* pMenu=GetSystemMenu(false);
    pMenu->RemoveMenu(SC_MOVE,MF_BYCOMMAND);
    pMenu->RemoveMenu(SC_SIZE,MF_BYCOMMAND);
      

  2.   

    我用MFC是这样做的:
    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    // Create a window without min/max buttons or sizable border 
        cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;    // Call the base-class version
        return CFrameWnd::PreCreateWindow(cs); }
      

  3.   

    针对sdi程序
    1。程序无最大化以及还原功能
    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_MAXIMIZEBOX;
    return TRUE;
    }
    2 程序一开始就最大化
    void CMainFrame::ActivateFrame(int nCmdShow) 
    {
    // TODO: Add your specialized code here and/or call the base class
    nCmdShow=SW_MAXIMIZE;
    CFrameWnd::ActivateFrame(nCmdShow);
    }
      

  4.   

    如何让窗口和 MDI窗口一启动就最大化和最小化
    Generate: 2002-10-9 14:9:29  JennyVenus@msn.com--------------------------------------------------------------------------------
    先说窗口,在 InitStance 函数中设定 m_nCmdShow的取值。 
    m_nCmdShow=SW_SHOWMAXMIZED //最大化 
    m_nCmdShow=SW_SHOWMINMIZED //最小化 
    m_nCmdShow=SW_SHOWNORMAL //正常方式 
     
    MDI窗口: 
    如果是创建新的应用程序,可以用MFC AppWizard 的Advanced 按钮并在MDI子窗口风格组中检测最大化或最小化还可以重载 MDI Window 的PreCreateWindow函数,设置WS_MAXMIZE or WS_MINMIZE 
     
    如果从 CMDIChildWnd派生,调用 OnInitialUpdate函数中的 CWnd::Show Window来指定 MDI Child Window的风格。
    加上
     webber84(***闭关修炼中***) (  ) 
     
      CMenu* pMenu=GetSystemMenu(false);
    pMenu->RemoveMenu(SC_MOVE,MF_BYCOMMAND);
    pMenu->RemoveMenu(SC_SIZE,MF_BYCOMMAND);
      

  5.   

    WM_SIZE:
       return 0;
    WM_MOVE:
       return 0;
      

  6.   

    TO kingofvc(其实恶狼2000也不错):
    虽然不是很明白MFC,但是从你的代码来看似乎分两步:
    1,去窗口上最大化按钮。
    2,使窗口初始最大化。
    如果真的是这样的话,应该不行的。首先这样的窗口是能移动的
    (保持最大化移动);其次,双击标题栏后窗口会缩小(我不知
    道,双击标题栏发出了什么消息,使窗口大小变化...)
    希望你能试一下,可能MFC程序不大一样?TO ma811(马头)
    WM_SIZE和WM_MOVE return 0,基本没用。它们分别是在改变大小和移动
    窗口以后发出的消息,既然是已经改变和移动了,return 0又有什么用呢?
    或者可以在return 0之前先
       ShowWindow(hWnd, SW_MAXIMIZE);
       UpdateWindow(hWnd);
    不过也不是很好吧?rubbishdog(垃圾狗)的做法是
    指定创建窗口风格为WS_OVERLAPPED | WS_SYSMENU | WS_BORDER,
    我试了一下,程序一开始最大化,但是把任务栏也覆盖了。然后通过
    双击标题栏,还是能缩小窗口的。不过缩小之后不能再改变大小了,但是
    能移动大概上因为去掉了sizable border。其他人提到的
    CMenu* pMenu=GetSystemMenu(false);
    pMenu->RemoveMenu(SC_MOVE,MF_BYCOMMAND);
    pMenu->RemoveMenu(SC_SIZE,MF_BYCOMMAND);
    我就看不大明白了,所以不知道结果怎么样,
    不过看样子好象才操作system menu?不知道大家发贴前都试过了吗?
      

  7.   

    也可用DIRECT 3D 的满屏MODE
      

  8.   

    发现自己的方法有错误。
    第一,用户可以通过右击标题栏,调用SYS MENU移动窗口。
    因此要在CreateWindow中去除sysmenu。
    第二,创建的窗口太大了,跟整个屏幕一样大。(有一部分被
    任务栏覆盖)怎么解决?
      

  9.   

    兄弟:借宝地一用:
     我需要在MFC中间如何实现: 用户不能够移动窗体的方法,即是用户不能够改变窗体的位置的方法。
     谢谢 大家。。
                                            hjzhang527662
      

  10.   

    试试这个消息看WM_WINDOWPOSCHANGING;
    这个消息在当窗口大小,位置需要改变时发送的。
      

  11.   

    我用的是XP,最大化的时候,的确不能移动,但是cs.style&=~WS_MAXIMIZEBOX即去掉最大化按钮之后,
    虽然窗口显示为最大化,但是却能按住标题栏移动了。
    而且还能通过双击标题栏来还原窗口。
    SIGH。
    我的程序还是没法完成,继续UP。
      

  12.   

    case WM_WINDOWPOSCHANGING:
    (LPWINDOWPOS) lParam->x=0;
    (LPWINDOWPOS) lParam->y=0;
    (LPWINDOWPOS) lParam->cx=CX_MAX;
    (LPWINDOWPOS) lParam->cy=CY_MAX;
    试试。
      

  13.   

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    //Remove positions of menuCMenu* pTopMenu = GetSystemMenu(FALSE);pTopMenu -> RemoveMenu(4,MF_BYPOSITION); //Maximize
    pTopMenu -> RemoveMenu(2,MF_BYPOSITION); //Size
    pTopMenu -> RemoveMenu(1,MF_BYPOSITION); //Movereturn 0;
    }