アクセスカウンタ - 造園のVCインターフェイスの章

VCの中程度のレベルで読者のためのインターフェイス造園このシンポジウムのVC、。読者の最良のVCは、次の基礎を有する:
shinobi.jp - アクセス解析, ブログ, カウンター とかを提供しているNINJA TOOLSの別館的サイト
1。 MFCフレームワークの基本的な動作原理の一般的な理解;
2。 Windowsのメッセージ機構は、MFCのメッセージマップ、リフレクションを使用して精通に精通している。




つずつ起動する簡単な例と組み合わせて開発長年の経験では、作者に読者の手助けをしたいよると、。
テキスト






。。
しかし、インターフェイスの罰金具体的な実現を"ウイルス対策ソフトウェアライジング"は、このチュートリアルでは、あなたにお勧めしません"魚Subjectにではなく、魚に彼を教える場合は、"あなただけにお勧めするためのいくつかの一般的に使用されるメソッドを美化する。

造園は、Windows上でインターフェイスの描画操作に精通しているし、回避するために知っている、知っているのに使用することができるターゲットにすることができます色鉛筆、パステル、デスクトップの背後にあるWindowsオペレーティングシステムを理解する必要があります... ...
2.1 Windowsの描画操作で
読者の知っているかもしれませんDOSでおなじみ:DOSの次のグラフィックの操作を簡単にグラフィックスモードに、画面が必要になりますように、場所は、赤や黄色の点になります点を描画するあなたです。また、ボタンを描画するために独自のメニューを描画する時間を取ることができるように... ...
Windowsは、それ自体、次の機能豊富なグラフィックスをWindowsオペレーティングので、グラフィカルなインターフェイス、簡単です。。

。DCは(デバイスコンテキストデバイス環境)のマッピングの環境では、画面に対応することができる抽象的なオブジェクトですが、プリンタまたは他に対応することができる。環境では、デバイスに依存しないので、ラインだけで別の出力デバイスコンテキストを使用する必要がある別のデバイスには、マッピングが完全に同じようにすることができますです。これは、Windowsのデバイスに依存しない。


マッピング機能:マッピング操作

クリッピング機能:カット操作
ライン出力機能:ライン操作を描画する
単純な描画機能は:単純な描画操作など:四角形を描画
楕円と多角形関数:楕円/多角形の操作

プリンタエスケープ関数:印刷
スクロール機能:スクロール


*フォント機能:フォントの操作

その中で、項目*は、対応するグラフィックオブジェクトクラスを使用するを参照してください2.1.2コンテンツマーク。

。これらの追加機能は、テキストに使用するフォントを描画するために引かれた線と色の幅が含まれて。。
次の表は、グラフィックオブジェクトのMFCクラスの一覧:
グラフィックスオブジェクトのMFCクラスは、オブジェクトを描画するの目的を処理する

CBrush HBRUSHブラシ機能は - グラフィックの色やパターンを充填するときに使用する
れたCFont HFONTフォント特性が - 使用するテキストのフォントを作成するときに

CPenオブジェクトHPENペン機能 - 等高線使用する場合の厚さの
CRgnのHRGN地域特性 - その点の定義を含む
表1のグラフィックオブジェクトのクラスとそのパッケージのハンドラ
CDCは、オブジェクトクラスを使用してグラフィックスは、Windowsはまだ非常に単純な図面がある。
図は、2つのボタンは、CDCを描画します

ブールCUi1Viewは::PreCreateWindowの(でCREATESTRUCT&csの){/ / / / CBrush CUi1View背景色を設定::m_Backm_Back.CreateSolidBrushを(::GetSysColor(COLOR_3DFACE)); cs.lpszClass = AfxRegisterWndClass(0、0、m_Backは、NULL);のCViewを返す::PreCreateWindowの(CS)の;} int型CUi1Viewを::OnCreate関数(LPCREATESTRUCT lpCreateStruct){場合(のCView::(lpCreateStruct)== -1 OnCreate関数)-1を返します/ /フォントを作成します/ /れたCFont CUi1View::m_Fontm_Font 。はCreatePointFont(120、"影響は");戻り0;} CUi1Viewが無効になる::OnDrawがセンター(CDC * pDCの){/ /ボタンのフレームを描くのpDC -> DrawFrameControl(CRectの(100、100、220、160)、DFC_BUTTON、DFCS_BUTTONPUSH ); / /出力テキストのpDC -> SetBkMode(透明)のpDC -> TextOut関数(120、120、"こんにちは、CFan !");}

