Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > VC中怎样改变TAB背景色和背景图片
【标  题】:VC中怎样改变TAB背景色和背景图片
【关键字】:VC,TAB
【来  源】:http://blog.csdn.net/Meyino/archive/2006/08/17/1076845.aspx

VC中怎样改变TAB背景色和背景图片

Your Ad Here

找了好久,最后用这种方法搞定的,也是别人的指点

重载Tab控件类,类声明和实现文件下面有:

#if !defined(AFX_BITMAPTABCTRL_H__7502D762_DAC6_4B57_B2B2_6563A23B9EAF__INCLUDED_)
#define AFX_BITMAPTABCTRL_H__7502D762_DAC6_4B57_B2B2_6563A23B9EAF__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BitmapTabCtrl.h : header file
//
#include "resource.h"
/////////////////////////////////////////////////////////////////////////////
// CBitmapTabCtrl window

class CBitmapTabCtrl : public CTabCtrl
{
// Construction
public:
CBitmapTabCtrl();

// Attributes
public:
enum {
BITMAP_NONE = 0,// do not show bitmap
BITMAP_TILE,// tile the bitmap to fill the dialog
BITMAP_STRETCH,// stretch the bitmap so it fits to the dialog
BITMAP_CENTER// center the bitmap inside the dialog
};

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBitmapTabCtrl)
//}}AFX_VIRTUAL

// Implementation
public:
BOOL SetBitmap(UINT uResource, int nType);
VOID DrawItemEdge();
VOID DrawItemText();
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual ~CBitmapTabCtrl();

// Generated message map functions
protected:
intm_nType;// see enum above
CBitmapm_bmp;
//{{AFX_MSG(CBitmapTabCtrl)
afx_msg void OnPaint();  
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
 //}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_BITMAPTABCTRL_H__7502D762_DAC6_4B57_B2B2_6563A23B9EAF__INCLUDED_)
 

 

// BitmapTabCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "cert.h"
#include "BitmapTabCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBitmapTabCtrl

CBitmapTabCtrl::CBitmapTabCtrl()
{
}

CBitmapTabCtrl::~CBitmapTabCtrl()
{
}


BEGIN_MESSAGE_MAP(CBitmapTabCtrl, CTabCtrl)
//{{AFX_MSG_MAP(CBitmapTabCtrl)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBitmapTabCtrl message handlers


BOOL CBitmapTabCtrl::OnEraseBkgnd(CDC* pDC)
{
if(m_bmp.GetSafeHandle() && m_nType)
{
CRect rect;
GetClientRect(rect);

CDC bgDC;
bgDC.CreateCompatibleDC(NULL);
bgDC.SelectObject(&m_bmp);

BITMAP bmp;
m_bmp.GetBitmap(&bmp);
int nWidth = bmp.bmWidth;
int nHeight = bmp.bmHeight;

switch(m_nType)
{
case BITMAP_CENTER:
CTabCtrl::OnEraseBkgnd(pDC);
BITMAP bmp;
m_bmp.GetBitmap (&bmp);
pDC->BitBlt ((rect.Width() - bmp.bmWidth) / 2, (rect.Height() - bmp.bmHeight) / 2, bmp.bmWidth, bmp.bmHeight, &bgDC, 0, 0, SRCCOPY);
return TRUE;
case BITMAP_STRETCH:
pDC->SetStretchBltMode(HALFTONE);
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &bgDC, 0, 0, nWidth, nHeight, SRCCOPY);
return TRUE;
default:
CBrush bgBrush(&m_bmp);
pDC->FillRect(rect,&bgBrush);
return TRUE;
}
}
else
CTabCtrl::OnEraseBkgnd(pDC);


return TRUE; //Let's get rid of flickering
}


void CBitmapTabCtrl::OnPaint()
{
CPaintDC dc(this);
CRect rect;
CRect focusRect;
CRect activeRect;


//选择字体
NONCLIENTMETRICS nclim;
nclim.cbSize=sizeof(NONCLIENTMETRICS);
::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(NONCLIENTMETRICS),
&nclim,0);
HFONT hMenuFont= ::CreateFontIndirect(&nclim.lfMenuFont);
::SelectObject(dc.GetSafeHdc(), hMenuFont);


//绘制文字
char buf[256];
TCITEM tcitem;
tcitem.mask=TCIF_TEXT;
tcitem.pszText =buf;
tcitem.cchTextMax=sizeof(buf);

