高手帮忙,如何处理窗口的TitleBar

show 2001-12-11 06:29:26
有例子请hp12_ps@yeah.net谢谢。
...全文
53 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
masterz 2001-12-11
  • 打赏
  • 举报
回复
在Windows 98中可以设置一个窗口的标题栏有颜色过渡的效果,比如由蓝色过渡到黑色,Windows 95就不行。我想知道,应该如何编程才能实现这种美化程序的效果呢?
在自己的WndProc中,需要对WM_NCPAINT、WM_ACTIVATE、WM_DEACTIVATE和WM_ERASEBKGND四个消息进行处理。判断当前窗口的激活状态就可以绘制自己的标题栏,从而加上想要的效果。在窗口的WndProc过程中这样写:
  switch( uMsg ) {
  case WM_NCPAINT:
  case WM_ACTIVATE:
  case WM_ACTIVATEAPP:
  case WM_ERASEBKGND:
   DefWindowProc( hDlg, uMsg, wParam, lParam );
   DrawTitleBar( hDlg );
   break;
  }
  先调用DefWindowProc的原因是我们需要让Windows先把标准的窗体边框画好。DrawTitleBar过程负责绘制自己的标题栏。
  void DrawTitleBar( HWND hWnd )
  {
   RECT r;
   WORD Left, Top, TitleHeight, TitleWeight, IconWeight;
   HDC MemDC;
   COLORREF SysTitleBkg, SysTitleClr;
   HFONT HF;
  
   MemDC = GetWindowDC( hWnd );
   GetClientRect( hWnd, &r );
   IconWeight = GetSystemMetrics( SM_CXSIZE );
   Left = 1;
   Top = 1;
   TitleHeight = GetSystemMetrics( SM_CYCAPTION );
   TitleWeight = r.right - r.left;
   SysTitleClr = GetSysColor( COLOR_CAPTIONTEXT );
   if( GetActiveWindow() == hWnd )
   SysTitleBkg = 0xf0a080;
   else
   SysTitleBkg = 0;
   DrawGradientBar( MemDC, 0x800000, SysTitleBkg, Left + 1, Top + 1,
   TitleWeight + 1, TitleHeight + 1 );
   SetTextColor( MemDC, SysTitleClr );
   SetBkColor( MemDC, SysTitleBkg );
   SetBkMode( MemDC, TRANSPARENT );
   HF = CreateFont( 10, 0, 0, 0, FW_BOLD, 0, 0, 0,
   ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
   DEFAULT_QUALITY, DEFAULT_PITCH, "MS Sans Serif" );
   SelectObject( MemDC, HF );
   TextOut( MemDC, 4, Top + ( TitleHeight - 10 ) / 2, APPNAME, strlen( APPNAME ) );
   DeleteObject( HF );
   DeleteObject( MemDC );
  }
  其中,APPNAME是程序的标题栏内容。在调用TextOut函数时要注意,一定要把背景设置成透明色,否则过渡效果就表现不出来了。最后我们要实现如何绘制带有颜色过渡效果的背景。实现的关键是如何调配RGB三原色的搭配。另外,绘制的速度也很重要。这里给出的代码采用每隔几个像素进行一次颜色渐变的方法来实现。
  void DrawGradientBar( HDC hdc, COLORREF co1, COLORREF co2, int x, int y, int cx, int cy )
  {
   int r = GetRValue( co1 );
   int g = GetGValue( co1 );
   int b = GetBValue( co1 );
   int n, m;
   int r2 = GetRValue( co2 );
   int g2 = GetGValue( co2 );
   int b2 = GetBValue( co2 );
   RECT rect;
   HBRUSH hbr;
   rect.left = x;
   rect.right = x + GRADLEVEL;
   rect.top = y;
   rect.bottom = y + cy;
   m = x + cx;
   if( cx <= 0 || cy <= 0 )
   return;
   for( n = cx; n > 0; n -= GRADLEVEL ) {
   hbr = CreateSolidBrush( RGB( r, g, b ) );
   FillRect( hdc, &rect, hbr );
   DeleteObject( hbr );
   rect.left += GRADLEVEL;
   rect.right += GRADLEVEL;
   if( rect.right > m )
   rect.right = m;
   r += ( r2 - r + n / 2 ) / n * GRADLEVEL;
   g += ( g2 - g + n / 2 ) / n * GRADLEVEL;
   b += ( b2 - b + n / 2 ) / n * GRADLEVEL;
   }
  }
  其中,GRADLEVEL是颜色渐变的等级:等级越小,绘制出来的背景就越接近于自然过渡,然而速度越慢;反之则可以清楚地看到过渡的过程,同时速度也越快。你可以根据实际需求来决定取舍。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