我自绘窗体,窗体风格设置如下: 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,按理并不应该遮盖啊,已经流出了任务栏高度,应该是那个隐藏的菜单引起的)
求助内容: 请问这个问题该如何解决呢?
如果可以不修改窗体风格,有其他方法响应点击任务栏图标事件,那最好了。多谢各位,分不够请直说!! 只要你有需要!
能满意结贴不容易啊!
双击标题最大化和还原代码如下:
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,按理并不应该遮盖啊,已经流出了任务栏高度,应该是那个隐藏的菜单引起的)
求助内容: 请问这个问题该如何解决呢?
如果可以不修改窗体风格,有其他方法响应点击任务栏图标事件,那最好了。多谢各位,分不够请直说!! 只要你有需要!
能满意结贴不容易啊!
----------------------------------
响应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);
}
}
我刚试了
去掉那几句修改风格的代码
点击任务栏图标 根本不会响应OnSysCommand
代码如下: int cx, cy;
CRect rect;
cx = GetSystemMetrics(SM_CXSCREEN);
cy = GetSystemMetrics(SM_CYSCREEN) - GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYFIXEDFRAME);
// 相当于 cy = GetSystemMetrics(SM_CYSCREEN) - 29;
GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYFIXEDFRAME);
任务栏 + 任务栏上边框的总高度
{
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);
}
这是找了很久找到的解决方法