for(int i=0; i<GetItemCount(); i++)
{
memset(buf, 0, sizeof(buf));
GetItemRect(i,&rect);
GetItem(i,&tcitem);

if(GetCurSel() == i)
{
rect.top -= 2;
rect.bottom -=2;
focusRect.top = rect.top + 2;
focusRect.bottom = rect.bottom -1;
focusRect.left = rect.left + 2;
focusRect.right = rect.right - 2;
::SetBkMode(dc.GetSafeHdc(), OPAQUE);
::DrawFocusRect(dc.GetSafeHdc(),&focusRect);
}

SetBkMode(dc.GetSafeHdc(), TRANSPARENT);

SetTextColor(dc.GetSafeHdc(), RGB(255,255,255));//根据需要选择字体颜色
::DrawText(dc.GetSafeHdc(), buf, -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
}

//绘制线条
CPen lightPen;
CPen darkPen;
COLORREF color;
color = GetSysColor(COLOR_BTNHIGHLIGHT);
lightPen.CreatePen(PS_SOLID, 1, color);
color = GetSysColor(COLOR_3DSHADOW);
darkPen.CreatePen(PS_SOLID, 1, color);

for(i=0; i<GetItemCount(); i++)
{
GetItemRect(i,&rect);
//如果是当前项
if(i == GetCurSel())
{
rect.top -= 2;
rect.left -=2;
rect.right +=1;
}

dc.SelectObject(lightPen);
dc.MoveTo(rect.left,rect.bottom);

//画左面
if(i - 1 == GetCurSel())
{
dc.MoveTo(rect.left + 4, rect.top);
}
else
{
dc.LineTo(rect.left, rect.top + 2);
dc.LineTo(rect.left + 2, rect.top);
}

//画上面
dc.LineTo(rect.right - 1, rect.top);

//画右面
dc.SelectObject(darkPen);
//后一项被选中
if(i + 1 != GetCurSel())
{
dc.LineTo(rect.right - 1, rect.bottom);
dc.MoveTo(rect.right, rect.top + 1);
dc.LineTo(rect.right, rect.bottom);
}
}

//画下面
GetClientRect(&rect);
GetItemRect(GetCurSel(),&activeRect);
dc.SelectObject(lightPen);
dc.MoveTo(rect.left, activeRect.bottom);
dc.LineTo(activeRect.left -2, activeRect.bottom);
dc.MoveTo(activeRect.right, activeRect.bottom);
dc.LineTo(rect.right, activeRect.bottom);

CPen apen;
apen.CreatePen(PS_SOLID, 1, RGB(222,2,2));
//dc.SelectObject(apen);

dc.MoveTo(rect.left, activeRect.bottom);
dc.LineTo(rect.left, rect.bottom - 1);
dc.LineTo(rect.right - 1, rect.bottom - 1);
dc.LineTo(rect.right - 1, activeRect.bottom);

}
 

void CBitmapTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

}

VOID CBitmapTabCtrl::DrawItemText()
{

}

VOID CBitmapTabCtrl::DrawItemEdge()
{

}

BOOL CBitmapTabCtrl::SetBitmap(UINT uResource, int nType)
{
m_nType = nType;
ASSERT(m_nType == BITMAP_TILE || m_nType == BITMAP_STRETCH || m_nType == BITMAP_CENTER);
BOOL res = m_bmp.LoadBitmap(uResource);
return res;
}

将设置一个Tab控件的变量,并且为CBitmapTabCtrl类型,在初始话的时候通过CBitmapTabCtrl调用SetBitmap(UINT uResource, int nType);设置一张图片即可,我需要一个黑色背景,所以设置了一张纯黑色的背景图片。

ShellExecute的用法:【上一篇】
其它的图像调整功能:【下一篇】
【相关文章】
  • 分析与理解消息反射机制vc++技术(转载)
  • 了解实际开发中 Hashtable 的特性原理 .NET, JAVA, PHP (之一)
  • 了解实际开发中 Hashtable 的特性原理 .NET, JAVA, PHP (之二)
  • 标签亦MVC
  • 再战MVC(-)
  • 再战MVC(二)
  • std::fstream在VC2003.net中的使用问题
  • vc中建立非模态对话框的例子
  • 关于table换行
  • iptables limit
  • 【随机文章】
  • JBossAS 4.0.5发布
  • chkconfig用法
  • [转载]深入浅出Visual C++动态链接库(Dll)编程
  • ActiveMQ 实践之路(一) 启动你的ActiveMQ
  • java中处理异常需要注意的事项
  • 注册表的常用操作
  • 用VB实现任意修改Win桌面背景
  • vncserver 和gnome_access的设置
  • 4个小故事
  • 发现了一个更好的反编译工具,超级牛,甚至超越了Reflector
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.