我的MFC程序是MDI,我想去掉最大化按钮,保留最小化和关闭按钮,该如何实现?

解决方案 »

  1.   

    cs.style &= ~WS_MAXIMIZEBOX;
      

  2.   

    楼上的,对话框的怎么实现?
    ------------------------------------
    体验速度,体验CSDN新版论坛助手:http://community.csdn.net/Expert/TopicView.asp?id=3108679
      

  3.   

    cs.style &= ~WS_MAXIMIZEBOX
      

  4.   

    可以重载WM_SYSCOMMAND在里面可以实现你想要的任何操作,呵呵
      

  5.   

    用VC++在标题栏上画按钮
    根据需要,有时候我们可能要在一些特殊控件上创建控件,比如在STATUSBAR上创建进度条,在TOOLBAR,REBAR上创建COMBOX,上次发表了一个在STATUSBAR上创建BUTTON的文章,这次就介绍下如何在标题栏上画按钮吧?
    现在很多换皮肤程序是怎么实现的呢? 实际上就是画上去的,当然,说起来很简单,做起来也要涉及很多知识,我们这次就在标题栏上创建一个BUTTON。程序的原理是把2副做好的图片(一个表示按下,另一个表示非按下状态),画到标题栏上。小弟水平很菜,希望大家不要见笑!首先画2个BITMAP图象,由于标题栏很小,所以就画16X16图象就行了,然后声明3个变量CBitmap m_bitmapPressed; file://按钮被按下的图象
    CBitmap m_bitmapUnpressed; file://按钮没被按下的图象
    BOOL m_bPressed; file://按钮是否被按下??接着在程序初始化构造函数里添加代码m_bPressed = FALSE ;
    m_bitmapPressed.LoadBitmap(IDB_PRESS); /
    m_bitmapUnpressed.LoadBitmap(IDB_UNPRESS); file://16x16 bitmap 
    接着就是画按钮了,要处理的消息是:
    WM_Activate和WM_NcPaint()用CLASS WIZARD添加消息入口后,最终代码如下void CMyButtonDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
    {
     CDialog::OnActivate(nState, pWndOther, bMinimized);
     
     DrawMyButton();
     
    }void CMyButtonDlg::OnNcPaint() 
    {CDialog::OnNcPaint(); 
    file://注意此处,此处是自己添加的,而非VC自动生成,若省略此代码,则重画窗体,很慢 DrawMyButton();
    }
    大家注意到了,在画BUTTON的时候,用到了DrawMyButton自定义函数,此函数代码如下:void CMyButtonDlg::DrawMyButton()
    { if ( !IsWindowVisible()|| IsIconic() )
      return; CDC memDC;
     CDC* pDC = GetWindowDC ( ) ;
     memDC.CreateCompatibleDC( pDC );
     memDC.SelectObject( m_bPressed ? &m_bitmapPressed : &m_bitmapUnpressed ); file://选择要画哪中位图 CRect rect, rectWnd;
     GetButtonRect(rect);
     GetWindowRect(rectWnd) ;
     rect.OffsetRect(-rectWnd.left, -rectWnd.top ); // draw it pDC -> StretchBlt( rect.left, rect.top, rect.Width () ,  
      rect.Height(), &memDC, 0, 0, 16,  file://画一个16x16 的button
      16, SRCCOPY ); memDC.DeleteDC();
     ReleaseDC( pDC );}file://获取要创建的BUTTON的位置
    void CMyButtonDlg::GetButtonRect(CRect &rect)
    { GetWindowRect(&rect) ;
     rect.top += GetSystemMetrics(SM_CYFRAME)+1;
     rect.bottom = rect.top + GetSystemMetrics( SM_CYSIZE )-4;
     rect.left = rect.right - GetSystemMetrics( SM_CXFRAME ) - (2 * GetSystemMetrics( SM_CXSIZE ) )-1;
     rect.right = rect.left + GetSystemMetrics(SM_CXSIZE)-3;}
    为了响应按钮单击事件,我们还需要添加函数(此处处理WM_NCLBUTTONDOWN消息)void CMyButtonDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
    {
     if ( nHitTest == HTCAPTION )
     {
      CRect rect;
      GetButtonRect( rect );
      file://判断鼠标是不是按在了自画的"BUTTON"区域 
      if ( rect.PtInRect( point ) )
      {
       m_bPressed = !m_bPressed;
       DrawMyButton() ;
      }
      MessageBox("按钮单击事件被捕捉......"); }
     
     CDialog::OnNcLButtonDown(nHitTest, point);
    }
    当然,根据需要我们还可以处理WM_NCMOUSEMOVE消息,此消息可用来改变按钮状态,比如:当鼠标处于BUTTON
    区域时,显示一种BITMAP,当鼠标移出BUTTON区域时,则改变BITMAP,很多换皮肤的程序就用到了这个!void CMyButtonDlg::OnNcMouseMove(UINT nHitTest, CPoint point) 
    {
     
     CRect rect;
     GetButtonRect( rect );
     if ( rect.PtInRect(point)) file://鼠标位置在按钮内部
     {
      m_bPressed = FALSE; file://随便设置一种按钮图象风格
      DrawMyButton() ;
     }
     else
     {
      m_bPressed = TRUE; file://反之
      DrawMyButton() ; 
     }
     CDialog::OnNcMouseMove(nHitTest, point);
    }  OK,编译运行,结果如下,呵呵~~~ 效果是比较UGLY了一点,不过我在这里只是讲解下理论,具体实际应用中怎么做就看你的了!
      

  6.   

    重载PreCreateWindow():
    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;
    }
      

  7.   

    使用GetWindowLong把风格得到,然后把风格中的最大化按钮去掉,最后用SetWindowLong写入