舞台裏で2.2のWindowsの描画操作
。私はかつて、グラフィカルなインターフェイスのコードの行数千のDOSウィンドウを設計されたインターフェイスの実現にはまだ非常に古い、醜いことを除いて、私は、プログラムでその女の子について何を知っている風であり、誰もがL、それを高く評価。と、さらに悪いことに、インターフェイス要素を知らない他のアプリケーションを含むオペレーティングシステムが、これは本当の悲しい。あなただけが、プログラムのインターフェイスを知っており、図2のボタンは永遠に心だけの無駄なフレームです。

すべての標準的なWindowsインターフェイス要素は、良好なパッケージです。。場合CFan Xiaobian幸せに(例:ボート)ボタンをクリックすると、Windowsは、ボタンが押されたときにも、のようないくつかの視線を理解するときに、フォーカスは、このフレンドリーなボタンをクリックすると、Windowsは仮想ボックスのための機会をつかむだろうが、それは準備ができていると... ...
。あなたはこの時間を満たしている:あなたはWindowsのみ、真のボタンを使用する場合は、そのインターフェイスは、あまりにもハンサムで、例えば、上の青い太字の表現自分の気持ちが好きなのですか可能性がありますCFan(として図2に示すように)無限 - - そこにいる人々の不足、方法は?いくつかの。

Windowsは、またはいくつかの方法を介して、まだ戻ってプログラマがドアに残って多くされているインターフェイスを美化する。。
インターフェイスを美化するために3.1の方法

1。両方のMFCクラスの機能を使用して、インターフェイスのプロパティを設定します。

3。便利なのMFCクラスの仮想関数機構、オーバーロードされた仮想関数を使用して。
一般的に、アプリケーションは次の2つの方法以上の方法によって達成することができます:
1。親ウィンドウで、画面のレンダリングにメッセージを渡すために(コントロールとメニューやその他の要素を含む)自分または子要素を傍受。
2。サブクラスの灭杀要素は、または、新しいクラス(:CButtonクラスの一般的なように、標準のMFCクラスのパッケージを継承する必要があります)の子要素を準備する。サブ要素で、または独自の反射を傍受親ウィンドウからのインターフェイスについてのニュースを上に描画する。。
アプリケーションでは、方法は2つのタイプに分かれていますCXPButtonクラスおよびコモンダイアログのウィンドウのウィンドウに相対的な使用するには:

図3は、ボタンを入力CXPButton指定する例を示します。
②は、通常のウィンドウで、CXPButtonクラスは、オブジェクトを直接作成し、OnCreate関数()CXPButton Createメソッドを呼び出す。
以下のセクションでは、上記のメソッドを使用して、統合される、リーダーは、友人が見ている。
3.2 MFCクラスの機能を既存の
インターフェイスで話題の造園は、MFCは何もされていない。インターフェイスのMFCクラスはまた、使用することができるいくつかは、パラメータの説明に費やされているここでは、いくつかの造園の取り組みを行って。
CWinApp::SetDialogBkColor
void SetDialogBkColor( COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF clrCtlText = RGB(0, 0, 0) );
ダイアログボックスの指定背景色とテキストの色。
CListCtrl::SetBkColor
CReBarCtrl::SetBkColor
CStatusBarCtrl::SetBkColor
CTreeCtrl::SetBkColor
COLORREF SetBkColor( COLORREF clr );

