场景:
1.在贴图的情况中,wxStaticText并不能支持有背景的父控件,这样文字背景就有一个灰黄色的默认背景。即使写子类继承wxStaticText加入EVT_ERASE_BACKGROUND也不能让背景色消失。这时候可以参考mfc的实现,返回一个透明BRUSH给wxStaticText做绘制默认背景色用.不过这里就需要重载DoMSWControlColor方法,这个是基于本地的实现。没办法了,如果用基于本地的实现就能很容易实现一些特效,但是在wxWidgets下如果开发跨平台控件就得多写很多代码。可以仿照wx的源代码写两个平台的版本.这里实现了msw和mac平台下的wxStaticText子类,mac平台下很容易,只需要重载 HasTransparentBackground 返回true就行了,看wx的chm文档有写。
文件1: 首先是基类
dh_static_text.h
/* * DhStaticTextBase.h * * Created on: 2013-7-7 * Author: Sai */ #ifndef DHSTATICTEXT_H_BASE_ #define DHSTATICTEXT_H_BASE_ #include "wx/wx.h" class DhStaticTextBase :public wxStaticText { public: DhStaticTextBase(); virtual ~DhStaticTextBase(){} virtual bool HasTransparentBackground(); void SetBg(wxBitmap* bg); protected: wxBitmap *bg_; }; #ifdef __QXWIN32__ #include "window/base/msw/dh_static_text.h" #else #include "window/base/osx/dh_static_text.h" #endif #endif /* DHSTATICTEXT_H_BASE_ */
文件2:基类的实现dh_static_text_base.cpp
/* * dh_static_text.cpp * * Created on: 2013-7-26 * Author: Sai */ #include "window/base/dh_static_text.h" DhStaticTextBase::DhStaticTextBase() { bg_ = NULL; } bool DhStaticTextBase::HasTransparentBackground() { return true; } void DhStaticTextBase::SetBg(wxBitmap* bg) { bg_ = bg; }
/* * DhStaticText.h * * Created on: 2013-7-7 * Author: Sai */ #ifndef DHSTATICTEXT_H_ #define DHSTATICTEXT_H_ #include "window/base/dh_static_text.h" #include "wx/msw/private.h" class DhStaticText :public DhStaticTextBase { DECLARE_EVENT_TABLE() public: DhStaticText(); virtual ~DhStaticText(){} protected: void OnEraseBackground(wxEraseEvent& event); virtual WXHBRUSH DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd); private: wxBrush *brush_; wxRect last_rect_; wxBitmap bg_cache_; }; #endif /* DHSTATICTEXT_H_ */
/* * DhStaticText.cpp * * Created on: 2013-7-7 * Author: Sai */ #include "window/base/msw/dh_static_text.h" BEGIN_EVENT_TABLE(DhStaticText, DhStaticTextBase) EVT_ERASE_BACKGROUND(DhStaticText::OnEraseBackground) END_EVENT_TABLE() DhStaticText::DhStaticText() { SetBackgroundStyle(wxBG_STYLE_ERASE); SetForegroundColour(*wxWHITE); brush_ = new wxBrush(wxNullColour,wxBRUSHSTYLE_TRANSPARENT); } void DhStaticText::OnEraseBackground(wxEraseEvent& event) { wxRect rect = GetRect(); if (last_rect_ != rect) { last_rect_ = rect; int height = bg_->GetHeight(); int width = bg_->GetWidth(); rect.height = (height < (rect.y+rect.height))?(height - rect.y):rect.height; rect.width = (width < (rect.x+rect.width))?(width - rect.x):rect.width; assert(bg_->GetHeight() >= (rect.y+rect.height)); assert(bg_->GetWidth() >= (rect.x+rect.width)); bg_cache_ = bg_->GetSubBitmap( wxRect(rect.x, rect.y, rect.width, rect.height)); } event.GetDC()->DrawBitmap(bg_cache_,0,0); } WXHBRUSH DhStaticText::DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd) { HDC hdc = (HDC)pDC; ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour())); return (WXHBRUSH)brush_->GetResourceHandle(); }
/* * DhStaticText.h * * Created on: 2013-7-7 * Author: Sai */ #ifndef DHSTATICTEXT_H_ #define DHSTATICTEXT_H_ #include "window/base/dh_static_text.h" class DhStaticText :public DhStaticTextBase { public: DhStaticText(){} virtual ~DhStaticText(){} }; #endif /* DHSTATICTEXT_H_ */
description_text_ = new DhStaticText(); description_text_->Create(this,wxID_ANY,wxEmptyString); description_text_->SetBg(bg_);