CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

窗口边框如何绘制

楼主lbird(heng)2002-08-30 19:30:51 在 VC/MFC / 基础类 提问

我拦截了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

相关问题

  • MFC中如何自己绘制某个窗口的边框?
  • 如何直接在屏幕桌面上绘制移动的三角形?粗边框的,类似拖动Win98的窗口时的那种粗虚线边框。
  • 无边框窗体(自绘窗体)的边框绘制问题????
  • 如何在一个给定的矩形内绘制 圆、弧、矩形等图形?要求绘制的线等遇到给定矩形边框时裁剪调。
  • 如何在窗口中绘制图形?
  • 如何让基于Dialog的窗口也可拖动边框?
  • 如何做一个无边框弹出窗口?
  • 如何弹出一个无任何ie边框的窗口?
  • 如何用Win32Api获得窗口的边框宽度
  • 在MFC中,如何创建一个没有边框的窗口

关键词

  • 边框
  • rtwnd
  • rttitle
  • cxframe
  • getsystemmetrics
  • cpoint
  • sm
  • point
  • pdc
  • wm

得分解答快速导航

  • 帖主:lbird
  • studentforever

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo