擴 展Visual c++ MFC 類 庫 (轉)
---- MFC 支 持 自 繪 制(owner-draw) 概 念, 自 繪 制 的 控 制 類, 通 過 調 用DrawItem() 函 數 實 現 控 件 的 繪 制, 由 於 控 件 繪 制, 消 息 檢 測 和 消 息 比 較 代 碼 是 在 控 件 中 實 現 而 不 足 在 擁 有 控 件 的 窗 口 中 實 現, 因 而 叫 自 繪 制。 因 而 通 過 重 載DrawItem(LPDRAWITEMSTRUCT 函 數 來 控 制 控 件 的 外 觀 和 行 為, 實 現 控 制 所 需 要 的 參 數, 都 包 含 在LPDRAWITEMSTRUCT 結 構 中。
---- LPDRAWITEMSTRUCT 結 構:
typedef struct tagDRAWITEMSTRUCT { UINT CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; D itemData; } DRAWITEMSTRUCT;
---- 最 重 要 的 參 數 是itemAction,itemState,hDC,rcItem, 它 們 是 實 現 控 件 外 觀 繪 制, 消 息 響 應 所 必 須 的。
---- itemAction: 繪 制 動 作, 有 以 下 幾 種 取 值:ODA_DRAWENTIRE,ODA_FOCUS, ODA_.
---- itemState: 狀 態, 有 以 下 幾 種 取 值:ODS_CHECKED,ODS_DISABLED,ODS_FOCUS, ODS_GRAYED,ODS_SELECTED,ODS_DEFAULT.
---- hDC: 設 備 環 境 的 句 柄。
---- rcItem: 控 件 外 觀 大 小 的 矩 形。
---- 下 面 給 出 一 個 基 於CButton 類 的 圖 象Button 類:CMybtn
---- 利 用MFC Wizard 創 建 一 個 新 類CMybtn, 基 類 是CButton
mybtn.h: class CMybtn : public CButton { // Construction ... public: virtual void DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct); ... ... public: void setbitmd(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,GetSylor (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(), MAKEINTRE(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 *olitmap; bmp.Attach(hbitmap); BITMAP bitmap; bmp.GetBitmap(&bitmap); //由BITMAP結構可以得出圖象的高,寬 memdc.CreateCompatibleDC(pdc); oldbitmap=memdc.Select(&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 }; CMybtn m_btn1; CMybtn m_btn2; //定義圖象按紐 //}}AFX_DATA ... protected: virtual void DoData(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 }
---- 本 文 給 出 了 自 繪 制 類 的 實 現 代 碼, 讀 者 可 以 利 用 此 思 路 開 發 出 其 他 擴 展 類 庫, 豐 富 開 發 資 源。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988819/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在 Visual C++ 中 建 立 MFC 擴 展 DLL (轉)C++
- Visual C++/MFC 指南(4):MFC 簡要指點 (轉)C++
- Visual C++/MFC指南(1):幕後 (轉)C++
- MFC 擴充套件庫 - CJ60Lib ( 針對Visual C++ 6.0進行的升級 ) (轉)套件C++
- Visual C++/MFC入門教程C++
- Answers to your MFC/ATL questions from the Visual C++ .NET Product Manager (轉)C++
- 在Visual Basic 中使用C++ 類 (轉)C++
- Visual C++ MFC 中常用巨集的含義C++
- visual C++數字影像處理類C++
- 重貼:MFC類中獲得其它類指標 (轉)指標
- MFC介面開發類庫BCG Pro for MFC幫助文件:CBCGPEditCtrl的XML格式XML
- 理解 Visual C++ Extensions for ADO(轉)C++
- Visual C++應用框架揭密 (轉)C++框架
- 【C++】Visual Studio 2012 MFC——Expression: _pFirstBlock==pHead解決辦法C++ExpressBloC
- Visual C++中的圖形特技 (轉)C++
- Visual C++ 6.0 編 程 經 驗 (轉)C++
- MFC抽象類之動態實現技術 (轉)抽象
- 在Visual C++中用ADO進行資料庫程式設計 (轉)C++資料庫程式設計
- Microsoft Visual C++ 微軟常用執行庫合集ROSC++微軟
- Visual C++ 6.0的文件/視結構 (轉)C++
- 在SDK程式中使用MFC中的輔助類 (轉)
- 淺談MFC中超類化技術的實現 (轉)
- Visual C++實現檔案間批次轉換功能 (轉)C++
- Visual Studio部署C++環境下OpenCV庫C++OpenCV
- 在Visual C++中使用內聯彙編 (轉)C++
- 在Visual C++中使用內聯彙編(轉)C++
- Visual C++中函式呼叫方式淺探 (轉)C++函式
- Visual C++與Delphi/C++Builder之比較 (轉)C++UI
- MFC之動態呼叫自己寫的類庫中的類的成員方法
- No MFC,Only API (轉)API
- mfc程式流程 (轉)C程式
- Linux平臺C++類庫tinycxx使用說明 (轉)LinuxC++
- C++中類及類的定義 (轉)C++
- 關於Visual Basic 6.0類開發(下) (轉)
- 關於Visual Basic 6.0類開發(上) (轉)
- 情有獨鍾C++:Visual C++ .NET編譯器的新特性(轉)C++編譯
- An interview with Microsoft's new Visual C++ Architect Stanley Lippman (轉)ViewROSC++
- Visual C++ 6.0程式設計實現列印功能(轉)C++程式設計