CTRLTEST サンプル:カスタム コントロールの実装

CTRLTEST サンプルでは、カスタム コントロールを実装して使用するための手法を示します。

  • CParsedEdit を実装するは特殊なそのライブラリ コントロール クラスから派生機能をコントロールとカスタム コントロールを使用して、3 つの方法を編集します。

  • スピン コントロールの使い方。 スピン コントロールには、値を増減するための小さな上向きの矢印ボタンと下向きの矢印ボタンがあります。

  • ボタンの実装を使用して カスタム CBitmapButton のメニュー コマンドのビットマップします。

  • メニューやリスト ボックスのオーナー (親ウィンドウ) 描画。 CMenu クラスや CListBox クラスから派生した対応するコントロール クラスには、この機能がオブジェクト指向で用意されています。

  • Microsoft Visual C++ リソース エディターで保持できないリソース ファイルの使用。 ここでは、ダイアログ ボックスで .rc2 ファイルを使用する場合の長所と短所を示します。このダイアログ ボックスには、ヘッダー ファイルで定義されたスタイルを持つカスタム コントロールがあります。

CTRLTEST のすべての例は、メニュー コマンドで開始します。

セキュリティに関するメモセキュリティに関するメモ

このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。

サンプルとそのインストール手順を取得するには

Visual Studio のサンプルにアクセスするには

  • [ヘルプ] メニューの [サンプル] をクリックします。

    既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。

  • このサンプルの最新版および他のサンプルの一覧については、MSDN Web サイト上で Visual Studio サンプル 」を参照してください。

サンプルのビルドと実行

CTRLTEST サンプルをビルドおよび実行するには

  1. ソリューション Ctrltest.sln を開きます。

  2. [ビルド] メニューの [ビルド] をクリックします。

  3. でデバッグ メニューの、[デバッグなしで開始 をクリックします。

例 :実装とカスタム コントロールを使用します。

カスタム コントロールは、CWnd から派生して実装できますが、ライブラリのコントロール クラスから派生して標準 Windows のコントロールの機能を利用した方がはるかに簡単です。 CTRLTEST CParsedEdit 特殊な編集コントロールを実装するときに行われます。 このエディット コントロールは、ユーザー入力として指定したセットの文字のみを受け入れます。数値、英字、または noncontrol 文字。 CParsedEdit CEdit から導き出されます。 このクラスには、文字のフィルター処理を行う OnChar メッセージ ハンドラーがあります。

簡易メニュー内のコマンドの実装は、カスタム コントロールを使用して、3 つの方法を示します。 メソッドは、どのアプリケーション] ダイアログ ボックスで、コントロールのインスタンスを CParsedEdit クラスに関連付けますに従って区別されます。 各 簡易メニュー コマンドの CParsedEdit コントロールの 4 つのインスタンスを伴うダイアログ ボックスが表示されます。 ダイアログ ボックスに入力されたデータがデバッグ ポートに TRACE 出力として送信されます。 3 つ 簡易メニュー コマンドは、次のとおりです。

Test C++ Deribed class

CParsedEdit コントロール ダイアログ クラスのデータ メンバーになります。 コントロールは OnInitDialog を呼び出す ことによって、ダイアログの CParsedEdit::CreateSet 関数を明示的に作成されます。 Dertest.cpp を参照してください。

Test WNDCLASS Registered