CListCtrl::SetTextColor
CReBarCtrl::SetTextColor
CTreeCtrl::SetTextColor
COLORREF SetTextColor( COLORREF clr );
設定のテキストの色。
CListCtrl::SetBkImage
BOOL SetBkImage( LVBKIMAGE* plvbkImage );
BOOL SetBkImage( HBITMAP hbm, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0);
BOOL SetBkImage( LPTSTR pszUrl, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0 );
背景画像リストコントロール。
CComboBoxEx::SetExtendedStyle
CListCtrl::SetExtendedStyle
CTabCtrl::SetExtendedStyle
CToolBarCtrl::SetExtendedStyle
DWORD SetExtendedStyle( DWORD dwExMask, DWORD dwExStyles );

図4は、Windowsインターフェイスの例を向上させるためのMFCクラスの既存の関数の簡単なアプリケーションです:
図4は、両方のMFCクラスのインターフェイス機能造園を使用して

のBOOL CUi2App::InitInstanceの(){// ... :/ /ダイアログの背景色とフォントの色SetDialogBkColor(RGBの(128、192、255)は、RGB(0、0、255 ));// ...}ブールCUi2Dlg設定:OnInitDialogを(){// ... / /フォームの行のDWORDデフォルトアクセス権限= m_List.GetExtendedStyle()を使用して、リストコントロールのプロパティを設定します。新形式| = LVS_EX_GRIDLINES;(新形式)m_List.SetExtendedStyle / /赤m_List.SetTextColorするために、リストコントロールにフォントの色を設定します(RGBを(255 、0、0 ));//パディングm_List.InsertColumn(0、"QQは"LVCFMT_LEFT、100); m_List.InsertColumn(1、"ニックネーム"、LVCFMT_LEFT、100); m_List.InsertItem(0、""); m_List.SetItemText(0、1、"ジョーホワイト"); m_List.InsertItem(1、""); m_List.SetItemText(1、1、"サタン");// ...}
ああ、インターフェイスは今でも悪いことではありませんので、?

両方を使用するには、MFCクラス関数インターフェイスを美化するために、その機能が制限されている。Windowsはメッセージを介して通信するメカニズムですので、次に私たちは、いくつかの有用なWindowsメッセージは、次のインターフェースを美化するためにいくつかの有用な情報をキャプチャすることができます:
WM_PAINT
WM_ERASEBKGND
WM_CTLCOLOR*
WM_DRAWITEM*
WM_MEASUREITEM*
NM_CUSTOMDRAW*

3.3.1 WM_PAINT
私はウィンドウに送られます我々は非常にWM_PAINTメッセージ、それはWM_PAINTメッセージを持って再描画するウィンドウに精通していると信じて。
その外観を変更するには、ウィンドウのWM_PAINTに応じることができる。次のようにWM_PAINTメッセージのマッピング関数プロトタイプを以下に示す:
afx_msg void OnPaint();
コントロールは、ウィンドウのことですので、コントロールは、メッセージマップを通じて我々がコントロールインターフェイスを定義することができます、WM_PAINTメッセージを持っている。図5:
図5は、メッセージはWM_で始まるペイントを使用してインターフェイスを美化する
実装コードも非常に簡単です:
CLazyStaticが無効になる::OnPaintを(){CPaintDC dcは(この)(&rc)をGetClientRect; / /出力なし絵画/ /デバイスコンテキストだけCRectのrcの四角形を描画dc.Rectangle(RC)を;}
右母、単純な、?しかし、決して実際にポイントをWM_PAINTメッセージは、アプリケーションのインターフェイスは、図面のプロセスのすべての要素を完了するために必要な、完全なリストコントロールを描画する方法を想像して?あまりにも疲れて。一般的には、少数の人々は、WM_PAINTを使用するように、他のより詳細な情報がある。
3.3.2 WM_ERASEBKGND
WM_ERASEBKGNDのは、常にデフォルトでは、背景を消去し、ウィンドウを通知するメッセージを送信する前に、Windowsは、ウィンドウにWM_PAINTメッセージを送信するには、Windowsは、ウィンドウの背景色をオフにしてウィンドウになる。
その背景を変更するウィンドウ(サブ要素を含む)WM_ERASEBKGNDのに応答できません。。次のようにWM_ERASEBKGNDのマッピング関数プロトタイプを以下に示す:
afx_msg BOOL OnEraseBkgnd( CDC* pDC );
戻り値:
それがFALSEであるかどうかを指定します背景がクリアされているかどうか、システムは自動的にクリアされます
パラメータ:
pDCが機器環境の描画操作を指定する。
図6は、単純な例ですが、ダイアログボックスがOnEraseBkgndビットマップの背景のペアによって読み込まれます:



不透明な上のウィンドウ内のそれ以外の場合は、OnCtlColorにコントロールを応答することを忘れないでください。OnCtlColorコンテンツ章3.3.3を参照してください。
3.3.3 WM_CTLCOLOR
。WM_CTLCOLORデフォルトのメッセージハンドラのCWnd::OnCtlColorを使用すると、非テキスト領域のコントロールのテキストの前景色と背景色、およびダイアログボックスに設定できるように、ハンドルのHBRUSH型を返すか、またはブラシを選択します。
次のようにWM_CTLCOLORマッピング関数プロトタイプを以下に示す:
afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );
戻り値:
背景ブラシを指定するには

pDCが機器環境の描画操作を指定する。
pWndコントロールへのポインタ

タイプ値意味
CTLCOLOR_BTNボタンコントロール
CTLCOLOR_DLGダイアログ
CTLCOLOR_EDITは、コントロールを編集する
CTLCOLOR_LISTBOXリストボックス


CTLCOLOR_STATIC静的コントロール
表2 nCtlColor値の型と意味
簡単な例として、次のコードを観察する:
のBOOL CUi5Dlg::OnInitDialogを(){// ... m_Font3.CreatePointFont(120、"MS Pゴシック"); TRUEを返します。m_Font2m_Font1.CreatePointFont(120、"インパクト")/ /フォーカスを設定しない限り、TRUEを返す::m_Font1、CUi1View::/ / / /れたCFont CUi1Viewは、フォントを作成する:OnCtlColor(CDCの* pDCのは、CWnd * pWnd、UINT型のnCtlColor){HBRUSHの臭化水素= CDialogの:::コントロール} HBRUSH CUi5DlgにOnCtlColor(pDCは、pWnd、nCtlColor);場合(nCtlColor == CTLCOLOR_STATICは){/ /静的な区別コントロールスイッチ(pWnd -> GetDlgCtrlID()){場合IDC_STATIC1:{pDCの-> SelectObject関数(&m_Font1)のpDC -> SetTextColor関数(RGBの(0、0、255));破る;}ケースIDC_STATIC2:{pDCの-> SelectObjectの(&m_Font2)のpDC -> SetTextColor関数(RGBは、(255、0、0));破る;}}}戻り臭;}
次のように結果のインターフェイスは:
図7は、メッセージWM_CTLCOLOR使用してインターフェイスを美しく
3.3.4 WM_DRAWITEM
OnCtlColorだけでなく、色の要素を変更するインターフェイスのフレームワークの要素を変更することはできません、WM_DRAWITEMすることができます。
所有者は、スタイル要素を描画する(ボタン、コンボボックス、リストボックスやメニュー等を含む)の皮膚を示す必要がある、その要素は、その会員WM_DRAWITEMウィンドウ(所有者)にメッセージが送信されます。

afx_msg void OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct );
パラメータ:
要素は、次に0 nIDCtlメニューされている場合、コントロールIDをnIDCtl

typedef struct tagDRAWITEMSTRUCT{UINT CtlType;UINT CtlID;UINT itemID;UINT itemAction;UINT itemState;HWND hwndItem;HDC hDC;RECT rcItem;DWORD itemData;}DRAWITEMSTRUCT;

タイプ値意味

