窗口边框如何绘制
我拦截了WM_NCPAINT想设计窗口标题栏和窗口边框
请教窗口边框的绘制可能用的函数有哪些
问题点数:30、回复次数:6Top
1 楼ColderRain(一切尽在不言中)回复于 2002-08-30 19:37:24 得分 0
pDC->Draw3DRectTop
2 楼czn(vcopengl)回复于 2002-08-30 19:46:27 得分 0
那看你怎么画了
我这里有一个程序
给我100分我给你发过去Top
3 楼lbird(heng)回复于 2002-08-31 00:36:17 得分 0
czn:
可以,但是关键函数调用请加一点说明。
给你130:)
email:zh0116@163.net
Top
4 楼studentforever()回复于 2002-09-02 19:19:50 得分 30
来迟了。
需要对以下消息进行重载DefWindowProc、ON_WM_NCMOUSEMOVE、ON_WM_NCLBUTTONDOWN。
参考:
美化你的应用程序的外观界面
http://www.vckbase.com/document/viewdoc.asp?id=317Top
5 楼lanfengjiyue(歪脚鸭)回复于 2002-09-02 20:05:40 得分 0
void CMainFrame::DrawTitleBar(CDC *pDC)
{
if (m_hWnd)
{
CBrush Brush(RGB(10,80,240));
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 = GetSystemMetrics(SM_CXFRAME) + 1; //左边框
point.y = rtWnd.Height();
DrawXPBmp(pDC,IDB_LEFT,CPoint(0,0),CPoint(point.x,point.y));
point.x = rtWnd.Width(); //底边框
point.y = GetSystemMetrics(SM_CYFRAME) + 1;
DrawXPBmp(pDC,IDB_BOTTOM,CPoint(0, rtWnd.Height()-point.y), CPoint(point.x, point.y));
point.x = GetSystemMetrics(SM_CXFRAME) + 1; //右边框
point.y = rtWnd.Height();
DrawXPBmp(pDC,IDB_RIGHT,CPoint(rtWnd.Width()-point.x, 0), CPoint(point.x, point.y));
point.x = rtWnd.Width(); //顶边框
point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME);
DrawXPBmp(pDC,IDB_TOP,CPoint(0,0),CPoint(point.x,point.y));
//重画图标
m_rtIcon.left = rtTitle.left ;
m_rtIcon.top = rtTitle.top;
m_rtIcon.right = m_rtIcon.left + 16;
m_rtIcon.bottom = m_rtIcon.top + 15;
::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 - 16;
rtButtons.top = rtTitle.top;
rtButtons.right = rtButtons.left + 16;
rtButtons.bottom = rtButtons.top + 15;
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 - 16;
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 - 16;
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();
//重画caption
int nOldMode = pDC->SetBkMode(TRANSPARENT);
COLORREF clOldText=pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
LOGFONT logFont; //获取标题栏字体
SystemParametersInfo( SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
CFont m_captionFont;
m_captionFont.CreateFontIndirect(&logFont);
CFont* pOldFont = NULL; //zwh Adding,2002.6.20
pOldFont = pDC->SelectObject(&m_captionFont);
rtTitle.left += m_rtIcon.Width ()+3;
rtTitle.top = rtTitle.top;
rtTitle.bottom = rtTitle.top + 30;
CString m_strTitle;
GetWindowText(m_strTitle); //3D显示文字
pDC->DrawText(m_strTitle, rtTitle+CPoint(3,3), DT_LEFT);
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
pDC->DrawText(m_strTitle, rtTitle, DT_LEFT);
pDC->SetBkMode(nOldMode);
pDC->SetTextColor(clOldText);
//zwh Adding,2002.6.20
if (pOldFont != NULL)
{
pDC->SelectObject(pOldFont);
m_captionFont.DeleteObject();
}
//zwh Modifing,2002.6.20
//ReleaseDC(pDisplayMemDC);
pDisplayMemDC->DeleteDC();
delete pDisplayMemDC;
delete pBitmap;
}
}Top
6 楼In355Hz(好象一条狗)回复于 2002-09-02 20:22:51 得分 0
如果不复杂,在OnNcPaint中最后调用
const MSG* pMsg = GetCurrentMessage();
DefWindowProc(WM_NCPAINT, pMsg->wParam, pMsg->lParam);
就能画出默认样式的窗口边框。Top




