今回は、ダイアログボックスにツリービューを付けます。
テキストの表示 - インコのWindowsSDK で作成したソースを修正します。
ここでは、Reseditで作成する方法も説明します。
流れ
ツリービューは、コモンコントロールの一つです。
1.commctrl.hをインクルード。
2.comctl32.lib を読み込みます。
WM_INITDIALOG
WM_INITDIALOGは、ダイアログが作成されたときに一度だけ実行されます。
1.InitCommonControls()でコモンコントロールの初期化。
2.ツリービューを作成します。まずは、TV_INSERTSTRUCT構造体を初期化。構造体にデータをセット。
typedef struct tagTVINSERTSTRUCT {
HTREEITEM hParent; // ツリービューのハンドル
HTREEITEM hInsertAfter; // 挿入位置を表すアイテムのハンドル
union
{
TVITEMEX itemex; // 追加するアイテムの情報を指定したTVITEMEX構造体が格納
TVITEM item; // 追加するアイテムの情報を指定したTVITEM構造体が格納
} DUMMYUNIONNAME;
} TVINSERTSTRUCT, *LPTVINSERTSTRUCT;
| hInsertAfter | 説明 |
| TVI_ROOT | アイテムをルートアイテムとして追加 |
| TVI_FIRST | アイテムをリストの最初の位置に挿入 |
| TVI_LAST | アイテムをリストの最後の位置に挿入 |
| TVI_SORT | アイテムをアルファベット順にリストに挿入 |
ここでは、tv.hInsertAfter = TVI_LAST とします。
ここでは、tv.hParent = TVI_ROOT として、ツリービューのトップであることを指定します。
TVI_ROOTの代わりにNULLでも構いません。
TV_INSERTSTRUCT構造体のitemexメンバであるTVITEM構造体
typedef struct tagTVITEM {
UINT mask; // 有効メンバを示すフラグ
HTREEITEM hItem; // アイテムのハンドル
UINT state; // アイテムの状態・イメージ
UINT stateMask; // state のフラグ
LPTSTR pszText; // アイテムの文字列
int cchTextMax; // アイテムの文字列の長さ
int iImage; // イメージのインデックス(非選択時)
int iSelectedImage; // イメージのインデックス(選択時)
int cChildren; // 子アイテムを持つかどうかのフラグ
LPARAM lParam; // アイテムの持つ32ビット値
} TVITEM, *LPTVITEM;
TV_INSERTSTRUCT構造体のitemメンバであるTVITEMEX構造体 : TVITEM構造体にメンバ iIntegral を追加したものです。
typedef struct tagTVITEMEX {
UINT mask; // 有効メンバを示すフラグ
HTREEITEM hItem; // アイテムのハンドル
UINT state; // アイテムの状態・イメージ
UINT stateMask; // state のフラグ
LPTSTR pszText; // アイテムの文字列
int cchTextMax; // アイテムの文字列の長さ
int iImage; // イメージのインデックス(非選択時)
int iSelectedImage; // イメージのインデックス(選択時)
int cChildren; // 子アイテムを持つかどうかのフラグ
LPARAM lParam; // アイテムの持つ32ビット値
int iIntegral
} TVITEMEX, *LPTVITEMEX;
| mask | 有効メンバを示すフラグ |
| TVIF_TEXT | pszText, cchTextMaxメンバが有効 |
ここでは、TVITEM構造体を使い、tv.item.mask = TVIF_TEXT とします。
tv.item.pszText = TEXT("親1") というように、アイテムをセットしていきます。
3.TreeView_InsertItem()でツリービューの親項目や子項目を追加します。
HTREEITEM TreeView_InsertItem(
HWND hwndTV, // ツリービューのハンドル
LPTVINSERTSTRUCT lpis // 追加するTV_INSERTSTRUCT構造体のポインタ
);
戻り値は、追加したツリービュー項目のハンドルになります。
リソースファイル
1.ツリービューを使用するため、commctrl.hをインクルード。
2.ツリービュー[WC_TREEVIEW]を追加。
WC_TREEVIEWの代わりに、"SysTreeView32"と記述することができます。「" "」を忘れないで下さい。
この場合は、リソースファイルで、commctrl.hをインクルードする必要はありません。
ただし、"SysTreeView32"と記述した場合でも、Cソースファイルでは、commctrl.hのインクルードが必要です。
CONTROL "", id, WC_TREEVIEW, style, x0, y0, width, height
| id | ツリービューID |
| style | ツリービューのスタイル ウインドウスタイルと、ツリービューのスタイルが指定可能 |
| x0 | ツリービュー左上のx座標 |
| y0 | ツリービュー左上のy座標 |
| width | ツリービューの幅 |
| height | ツリービューの高さ |
・Visual Studioのリソース ビュー、ResEditでの設定
ツールボックス(Toolbox)ウインドウの「TreeView Cntrol」を選択
プロパティは、
・Has Buttons (TVS_HASBUTTONS : 子アイテムを持つときに親アイテムの横に + や - を表示 )、
・Has Lines (TVS_HASLINES : アイテムをつなぐ線を表示)、
・Lines At Root (TVS_LINESATROOT : 一番上のアイテムの線を表示)、
・Scroll (TVS_NOSCROLL : スクロールなし。スクロールバー非表示)
をすべてtrueにします。
ソースコードの入力
ソースコードは下記のように入れてください。
#include <windows.h> #include <commctrl.h> #include "resource.h" #pragma comment(lib, "comctl32.lib") // このコード モジュールに含まれる関数の宣言を転送します: BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, DialogProc); return 0; } BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HTREEITEM hParent1, hParent2, hParent3, hChild1, hChild2; TV_INSERTSTRUCT tv; switch (msg) { case WM_INITDIALOG: InitCommonControls(); memset(LPTSTR(&tv), '\0', sizeof(tv)); tv.hInsertAfter = TVI_LAST; tv.item.mask = TVIF_TEXT; tv.hParent = TVI_ROOT; tv.item.pszText = TEXT("親1"); hParent1 = TreeView_InsertItem(GetDlgItem(hWnd,IDC_TREE1), &tv); tv.item.pszText = TEXT("親2"); hParent2 = TreeView_InsertItem(GetDlgItem(hWnd,IDC_TREE1), &tv); tv.item.pszText = TEXT("親3"); hParent3 = TreeView_InsertItem(GetDlgItem(hWnd,IDC_TREE1), &tv); tv.hParent = hParent1; tv.item.pszText = TEXT("子1"); hChild1 = TreeView_InsertItem(GetDlgItem(hWnd,IDC_TREE1), &tv); tv.item.pszText = TEXT("子2"); hChild2 = TreeView_InsertItem(GetDlgItem(hWnd,IDC_TREE1), &tv); tv.hParent = hChild1; tv.item.pszText = TEXT("孫1"); TreeView_InsertItem(GetDlgItem(hWnd,IDC_TREE1), &tv); tv.hParent = hChild1; tv.item.pszText = TEXT("孫2"); TreeView_InsertItem(GetDlgItem(hWnd,IDC_TREE1), &tv); tv.hParent = hParent2; tv.item.pszText = TEXT("子3"); TreeView_InsertItem(GetDlgItem(hWnd,IDC_TREE1), &tv); tv.hParent = hParent3; tv.item.pszText = TEXT("子4"); TreeView_InsertItem(GetDlgItem(hWnd,IDC_TREE1), &tv); break; case WM_CLOSE: EndDialog(hWnd, IDOK); break; default: break; } return FALSE; }
#define IDC_TREE1 1011
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif
Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。
#include <windows.h> #include <commctrl.h> #include "resource.h" ///////////////////////////////////////////////////////////////////////////// // // ダイアログ // DIALOG_BOX DIALOG 0, 0, 170, 62 FONT 9, "MS UI Gothic" CAPTION "ダイアログ" BEGIN CONTROL "", IDC_TREE1, WC_TREEVIEW, WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_INFOTIP, 1, 1, 168, 60 END
Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。