程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 如何在EDITBOX控件中使用背景位圖

如何在EDITBOX控件中使用背景位圖

編輯:關於VC++

在VC中,標准的WINDOWS控件如TREEVIEW,EDITBOX,COMBOBOX和LISTBOX等控件都不支持選擇背景位圖的屬性,所以如果要使這些標准控件達到這種效果,必須有些非常規的方法。本文介紹一個CEDIT類如何實現背景位圖,並且可以更換背景的例子。可能實現的方法還有其它種,如果有興趣可以大家探討。

本文程序運行效果圖

下面介紹CMYEDITCTRL類幾個關鍵變量和函數。

第一步在該類中增加幾個變量;

public:
  CBitmap m_bmp;
protected:
  CBrush m_brHollow;
  CBitmap *m_pbmCurrent;

第二步 重載部分函數:

afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnChange();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);

各個函數的具體作用:

2.1 OnChange();

如果沒有這個函數,你敲幾個字符如 ABCDEDFG,然後刪除兩個FG,但是EDITBOX並未更新。添加這個函數主要是這個原因。

void CMyEditCtrl::OnChange()
{
  Invalidate(); ///強制進行更新
}

2.2 OnLButtonUp();

也類似,是你鼠標選擇時候的刷新問題,如果你有興趣,可以先把它注釋掉,看看BUG是怎麼出現的。

void CMyEditCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
  Invalidate(); ///強制進行更新
  CEdit::OnLButtonUp(nFlags, point);
}

2.3 CtlColor(CDC* pDC, UINT nCtlColor)

一般的文字的默認背底是白色的,這兒選擇了透明的形式,所以底圖可以顯示。

HBRUSH CMyEditCtrl::CtlColor(CDC* pDC, UINT nCtlColor)
{
  pDC->SetBkMode(TRANSPARENT); ///選擇透明背景模式
  pDC->SetTextColor(RGB(0xff,0xff,0xff)); ///設置文字顏色為白色
  return m_brHollow;
}

2.4 OnEraseBkgnd(CDC* pDC)

主要把選好的背景位圖顯示出來。

BOOL CMyEditCtrl::OnEraseBkgnd(CDC* pDC)
{
  BITMAP bm;
  m_bmp.GetBitmap(&bm);
  m_pbmCurrent = &m_bmp;
  CDC dcMem;
  dcMem.CreateCompatibleDC(pDC);
  CBitmap* pOldBitmap = dcMem.SelectObject(m_pbmCurrent); ///選擇位圖
  pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY); ///畫出位圖
  dcMem.SelectObject(pOldBitmap);
  return TRUE;
}

說明:其中代碼有些部分簡化了,有些部分還可以優化。對於底圖的選擇,在這裡我選擇是與我EDITBOX一樣大小的底圖,如果兩者不一樣大小,需要修改部分OnEraseBkgnd(CDC* pDC)代碼。

基本上這個類的功能就這樣實現了。

如果有興趣和我一起探討這個問題,可以發信到[email protected]

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved