严格来说不是全屏,而是在保留标题栏、菜单等区域下,实现窗口的最大化,但是如果任务栏不是自动隐藏,窗口就无法盖住任务栏,因此想问问,有没有什么方法,可以让窗口最大化时盖住任务栏ps:在任务栏不是自动隐藏的前提下

解决方案 »

  1.   

    参考下,呵呵...... int cx, cy; 
        HDC dc = ::GetDC(NULL); 
        cx = GetDeviceCaps(dc,HORZRES) + GetSystemMetrics(SM_CXBORDER); 
        cy = GetDeviceCaps(dc,VERTRES) + GetSystemMetrics(SM_CYBORDER); 
        ::ReleaseDC(0,dc);     //去除标题和边框
        SetWindowLong(m_hWnd, GWL_STYLE,GetWindowLong(m_hWnd, GWL_STYLE) & 
        (~(WS_CAPTION | WS_BORDER)));     // 置对话框为最顶端并扩充到整个屏幕
        ::SetWindowPos(m_hWnd, HWND_TOPMOST, -(GetSystemMetrics(SM_CXBORDER)+2), 
            -(GetSystemMetrics(SM_CYBORDER)+2), cx+5,cy+5, SWP_NOZORDER);
      

  2.   

    另外,修改任务栏的自动隐藏属性,可以实现:
    APPBARDATA stPa ;
    memset(&stPa, 0, sizeof(APPBARDATA));
    stPa.cbSize = sizeof(APPBARDATA);
    stPa.hWnd = ::FindWindow("Shell_TrayWnd",0);
    stPa.lParam = ABS_AUTOHIDE;
    SHAppBarMessage(ABM_SETSTATE, &stPa);但是这种方法有一点停滞,显得程序很不流畅,不知道还有什么好方法,大虾们赐教撒~~
      

  3.   

    AfxGetMainWnd()->SetWindowPos(&wndTopMost, 0, 0, ::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN), 0);
      

  4.   

    得到包括任务栏在内的全屏尺寸:
    SystemParametersInfo(SPI_GETWORKAREA,0,(LPRECT)$rc,0);
    rc就是能盖住任务栏的尺寸,按这个尺寸设置窗口大小就可以了。
      

  5.   

    同意Mackz的方法,我经常这么做
      

  6.   

    Mackz的方法早试过了阿,盖不住任务栏的
      

  7.   

    我知道了,你的任务栏肯定是设置了显示在最上面的
    任务栏在点Win键是会出来,不过当点了全屏的对话框的标题栏后又可以盖住任务栏了
    我刚试过
      

  8.   

    噢,是我开头没说清楚,下面是我们软件的一个需求,当界面最大化时,要求尽可能的利用屏幕空间,现在最后的问题就是,如果任务栏是固定显示的,最好能够盖住任务栏,开头的处理方法类似Mackz说的(在按钮里执行),但是这种方法有一个问题,窗口虽然达到了显示效果,但是标题栏上的“最大化”按钮还在(窗口实际上不是处于最大化状态),如果你继续点最大化,窗口就会缩小(成为真正的最大化状态),我们找了半天,不知道怎么修改这个状态(修改为“向下还原”),因此这个方法暂时行不通。
    第二种方法是上面说到的修改任务栏的自动隐藏属性,窗口只是直接最大化而已,但是来回切换自动隐藏属性,windows使用的时间太多了,界面反应达不到性能要求:(
      

  9.   

    另外,SetWindowPos的代码如果在WM_SIZE里处理最大化时执行,则无法盖住任务栏写了这么久,被个小问题困住了,向各位讨教:(这个需求有一个最终方案是可以实现的,就是彻底去掉标题栏,用全屏的方式,自己再模拟一个标题栏,但是软件的工具栏很多,修改起来涉及的代码比较多,现在想看看通过一些简单的方法能不能实现,呵呵
      

  10.   

    这样不知行否?void CXXX::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
     
    if   (nID     ==   SC_MAXIMIZE)//最大化   
       {   
    SetWindowPos(&wndTopMost, 0, 0, ::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN), 0);
    }  if   (nID     ==   SC_MINIMIZE)//最大化   
       {   
           .....

       else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }
      

  11.   

    void CXXDlg::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy);

    // TODO: Add your message handler code here
    if (nType == SIZE_MAXIMIZED)
    {
    SetWindowPos(&wndTopMost, 0, 0, 
                      GetSystemMetrics(SM_CXSCREEN)-1,GetSystemMetrics(SM_CYSCREEN), 0);
    }
    }
    记得不要设置成 GetSystemMetrics(SM_CXSCREEN),与它有一点小差别就OK了.
      

  12.   

    //全屏显示
    void FullScreen(HWND hWnd){
    GetWindowRect(hWnd,&m_OldWndRect);//保存当前窗口的屏幕位置
    //获取屏幕分辨率
    int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
    int nFullHeight=GetSystemMetrics(SM_CYSCREEN);//以像素为单位计算的屏幕尺寸
    m_FullScreenRect.left=0; //可以微量-1
    m_FullScreenRect.top=0;
    m_FullScreenRect.right=nFullWidth; //可以微量加1~3
    m_FullScreenRect.bottom=nFullHeight;
    //重新放置窗口到所有最顶层窗口之上包括任务栏窗口并发送窗口框架改变消息
    SetWindowPos(hWnd,HWND_TOPMOST,m_FullScreenRect.left,m_FullScreenRect.top,
    m_FullScreenRect.right,m_FullScreenRect.bottom,SWP_FRAMECHANGED); 
    }//退出全屏显示
    void ExitFullScreen(HWND hWnd){
    //恢复上一次窗口的大小和屏幕的位置并重新放置显示
    SetWindowPos(hWnd,HWND_TOPMOST,m_OldWndRect.left,m_OldWndRect.top,m_OldWndRect.right-m_OldWndRect.left,m_OldWndRect.bottom-m_OldWndRect.top,SWP_FRAMECHANGED); 
    }
      

  13.   

    如果要实现真正全屏可以保存窗口风格,然后去掉边框滚动条
    m_WndStyle=GetWindowLong(hWnd,GWL_STYLE); //保存当前窗口的风格
    m_FullStyle=m_WndStyle&(~(WS_DLGFRAME|WS_THICKFRAME|WS_BORDER|WS_VSCROLL|WS_HSCROLL));//去除所有边框和滚动条
    SetWindowLong(hWnd,GWL_STYLE,m_FullStyle); //设置全屏窗口风格即出时记得加上恢复窗口风格
    SetWindowLong(hWnd,GWL_STYLE,m_WndStyle); //恢复上一次保存的窗口风格