CParsedEdit コントロール ダイアログ テンプレート リソース (IDD_WNDCLASS_EDIT) でカスタム コントロールとして"として paredit"識別 WNDCLASS をレイアウトします。Visual C++ ダイアログ エディターでは、次のようなカスタム コントロールのプロパティを調べることができます。

  • Caption : 空白。 これは、CParsedEdit コントロールに表示される初期値です。

  • Class : paredit。 これは、ダイアログ ボックスが呼び出される前に、PAREDIT2.CPP で WNDCLASS で登録されている CParsedEdit::RegisterControlClass 名前です。

  • Visible : True。 コントロールが表示されます。

  • Tabstop : True。 ユーザーは、タブ キーでこのコントロールを選択できます。

  • スタイル : 0x5081002、0x5081001、0x5081003、0x5081ffff (4 つの解析済みエディット コントロールについて)。 スタイル 0x500000 WS_CHILDWS_VISIBLE、なあり 0x1000 WS_TABSTOP をします。 すべてのカスタム コントロールは、WS_CHILD スタイルがあります。 WS_VISIBLE WS_TABSTOP の"Visible/可視"と Tabstop スタイルをチェックするときに、 スタイルが自動的にダイアログ エディターで設定されます。 0x80000 は WS_BORDER に対応します。 [ダイアログ エディター] プロパティ ページのカスタム コントロールのすべてのウィンドウ スタイル WS_BORDER などの機能はので、\Microsoft Visual Studio .NET の 2003\Vc7\PlatformSDK\Include\WINUSER.H に定数を検索する必要があります。 0x0001、0x0002、0x0004、および 0x0ffff スタイル PAREDIT.H ではそれぞれ、として、定義されている PES_NUMBERSPES_LETTERSPER_OTHERCHARSPES_ALL。

  • カスタム コントロール プロパティ ページの 16 進数スタイルは、そのままでは理解されません。 PES_NUMBERS PES_LETTERS など、シンボリック スタイルを使用する重要な場合または、リソース コンパイラによってコンパイル時に、含まれていますが、Visual C++ で時間を編集するのには読み込まれない RES\Ctrltest.rc2 など、個別のリソース ファイルを手動で編集できます。 .rc2 ファイルのカスタム コントロール ダイアログを手動で編集する利点と欠点については、「Visual C++ リソース エディターで保守できないリソース ファイルの使用」を参照してください。

Test Dynamic Subclassed

コントロールは、標準エディット コントロールとしてダイアログ テンプレート リソース (Ctrltest.rc の IDD_SUB_EDIT) に配置されます。 コントロールは、CParsedEdit データ メンバー、ダイアログ クラスに宣言されます。 ダイアログの OnInitDialog に呼び出す各エディット コントロールの特定のインスタンスは、 CParsedEdit::SubClassEditクラスと関連付ける CWnd::SubclassDlgItemCParsedEdit を呼び出します。 Paredit.cpp を参照してください。

例 :Spin Control

CTRLTEST サンプルには、スピン コントロールの実装が含まれています。 スピン コントロールには、値を増減するための小さな上向きの矢印ボタンと下向きの矢印ボタンがあります。

CParsedEdit の 4 つのコントロールが設定されているダイアログ ボックス、 コマンドのスピン コントロールを呼び出し、各スピン コントロールに関連付けられています。 ダイアログ ボックスの CParsedEdit コントロールに入力されたデータは、0 または正の数だけを受け付けるようにフィルター処理されます。 数値データを入力するには、値を CParsedEdit コントロールに入力するか、または関連付けられたスピン コントロールを使用します。

例 :ビットマップ ボタン

