首先,你需要一张适合自己对话框程序大小的bmp图片作为背景(这点很重要,否则就会有拉伸的现象),将这幅位图导入到工程中,命名为IDB_BACKGROUD。
1.在CtestDlg的OnPaint()函数中的else部分添加以下代码:
else
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BACKGROUD);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap* pbmpPri = dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rc.Width(), rc.Height(), &dcMem,0,0,bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
CDialogEx::OnPaint();
}
2.在CtestDlg中添加WM_CTRLCOLOR消息响应函数OnCtrlcolor()
在响应函数中添加以下代码:
if ((nCtlColor == CTLCOLOR_EDIT) && (pWnd-> GetDlgCtrlID() == IDC_EDIT_CMDDISPLAY)) //这里是仅改变编辑框的属性为透明
{
pDC->SetBkMode(TRANSPARENT); //设置背景透明
pDC->SetTextColor(RGB(0,0,0)); //改变字体的颜色
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
这里是仅改变编辑框的属性为透明,这里只对以下几种控件有效:
- CTLCOLOR_BTN Button control
- CTLCOLOR_DLG Dialog box
- CTLCOLOR_EDIT Edit control
- CTLCOLOR_LISTBOX List-box control
- CTLCOLOR_MSGBOX Message box
- CTLCOLOR_SCROLLBAR Scroll-bar control
- CTLCOLOR_STATIC Static control
3.对于listctrl控件要改变自身背景,需要先设置listctrl控件的Owner Draw Fixed 的属性为true.指定所有者绘制.
然后子类化listctral控件为CListCtrlEx:
该类的定义如下:
class CListCtrlEx : public CListCtrl
{
// Construction
public:
CListCtrlEx();
public:
CPalette m_pal;//调色板
CBitmap m_bitmap;//背景位图
int m_cxBitmap, m_cyBitmap;//背景位图高度,宽度信息
int m_nHighlight;//高亮方式
BOOL SetBkImage(LPCTSTR lpszResourceName);//设置背景图片
BOOL SetBkImage(UINT nIDResource);
int GetColumnCount();//获取列数目
void AdjustColumnWidth();//调整列宽
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{
{AFX_VIRTUAL(CListCtrlEx)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CListCtrlEx();
// Generated message map functions
protected:
//{
{AFX_MSG(CListCtrlEx)
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);//水平滚动
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);//垂直滚动
afx_msg BOOL OnEraseBkgnd(CDC* pDC);//擦除背景
afx_msg void OnPaletteChanged(CWnd* pFocusWnd);//调色板更改
afx_msg BOOL OnQueryNewPalette();//查询新调色板
afx_msg BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
//}}AFX_MSG
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//画每一行
DECLARE_MESSAGE_MAP()
};
该类的声明如下:
CListCtrlEx::CListCtrlEx()
{
m_nHighlight=0;
}
CListCtrlEx::~CListCtrlEx()
{
}
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)