我创建了一个SDI的窗口,
  当使用,WS_CAPTION风格时,使用自己的最大化按钮时用ShowWindow(SW_SHOWMAXIMIZED),或者是AfxGetMainWnd()->SendMessage(WM_SYSCOMMAND , SC_MAXIMIZE , 0 );窗口会最大化,但桌面最下面的开始菜单条会显示出来。
  可是一但我去掉WS_CAPTION时,用上面两个方法最大化窗口时,窗口就会最大到全屏模式。
不知道这是为什么?难道只要我不使用WS_CAPTION风格,也就是不想有标题栏,就不能使用上面的最大化方法吗?如果用就要重新计算整个桌面除了开始菜单条以外的区域?这怎么算呢?不知道菜单条在哪里,有多高和多宽。
  还有一个问题,在一个帖子里有人说,在OnNcCalcSize中可以使caption为0,怎么做呢,如果真能这样好像也能解决我的问题。
  请指教。

解决方案 »

  1.   

    在InitInstance函数中,将ShowWindow的参数设为SW_SHOWMAXIMIZED,最大化显示。
      

  2.   

    那样也是一样的,只要我把window style设为WS_POP | WS_VISABLE ,不带caption,最大化时就必然是全屏的模式,把taskbar给挡住了。
      

  3.   

    最大化后,你是想遮住Windows任务栏?还是不想?
      

  4.   

    将ShowWindow的参数设为SW_SHOWMAXIMIZED,这个不行,只要我把窗口样式设为ws_popup | ws_visible,整个窗口就会是全屏模式,但我如果加上ws_caption,它就可以显示出window任务栏了,但我又不想要cation!
      

  5.   

    BOOL SystemParametersInfo ( UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);uiAction = SPI_GETWORKAREA.可以吗?能给60分吗
      

  6.   

    谢谢,确实可以取出屏幕上除了taskbar以外的区域,那么就是让我自己在MAX进MoveWindow?
    或者用OnGetMinMaxInfo来限制maximize?好怪啊,难道MFC自己的最大化按钮不挡taskbar也是这样计算的?60分归你了,能有更进一步的解答,就再加分,谢谢了,我自己刚才是用整个区域减去taskbar的大小来得到这个区域的。
      

  7.   

    大哥,不要急啊,结帖时一定给你60分。我的问题其实还是没有真实解决。
    为了实现我在WS_POP没有标题栏样式下,最大化时窗口不会挡住taskbar。我有两个实现的方法,不过都觉得有点别扭。
    1。是用 cut9(切瓜玩)的方法得到desktop的工作区域,为窗口加上可调的边框样式,在OnGetMaxMinInfo的消息里进行限制,然后用maximize就OK了。这个问题是要加上可调边框,我又不怎么想要它的边框,当然可以做一些处理,但总是觉得不对劲,好麻烦啊。
    2。是在每次maximize前先给窗口加上ws_caption的样式,然后maximize,接着再去掉窗口的ws_caption样式,这样也能实现,不过有点变态。有更好的方法吗?如果能指点一下,会再加分的。
      

  8.   

    你在接到maximize消息的时候,自己计算区域、用SetWindowPos调整窗口到适当的位置和大小。
      

  9.   

    看看我的代码:
    背景是:我有个窗口P,里面有个按钮Button,当用户点Button的时候,我要把窗口挪到
    屏幕的靠左边。但是窗口P的大小不调整。同时,创建一个新窗口C,这个新窗口
    靠屏幕右边,窗口C的左边和P的右边紧紧的挨着。大致上的效果相当于在Word里头
    点help菜单出来一个菜单窗口。 //move this window to top-left corner. 窗口P
    RECT rc;
    GetWindowRect(&rc);
    MoveWindow(0,0,rc.right - rc.left, rc.bottom - rc.top); if (!m_pScanFile)
    {
                      //窗口C 
    m_pScanFile = new CDlgScanFile();
    m_pScanFile->Create(this);

    int iRight = rc.right - rc.left; //move scanfile window to top - right corner
                      //我这儿没考虑taskbar,你替换成你的去掉taskbar的区域  
    int sx = GetSystemMetrics(SM_CXFULLSCREEN);
    int sy = GetSystemMetrics(SM_CYFULLSCREEN); m_pScanFile->MoveWindow(iRight , 0, sx - iRight, sy);
    } m_pScanFile->ShowWindow(SW_SHOW);
    m_bScanFileShowed = true; m_oLabelScan.SetWindowText("<<");整个方法是这样的了,应该可以了吧?总之,不需要caption,maxmize等等,你MoveWindow就行了啊
      

  10.   

    倒,广告也来!
    void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) 
    {
    // TODO: Add your message handler code here and/or call default
    if ( SC_MAXIMIZE == nID)
    {
    AfxMessageBox(_T("test"));
    }// end if
    CFrameWnd::OnSysCommand(nID, lParam);
    }
    wangk(倒之) 哥说的对啊,再谢谢cut9(切瓜玩) 。加分结了。