次の カスタム メニュー コマンドの実装は CBitmapButton を使用する方法を示しています。

  • ビットマップ ボタン 1 - ダイアログ コンストラクターは、明示的にビットマップ リソースごとに 3 つの状態に読み込みます (上、下、および重点を置いて) CBitmapButton::LoadBitmaps を呼び出して、ボタンの。

  • ビットマップ ボタン 2 -[ダイアログの OnInitDialogCBitmapButton::Autoload を次の名前付け規則に基づくビットマップ リソースを読み込めません呼び出します。 コントロールのウィンドウ テキストが基本リソース名として使用されます。この名前に英字の U、D、または F が追加されて、アップ、ダウン、およびフォーカスの 3 つのビットマップ イメージに対応する各リソースの名前が作成されます。 たとえば、[OK] ボタンの 3 つのビットマップ リソースの名前は、OKU、OKD、OKF などになります。

  • ビットマップ ボタン 3 - ダイアログ ボックス上で 2 番目のダイアログ ボックスの拡張機能を使用する 4 番目が無効にできるボタンの状態、です。 このダイアログを使用するには、最小値 1 または最大値 10 が表示されるまで、左向きまたは右向きの矢印のビットマップ ボタンをクリックします。 制限値に達すると、ボタンは無効になり、4 番目のビットマップ イメージが表示されます。 無効状態のビットマップ リソースは、名前付け規則に従って X が末尾に付きます。たとえば、リソース名は PREVX および NEXTX になります。

例 :オーナー描画 (メニューおよびリスト ボックス)

Windows の各種コントロールやメニューにはオーナー描画機能があり、親 (つまりオーナー) ウィンドウは、コントロールのクライアント領域に、標準のコントロールの動作以外の動作を描画できます。 対応するコントロール クラスと CMenu クラス、オブジェクト指向の方が便利な方法でこの機能を提供します。コントロールまたはメニュー クラスは、図面を処理します。 これは "自己描画" と呼ばれます。

CTRLTEST のオーナー描画の カスタム メニューで、次のコマンドを実装するための一般的な手法を示しています。

  • カスタム メニュー - このメニュー項目が派生から CColorMenuCMenu ポップアップ メニューの呼び出されます。 各サブメニュー項目には、自己描画機能を使用して 8 色のうち 1 色が表示されます。 メッセージ ボックスでは、サブメニューで選択する色を確認します。

  • カスタム リスト ボックス - このメニュー項目は派生から CColorListBoxCListBox を表示する] ダイアログ ボックスを呼び出します。 リスト ボックスには 8 つのエントリがあり、それぞれ、自己描画機能を使用して 8 色のうちのいずれかで描画されます。 TRACE 出力リスト ボックスから選択を確認するメッセージが表示されます。

例 :リソースを使用して Visual C++ リソース エディターで保守しやすいファイルなし

CTRLTEST\RES\Ctrltest.rc2 リソース ファイルは、Visual C++ リソース エディターで、ユーザーが認識できる形式で保持されないリソース ファイルの例です。 Ctrltest.rc2 を Visual C++ で開いてから保存すると、ユーザーが認識できる役立つ情報が失われます。リソース コンパイラが .rc2 ファイルをコンパイルし、同等の内容のバイナリ .res ファイルを作成する場合でも同様です。 したがって、RES\Ctrltest.rc2 Ctrltest.rc では、#include として、 コマンドのセットを含むリソース ファイルの指定、コンパイル時ディレクティブが追加されています。

ユーザーが認識できる次の 3 つの情報は、Visual C++ リソース エディターでは保持されません。 Ctrltest.rc2 では、このうちの 2 つについて示します。

  • Custom control styles symbols - たとえば、"msctls_updown32"スピン コントロールに対しては、スタイルが定義されています。 Visual C++ は .rc2 ファイルを読み込むときにこのシンボルを解釈しますが、.rc2 ファイルに書き込むときは 16 進値として書き込みます。

  • Standard Windows WS_ or control style symbols used in a control from a standard Windows control-derived class - たとえば、 ES_AUTOHSCROLL スピン コントロールを [IDD_SPIN_EDIT] ダイアログ ボックスで定義されています。 Visual C++ は .rc2 ファイルを読み取るときにこのシンボルを解釈しますが、.rc2 ファイルに書き込むときは 16 進値として書き込みます。

  • Arithmetic in the .rc file - IDC_EDIT1 + 2 などの式IDD_SPIN_EDIT 内のコントロールを識別するダイアログ .rc2 ファイルには 1 つの 16 進値として Visual C++ で書き戻すなりますします。

