我自绘窗体,窗体风格设置如下: STYLE WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
双击标题最大化和还原代码如下:
void CMyDlg::OnBtnMax() 
{
//最大化时,为了不遮盖底部状态栏,所以应该取显示器工作区域的高度,而不是显示器的高度
RECT rWorkArea; 
BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkArea, 0); 
int iMaxWidth  = rWorkArea.right - rWorkArea.left;
int iMaxHeight = rWorkArea.bottom - rWorkArea.top;

if(!m_bMaxStatus)
{
//记录对话框最大化前的位置与大小
GetWindowRect(&mPreviewRect);

MoveWindow(0, 0, iMaxWidth, iMaxHeight);
}
else
{
//还原最大化前的位置与大小
  MoveWindow(mPreviewRect.left, mPreviewRect.top, mPreviewRect.Width(), mPreviewRect.Height());
}

m_bMaxStatus = !m_bMaxStatus;
}
UINT CMyDlg::OnNcHitTest(CPoint point) 
{
    CRect rc;
     GetClientRect(&rc); if(m_bMaxStatus)
{
return CDialog::OnNcHitTest(point);
}
}
以上代码已经实现了正常的最大化和还原功能。我最主要想解决的问题是:
自绘窗体有个问题没办法解决: 点击window下面任务栏程序的图标不能最小化和还原(未响应?)

为了解决这个我在程序里修改了窗体风格:
         ModifyStyle(0, WS_MINIMIZEBOX);  //为了响应任务栏图标点击事件
ModifyStyle(0, WS_MAXIMIZEBOX);
         ModifyStyle(0, WS_SYSMENU);
这样点击任务栏图标就能最小化和还原了,并且右键图标也有系统菜单了。
但是这时双击标题最大化就出问题了,程序最大化会遮盖任务栏(跟踪代码height是870,显示器高是900,按理并不应该遮盖啊,已经流出了任务栏高度,应该是那个隐藏的菜单引起的)
求助内容: 请问这个问题该如何解决呢?
           如果可以不修改窗体风格,有其他方法响应点击任务栏图标事件,那最好了。多谢各位,分不够请直说!! 只要你有需要!
能满意结贴不容易啊!

解决方案 »

  1.   

    如果可以不修改窗体风格,有其他方法响应点击任务栏图标事件,那最好了。
    ----------------------------------
    响应WM_SYSCOMMAND消息
    void CXXXDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    switch(nID)
    {
    case SC_RESTORE:
    AfxMessageBox(_T("SC_RESTORE"));
    break;
    case SC_ICON:
    AfxMessageBox(_T("Minimize"));
    break;
    }
    CDialog::OnSysCommand(nID, lParam);
    }
    }
      

  2.   


    我刚试了
    去掉那几句修改风格的代码
    点击任务栏图标 根本不会响应OnSysCommand
      

  3.   

    最大化时,减去任务栏高度,任务栏高度有个函数可以获取。
    代码如下: int cx, cy;
     CRect rect;
    cx = GetSystemMetrics(SM_CXSCREEN);
    cy = GetSystemMetrics(SM_CYSCREEN) - GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYFIXEDFRAME);
    // 相当于  cy = GetSystemMetrics(SM_CYSCREEN) - 29;
      

  4.   

    说明:
     GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYFIXEDFRAME);
    任务栏 + 任务栏上边框的总高度
      

  5.   

    自绘非客户区最好相应OnNcCalcSize,再次设置非客户去的宽度/高度下面是我自绘非客户去的OnNcCalcSize代码,供参考void C_BsSkinDialog::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
    {
    lpncsp->rgrc[0].top += DLG_BOLDER_TITLE - GetSystemMetrics(SM_CYCAPTION) - GetSystemMetrics(SM_CYDLGFRAME);
    lpncsp->rgrc[0].left += DLG_BOLDER_LEFT - GetSystemMetrics(SM_CYDLGFRAME);   
    lpncsp->rgrc[0].bottom -= DLG_BOLDER_BOTTOM - GetSystemMetrics(SM_CYDLGFRAME);   
    lpncsp->rgrc[0].right -= DLG_BOLDER_RIGHT - GetSystemMetrics(SM_CYDLGFRAME);    CDialog::OnNcCalcSize(bCalcValidRects, lpncsp);
    }
      

  6.   

    ModifyStyle( WS_CAPTION, WS_MINIMIZEBOX, SWP_DRAWFRAME );结贴了
    这是找了很久找到的解决方法