每次当鼠标在标题栏按下的时候,原来的最大化,最小化这些按钮就重新显示出来一会!而我在WM_NCLBUTTONDOWN和WM_NCMOUSEMOVE ,WM_NCLBUTTONDBCLICK中都重绘了标题栏!但是当我将应用程序的系统菜单打开后(也就是,还原,最大化,最小化的那个菜单),就不会出现原先的问题了!如果去掉WM_NCLBUTTONDBCLICK的默认CDialog::OnNcLButtonDown()也可以,就是对标题栏无响应了!还有就是去掉对话框的System menu属性也可以!但是任务栏中的TAB无图标!
请众位大哥指教!
请众位大哥指教!
解决方案 »
- 向高手提问。关于线程的东西
- 怎样在MFC中读出doc文档(非纯文本)?
- 寻求关于BT协议与BT下载方面的技术资料
- 我用ADO操作ORACLE中的BLOB的程序在Recordset->Open()函数中出错了,请高手指教!!!
- 哪位兄弟有Quicktime的开发经验啊?和小弟交流一下啊。遇到难题了。----SOS!!
- CSTDIOFILE 郁闷问题 READSTRING 读入 怪 高手帮忙。。。。。
- 为什么我在程序的开头加了包含printf的头文件,编译仍说printf为声明呢?
- 如何读取数据库表的记录数?
- VC编写WIN32 console应用程序, 怎么支持ADO访问数据库?
- 一个很长的字符串如何分行写?
- 一个小问题关于DIB位图的
- 请告诉那有postscript语言的格式详细说明,马上给分
CBrush Brush(RGB(0,100,255));
CBrush* pOldBrush = pDC->SelectObject(&Brush); CRect rtWnd, rtTitle, rtButtons;
GetWindowRect(&rtWnd);
//取得标题栏的位置
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE); CPoint point;
//填充顶部框架
point.x = rtWnd.Width();
point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME)+1;
pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
/* //填充左侧框架
point.x = GetSystemMetrics(SM_CXFRAME);
point.y = rtWnd.Height();
pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
//填充底部框架
point.x = rtWnd.Width();
point.y = GetSystemMetrics(SM_CYFRAME);
pDC->PatBlt(0, rtWnd.Height()-point.y, point.x, point.y, PATCOPY);
//填充右侧框架
point.x = GetSystemMetrics(SM_CXFRAME);
point.y = rtWnd.Height();
pDC->PatBlt(rtWnd.Width()-point.x, 0, point.x, point.y, PATCOPY);
//填充菜单下部框架
point.x = rtWnd.Width();
point.y = GetSystemMetrics(SM_CYFRAME)-1;
pDC->PatBlt(0, GetSystemMetrics(SM_CYMENU)+GetSystemMetrics(SM_CYSIZE)+point.y, point.x, point.y, PATCOPY);
//填充菜单右侧框架
point.x = rtWnd.Width() - 230;
point.y = GetSystemMetrics(SM_CYMENU);
pDC->PatBlt(230, GetSystemMetrics(SM_CYSIZE)+GetSystemMetrics(SM_CYFRAME), point.x, point.y, PATCOPY); //绘制美化线条
CBrush BrushLine(RGB(255, 255, 255));
pDC->SelectObject(&BrushLine);
point.x = rtWnd.Width() - 150;
point.y = GetSystemMetrics(SM_CYFRAME) + 2;
pDC->PatBlt(GetSystemMetrics(SM_CXFRAME), point.y, point.x, 1, PATCOPY);
point.y += 5;
pDC->PatBlt(GetSystemMetrics(SM_CXFRAME), point.y, point.x, 1, PATCOPY);
point.y += 5;
pDC->PatBlt(GetSystemMetrics(SM_CXFRAME), point.y, point.x, 1, PATCOPY);
point.x += 60;
point.y += 12;
pDC->PatBlt(point.x, point.y, 85, 1, PATCOPY);
point.y += 5;
pDC->PatBlt(point.x, point.y, 85, 1, PATCOPY);
point.x -= 60 - GetSystemMetrics(SM_CXFRAME);
point.y += 5;
pDC->PatBlt(point.x, point.y, 145-GetSystemMetrics(SM_CXFRAME) , 1, PATCOPY);
point.y -= 32;
pDC->PatBlt(point.x, point.y, 1 , 32, PATCOPY);
pDC->SelectObject(pOldBrush); //重画图标
m_rtIcon.left = rtWnd.Width() - 135;
m_rtIcon.top = GetSystemMetrics(SM_CYFRAME);
m_rtIcon.right = m_rtIcon.left + 32;
m_rtIcon.bottom = m_rtIcon.top + 32;
::DrawIconEx(pDC->m_hDC, m_rtIcon.left, m_rtIcon.top, AfxGetApp()->LoadIcon(IDR_MAINFRAME),
m_rtIcon.Width(), m_rtIcon.Height(), 0, NULL, DI_NORMAL);
m_rtIcon.OffsetRect(rtWnd.TopLeft());
//*/ //准备画XP风格按钮
CBitmap* pBitmap = new CBitmap;
CBitmap* pOldBitmap;
CDC* pDisplayMemDC=new CDC;
pDisplayMemDC->CreateCompatibleDC(pDC); //重画关闭button
rtButtons.left = rtTitle.right - 19;
rtButtons.top = rtTitle.top -3 ;
rtButtons.right = rtButtons.left + 19;
rtButtons.bottom = rtButtons.top + 19;
pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtExit = rtButtons;
m_rtButtExit.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject(); //重画最大化/恢复button
rtButtons.right = rtButtons.left - 3;
rtButtons.left = rtButtons.right - 19;
if (IsZoomed())
pBitmap->LoadBitmap(IDB_RESTORE_NORMAL);
else
pBitmap->LoadBitmap(IDB_MAX_NORMAL);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtMax = rtButtons;
m_rtButtMax.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject(); //重画最小化button
rtButtons.right = rtButtons.left - 3;
rtButtons.left = rtButtons.right - 19;
pBitmap->LoadBitmap(IDB_MIN_NORMAL);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtMin = rtButtons;
m_rtButtMin.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();
//重画帮助button
rtButtons.right = rtButtons.left - 3;
rtButtons.left = rtButtons.right - 19;
pBitmap->LoadBitmap(IDB_HELP_NORMAL);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtHelp = rtButtons;
m_rtButtHelp.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();
/*
//重画caption
int nOldMode = pDC->SetBkMode(TRANSPARENT);
COLORREF clOldText=pDC->SetTextColor(RGB(255, 255, 255));
pDC->SelectStockObject(SYSTEM_FIXED_FONT);
rtTitle.left += 240; //我实在找不到什么好办法,能即时得到当前菜单的宽度了,如果各位有发现的,请Email me.
rtTitle.top += GetSystemMetrics(SM_CYSIZE) + 2;
rtTitle.bottom = rtTitle.top + 30;
CString m_strTitle;
GetWindowText(m_strTitle);
pDC->DrawText(m_strTitle, &rtTitle, DT_LEFT);
pDC->SetBkMode(nOldMode);
pDC->SetTextColor(clOldText);
//*/
ReleaseDC(pDisplayMemDC);
delete pDisplayMemDC;
delete pBitmap;