CTRLTEST サンプルでは、ダイアログ ボックスのカスタム コントロールのスタイルがヘッダー ファイルの定数で定義されている場合に、.rc2 ファイルを使用する利点と欠点が示されています。 両方のダイアログ ボックスし、IDD_WNDCLASS_EDITIDD_SPIN_EDIT カスタム コントロールの型で定義されたスタイル; があります。Visual C++ ダイアログ エディターで、編集可能な .rc ファイルで IDD_WNDCLASSIDD_SPIN_EDIT のみ手動で編集可能な .rc2 ファイルの指定に対し指定です。

.rc ファイルと .rc2 ファイルの使用方法の違いについて説明します。

IDD_WNDCLASS_EDIT ダイアログ ボックスで、リソース スクリプト Ctrltest.rc で定義されています。 IDD_SPIN_EDIT ダイアログ ボックスで、リソース スクリプト RES\Ctrltest.rc2 で定義されています。 IDD_WNDCLASS_EDIT ダイアログの WNDCLASS カスタム コントロール"paredit"スタイルの定数が PAREDIT.H で定義されているそして例スタイル定数 PES_NUMBER です。 IDD_WNDCLASS_EDIT は、Visual C++ で編集可能ですが、 #define スタイルを使用することはできません。 IDD_SPIN_EDIT Visual C++ で編集可能ではありませんが、 #define スタイルを使用できます。

.rc2 ファイルを使用すると、カスタム コントロールについて、ユーザーが認識できるシンボリック スタイルをヘッダー ファイルに定義して使用できますが、.rc2 ファイルを Visual C++ ダイアログ エディターで編集することはできません。 ダイアログのレイアウトは、Visual C++ を使用する方が、リソース スクリプトを手動で作成するよりも簡単です。また、リソース スクリプトを作成すると、エラーが発生しやすくなります。 一方、Visual C++ ダイアログ エディターを使用すると、スタイルがカスタム コントロール プロパティ ページに 16 進で表示されるため、わかりにくくなります。

Keywords

このサンプルでは、次のキーワードを使用します。

AfxGetInstanceHandle; AfxMessageBox; AfxThrowResourceException; CBitmapButton::AutoLoad; CDC::FillRect; CDC::FrameRect; CDialog::DoModal; CDialog::EndDialog; CDialog::OnInitDialog; CDialog::OnOK; CDialog::OnSetFont; CEdit::Create; CEdit::SetSel; CFrameWnd::Create; CListBox::AddString; CListBox::CompareItem; CListBox::DrawItem; CListBox::GetItemData; CListBox::MeasureItem; CMenu::AppendMenu; CMenu::CreateMenu; CMenu::Detach; CMenu::DrawItem; CMenu::EnableMenuItem; CMenu::FromHandle; CMenu::GetMenuString; CMenu::MeasureItem; CRect::Width; CStatic::Create; CString::Format; CString::LoadString; CWinApp::InitInstance; CWnd::Attach; CWnd::EnableWindow; CWnd::FromHandle; CWnd::GetDlgCtrlID; CWnd::GetDlgItem; CWnd::GetDlgItemInt; CWnd::GetMenu; CWnd::GetParent; CWnd::GetWindowRect; CWnd::GetWindowText; CWnd::IsWindowEnabled; CWnd::MessageBox; CWnd::OnChar; CWnd::OnCommand; CWnd::OnVScroll; CWnd::PostNcDestroy; CWnd::SendMessage; CWnd::SetDlgItemInt; CWnd::SetFocus; CWnd::SetFont; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::SubclassDlgItem; CallWindowProc; GetBValue; GetClassInfo; GetGValue; GetRValue; GetSystemMetrics; HIWORD; IsCharAlpha; IsCharAlphaNumeric; LOWORD; MAKEINTRESOURCE; MAKELONG; MessageBeep; ModifyMenu; RGB; RegisterClass; SetWindowLong

注意

このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。

参照

その他の技術情報

MFC サンプル