Visual C++開發教程:如何實現MFC自繪製

Visual c++ 提 供 了 功 能 強 大 的 類 庫, 基 本 上 應 用 開 發 的 要 求, 但 對 於 某 些 特 殊 要 求 的 界 面, 如 圖 像 兼 文 字 的 按 紐, 列 表 框 中 插 入 圖 像, 中 國 式 報 表 等 等, 仍 顯 得 力 不 從 心, 因 而 很 有 必 要 創 建 擴 展MFC 類 庫, 以 滿 足 實 際 開 發 的 需 求。Xtreme Toolkit Pro是MFC開發中最全面界面控件套包,它提供了Windows開發所須要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。c++

---- MFC 支 持 自 繪 制(owner-draw) 概 念, 自 繪 制 的 控 制 類, 通 過 調 用DrawItem() 函 數 實 現 控 件 的 繪 制, 由 於 控 件 繪 制, 消 息 檢 測 和 消 息 比 較 代 碼 是 在 控 件 中 實 現 而 不 足 在 擁 有 控 件 的 窗 口 中 實 現, 因 而 叫 自 繪 制。 因 而 通 過 重 載DrawItem(LPDRAWITEMSTRUCT 函 數 來 控 制 控 件 的 外 觀 和 行 爲, 實 現 控 制 所 需 要 的 參 數, 都 包 含 在LPDRAWITEMSTRUCT 結 構 中。api

---- LPDRAWITEMSTRUCT 結 構:less

---- 最 重 要 的 參 數 是itemAction,itemState,hDC,rcItem, 它 們 是 實 現 控 件 外 觀 繪 制, 消 息 響 應 所 必 須 的。編輯器

---- itemAction: 繪 制 動 做, 有 以 下 幾 種 取 值:ODA_DRAWENTIRE,ODA_FOCUS, ODA_SELECT.函數

---- itemState: 狀 態, 有 以 下 幾 種 取 值:ODS_CHECKED,ODS_DISABLED,ODS_FOCUS, ODS_GRAYED,ODS_SELECTED,ODS_DEFAULT.工具

---- hDC: 設 備 環 境 的 句 柄。測試

---- rcItem: 控 件 外 觀 大 小 的 矩 形。url

---- 下 面 給 出 一 個 基 於CButton 類 的 圖 象Button 類:CMybtn.net

---- 利 用MFC Wizard 創 建 一 個 新 類CMybtn, 基 類 是CButton設計

mybtn.h: 
class CMybtn : public CButton
{
// Construction
...
public:
virtual void DrawItem
(LPDRAWITEMSTRUCT lpDrawItemStruct);
...
...
public:
void setbitmapid(UINT id);
...
protected:
UINT m_bitmapid;
//圖象的按紐id值
...
DECLARE_MESSAGE_MAP()
};

mybtn.cpp
CMybtn::CMybtn()
{
m_bitmapid=0;
//在構造函數中初始化m_bitmaoid 
} 

void CMybtn::DrawItem(LPDRAWITEMSTRUCT lpdis)
{

HBITMAP hbitmap=NULL;
ASSERT(lpdis!=NULL);
CDC *pdc=CDC::FromHandle(lpdis- >hDC);
//lpdis- >hdc是設備環境的句柄,
fromhandle函數將handle- >指針
CRect r1;
r1.CopyRect(&lpdis- >rcItem);
//獲得控件的矩形範圍
UINT state=lpdis- >itemState;
//獲得控件的狀態
if((state & ODS_SELECTED))
pdc- >Draw3dRect(r1,GetSysColor
(COLOR_3DDKSHADOW),
GetSysColor(COLOR_3DHILIGHT));
//selected時,用COLOR_3DDKSHADOW畫左上部,
COLOR_HILIGHT畫右下部,表現爲凹陷 
else
pdc- >Draw3dRect(r1,GetSysColor(COLOR_3DHILIGHT),
GetSysColor(COLOR_3DDKSHADOW));
//正常時,用COLOR_3DHILIGHT畫左上部,
COLOR_3DDKSHADOW畫右下部,表現爲突起
// TODO: Add your code to draw the specified item

if(m_bitmapid)
hbitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(m_bitmapid),IMAGE_BITMAP,0,0,
LR_DEFAULTCOLOR);
//若有圖象,則裝載圖象,
CString s1;
GetWindowText(s1);
//獲得BUTTON的CAPTION
if(!s1.IsEmpty())
{
int mode1=pdc->SetBkMode(TRANSPARENT);
if(!hbitmap)
pdc- >DrawText(s1,r1,
DT_CENTER|DT_VCENTER|DT_SINGLELINE);
//如沒有圖象,則在整個BUTTON範圍輸出文字
else
{
CRect r2=r1;
r2.DeflateRect(2,2);
CDC memdc;
CBitmap bmp;
CBitmap *oldbitmap;
bmp.Attach(hbitmap);
BITMAP  bitmap;
bmp.GetBitmap(&bitmap);
//由BITMAP結構能夠得出圖象的高,寬
memdc.CreateCompatibleDC(pdc);
oldbitmap=memdc.SelectObject(&bmp);
pdc- >StretchBlt(r2.left,r2.top,r2.Width()/2,
r2.Height(),&memdc,0,0,bitmap.bmWidth,
bitmap.bmHeight,SRCCOPY);
//把圖象從內存壓縮拷貝到BUTTON範圍
memdc.SelectObject(oldbitmap);
bmp.Detach();
CRect r3=r2;
r3.left=r2.left+r2.Width()/2;
pdc- >DrawText(s1,r3,
DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
}
}

void CMybtn::setbitmapid(UINT id)
{
m_bitmapid=id;
}

  ---- 利用CMybtn類代碼能夠在應用系統中實現圖象文字按紐,在dialog中加入按紐 (IDC_BUTTON1),(IDC_BUTTON2)設置它們的屬性爲 owner-draw.
利用resource editor 加入兩個圖象文件,id值爲:IDB_BITMAP1,IDB_BITMAP2。 
class CWs3Dlg : public CDialog
   {
     ...
   public:

   // Dialog Data
   //{
  {AFX_DATA(CWs3Dlg)
enum { IDD = IDD_WS3_DIALOG };
CMybtnm_btn1;
CMybtnm_btn2;
//定義圖象按紐
     //}}AFX_DATA
...
protected:
virtual void DoDataExchange(CDataExchange* pDX);
     // DDX/DDV support
//}}AFX_VIRTUAL

       ....
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
  };
  
  void CWs3Dlg::DoDataExchange(CDataExchange* pDX)
   {
CDialog::DoDataExchange(pDX);
//{
  {AFX_DATA_MAP(CWs3Dlg)
DDX_Control(pDX, IDC_BUTTON2, m_btn2);
DDX_Control(pDX, IDC_BUTTON1, m_btn1);
//}}AFX_DATA_MAP
}

  在初始化代碼加入:
   BOOL CWs3Dlg::OnInitDialog()
  {
...
  // TODO: Add extra initialization here
   m_btn1.setbitmapid(IDB_BITMAP1);
   m_btn2.setbitmapid(IDB_BITMAP2);
   return TRUE;  // return TRUE  unless 
                    you set the focus to a control
}

---- 本 文 給 出 了 自 繪 制 類 的 實 現 代 碼, 讀 者 可 以 利 用 此 思 路 開 發 出 其 他 擴 展 類 庫, 豐 富 開 發 資 源。

MFC擴展類庫

在平時練習的時候咱們能夠本身手動進行,可是一旦接受一些項目,應用程序開發等,對界面的要求就會高出許多。這時候就有必要藉助這些「半成品」實現界面美化提高效率。這裏簡單介紹一下,具體可點進去查看每一個的詳情以及教程,案例!

BCGControlBar

BCGControlBar ("Business Components Gallery ControlBar")是MFC擴展庫,使您能夠建立具備徹底自定義選項(功能區、可自定義工具欄、菜單等)以及一組專業設計的豐富Microsoft Office和Microsoft Visual Studio的應用程序 GUI控件,例如圖表、日曆、網格、編輯器、甘特圖和許多其餘控件。
BCGControlBar庫擁有500多個通過全面設計、測試和充分記錄的MFC擴展類。能夠輕鬆地集成到你的應用程序中,併爲你節省數百個開發和調試時間。(點這下載)

相關文章
相關標籤/搜索