ODT_COMBOBOXコンボボックスコントロール
ODT_LISTBOXリストボックスコントロール


ODT_STATIC静的テキストコントロール
ODT_TABのタブコントロール


itemIDを、そのメニュー項目のIDも言うことができることをリストボックスまたはコンボボックスのインデックス値。空のリストボックスまたはコンボボックスの場合、メンバーは何ですか? C1は。。もちろん、メンバーも、フォーカスを描画することなく適切な値itemActionを設定することができます。
itemActionは、描画の動作を指定すると、表4つまたは関節の以上の値に示されている値:

コントロールは、描画する必要があるODA_DRAWENTIREは、値を設定する。
コントロールが獲得または失うことに焦点を当てる必要がある場合はODA_FOCUSが描かれ、その値を設定する。コントロールに入力フォーカスがあるかどうか現時点ではメンバーが決定するためにitemState確認してください。
コントロールがその値を設定するには、描画する変更する必要がある場合ODA_SELECTを選択。。

描画の現在の状態で指定されたitemState項目。たとえば、メニュー項目がグレイアウトする必要がある場合は、状態フラグをODS_GRAYED指定することができます。値は表5つまたは関節の以上の値に示すように:

ODS_CHECKEDマーカーの状態だけのメニュー項目。
ODS_DEFAULTデフォルト。
無効の状態をODS_DISABLED。

ODS_GRAYEDアッシング条件は、メニュー項目のみ。



ODS_NOACCELは、Windows 2000/XPに制御を適用するショートカットかどうかを。

ODS_NOFOCUSRECTにのみ焦点が描画の効果をキャプチャしない場合は、Windows 2000/XPに適用されます。。



矩形領域を指定rcItemが描画される。。。点(0,0)の座標がrcItemは、コントロールの左上隅を参照して。。
itemData
メニュー項目についても、CMenuの根拠のメンバーの値::は、AppendMenuも、CMenu::InsertMenuも、CMenu::メニューに渡される関数の値ModifyMenuので、。

値がODT_BUTTONのctlTypeまたはODT_STATICされている場合、itemData値は0です。


次のようにコードは次のとおりです:
のBOOL CUi6Dlg::OnInitDialogを(){// ... :m_Fontm_Font.CreatePointFont(120、"インパクト");//は...} CUi6Dlg無効::/ / / /れたCFont CUi1Viewは、フォントを作成する:OnDrawItemをを(int型nIDCtl、LPDRAWITEMSTRUCT lpDrawItemStruct){場合(nIDCtl == IDC_HELLO_CFAN){/ / = DFCS_BUTTONPUSHボタンフレームのUINT uStyleを描画します。行く/ /かどうか? CDCは、直流;(/ /出力テキストdc.SelectObjectを、dc.DrawFrameControl(&lpDrawItemStruct ->のrcItem、DFC_BUTTON、uStyle)(-> hdcをlpDrawItemStruct)dc.Attach = DFCS_PUSHED |(lpDrawItemStruct -> itemState&ODS_SELECTED)uStyle場合&m_Font); dc.SetTextColor(RGBの(0、0、255)); dc.SetBkMode(透明)のCString sText; m_HelloCFan.GetWindowText(sText); dc.TextOut(lpDrawItemStruct -> rcItem.left + 20、lpDrawItemStruct - >のrcItem先頭+ 20、sText);フォーカスがいる場合(lpDrawItemStruct ->のitemState&ODS_FOCUS){/ / lpDrawItemStruct -> rcItem仮想ボックスCRectののrtFocusを=描画/ /かどうか、rtFocus.DeflateRect(3、3);直流。 DrawFocusRect(&rtFocus);}戻り値;} CDialogの::OnDrawItemを(nIDCtl、lpDrawItemStruct);}

図9は、ボタンが描画所有者属性を指定する
これは、言及する価値があると、そのCWndの内部傍受WM_DRAWITEM、WM_MEASUREITEMメッセージの他のニュース、地図、対応するサブ要素CButtonなどの仮想関数の呼び出し::DrawItemイベント()。したがって、上記の例は、CButtonの派生クラスから派生することができ、クラスを示し、DrawItem()をオーバーライドして、達成するために機能。インターフェイスは、仮想関数の機構が美化の章3.4を参照してください道具を使う。
3.3.5 WM_MEASUREITEM
WM_DRAWITEMだけでListBoxなどのいくつかの特別なコントロールのための十分なされていない場合、システムはメッセージWM_DRAWITEM前に送信し、また、WM_MEASUREITEMメッセージを送信すると、ListBox内の各アイテムの高さを設定する必要があります。。
次のようにWM_DRAWITEMマッピング関数プロトタイプを以下に示す:
afx_msg void OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct );
要素は、次に0 nIDCtlメニューされている場合、コントロールIDをnIDCtl
オブジェクトのポイントにMEASUREITEMSTRUCT構造体のポインタをlpMeasureItemStructは、MEASUREITEMSTRUCTは構造は次のように定義されています:
typedef struct tagMEASUREITEMSTRUCT{UINT CtlType;UINT CtlID;UINT itemID;UINT itemWidth;UINT itemHeight;DWORD itemData} MEASUREITEMSTRUCT;
CtlTypeは、コントロールの種類を、表6に示すように値を指定します:
タイプ値意味

ODT_LISTBOXリストボックスコントロール
ODT_MENUメニュー項目
値と意味の表6 CtlTypeタイプ

。このメンバは、固定の高さのリストボックスまたはコンボボックスには適用されません。。

itemHeightメニュー項目またはリストボックスには、最大255の高さを指定します。
itemData

リストボックスまたはコンボボックス、コンボボックスの敷地内のメンバの値について::AddString、CComboBoxの::InsertString、CListBoxクラス::AddStringまたはCListBoxクラス::コントロールに渡される関数の値InsertStringなど。
OnMeasureItemを図の効果を示しています:
インターフェイスWM_MEASUREITEMメッセージ造園を使用して、図10

CUi7Dlgが無効になる::OnMeasureItemをを(int型nIDCtl、LPMEASUREITEMSTRUCT lpMeasureItemStruct){場合(nIDCtl == IDC_COLOR_PICKER){/ /セットの高さ30lpMeasureItemStruct -> itemHeight = 30;戻り値;} CDialogの::OnMeasureItemを(nIDCtl、lpMeasureItemStruct);}

図11は、属性を指定する所有者が描く、ドロップダウンボックス
3.3.6 NM_CUSTOMDRAW
あなたはWM_NOTIFYを、WM_NOTIFYを介して制御知っているかもしれませんが、親ウィンドウにメッセージを送る。。

ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
afx_msg void OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult);
パラメータ:

typedef struct tagNMHDR{HWND hwndFrom;UINT idFrom;UINT code;} NMHDR;
うち:
hwndFromウィンドウには、送信制御を処理する
idFrom送信者ID管理
注意してくださいコードcode

typedef struct tagNMCUSTOMDRAWINFO{NMHDR hdr;DWORD dwDrawStage;HDC hdc;RECT rc;DWORD dwItemSpec;UINT uItemState;LPARAM lItemlParam;} NMCUSTOMDRAW, FAR * LPNMCUSTOMDRAW;
hdr NMHDR構造オブジェクト
dwDrawStage現在の描画状態は、値は表7に示す:


描画ループのCDDS_POSTPAINT端

CDDS_PREPAINTの準備ができてループを描画を開始する
CDDS_ITEM、効果的なのdwItemSpec、uItemState、lItemlParamパラメータを指定
CDDS_ITEMPOSTERASEは、リスト項目の最後を消去する

アイテムのCDDS_ITEMPREERASEリストを消去する準備ができて
CDDS_ITEMPREPAINTの準備ができて項目のリストを表示して描画を開始する



rcが描画される四角形を指定します。。
dwItemSpecリスト項目のインデックス
リスト項目は、表8に示すように、値の現在の状態をuItemState:

CDIS_CHECKEDマーク状態。
CDIS_DEFAULTデフォルト。

CDIS_FOCUSフォーカス状態。

CDIS_SELECTEDを選択。
CDIS_HOTLIGHTホットな状態。
不確実性のCDIS_INDETERMINATE状態。

値と意味の表8 uItemStateタイプ

状態は、指定したシステムのフォローアップの操作を指しているpResultポインタの値は、dwDrawStageに依存します:
CDDS_PREPAINTにdwDrawStageは、pResultは、下記の表9に記載する場合:

CDRF_DODEFAULTのデフォルトのアクションは、アイテムのリストには、システムはもはやサイクルを描くNM_CUSTOMDRAW送信する。


項目のリストのCDRF_NOTIFYPOSTPAINT最後に描画するためにメッセージを送信する。
値と意味の表9 pResultタイプ()
CDDS_ITEMPREPAINTにdwDrawStageは、pResultは、下記の表10で説明する:

CDRF_NEWFONTは、新しいフォントのアプリケーションで指定された後続の操作で指定された。
CDRF_NOTIFYSUBITEMDRAWリストには、子供が描画メッセージを送信。
CDRF_SKIPDEFAULTシステムでは、子供を描画する必要はありません。。
表10 pResult値と意味の型(b)
以下は、多色NM_CUSTOMDRAWリストボックスの例を使用して描画メッセージです:

次のようにコードを対応する:
CCoolListが無効になる::OnCustomDrawを(NMHDR構造* pNMHDRを、プロシージャLRESULT * pResult){/ /タイプセーフな変換NMLVCUSTOMDRAW * pLVCD = reinterpret_cast (PNMHDR); *のpResult = 0; / / {= CDRF_NOTIFYITEMDRAW * pResultを;}指定されたメッセージの前にいる場合(CDDS_PREPAINT == pLVCD -> nmcd.dwDrawStage)リスト項目を描画する他の場合(CDDS_ITEMPREPAINT == pLVCD -> nmcd.dwDrawStageを){/ /奇数ライン場合(pLVCD -> nmcd.dwItemSpec%2)pLVCD -> clrTextBk =のRGB(255、255、128); / /偶数行elsepLVCD -> clrTextBk =のRGB(128、255、255); / ;}} / *のpResultを= CDRF_DODEFAULT継続
3.1の例最初の2つの推奨される実装方法で撮影ノートには、新しいクラスCCoolListを導出。
3.4のMFCクラスの仮想関数の機構を使用して
変更Windowsのインターフェイスは、仮想機構のクラスの恩恵を受ける必要がありますMFCクラスの取り組みから、Windowsのメッセージ機構もご覧になれますから、努力に加えて、。ために次の例のようにコードを挙げると、洪水の中で"オブジェクト指向技術"やその他の条件など防止するために:
void CView::OnPaint(){// standard paint routineCPaintDC dc(this);OnPrepareDC(&dc);OnDraw(&dc);}
これはviewcore.cppでMFCのソースコードは、多くの読者が合計OnDrawの()およびOnPaint()を簡単に見られている上記のコードの間の関係は、CViewは、WM_PAINTメッセージの応答関数OnPaintが()が自動的にのCViewを呼び出します理解していない::OnDrawの()。単純なOnDrawの()を介してユーザーの開発者として、達成するためにWM_PAINTメッセージ処理を無効にする。。
次に、インターフェイスの仮想関数は、使用済パラメータに関連付けられている景観を示しています:
CButton::DrawItem
CCheckListBox::DrawItem
CComboBox::DrawItem
CHeaderCtrl::DrawItem
CListBox::DrawItem
CMenu::DrawItem
CStatusBar::DrawItem
CStatusBarCtrl::DrawItem
CTabCtrl::DrawItem
virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
所有者は、描画関数から要素を描画する
。スペースの制約があるため、これはもはやルーチンに接続されている。