ツリービューの全項目をクリア後に追加すると表示異常が起こる

解決


ぴょぴょ  2007-09-05 10:13:13  No: 66202

開発環境は Windows XP Home SP2、VC++2003(SDK) です。
リソースでダイアログに1つのツリービューを貼り付けました。それ1つだけ。
最初にソースを載せます。

// ルート追加
static VOID pushItemRoot( HWND hTree, LPCTSTR lpString )
{
  TV_INSERTSTRUCT tree;
  
  ZeroMemory( &tree, sizeof(TV_INSERTSTRUCT) );
  tree.hParent = TVI_ROOT;
  tree.hInsertAfter = TVI_LAST;
  tree.item.mask = TVIF_TEXT;
  tree.item.pszText = (LPTSTR)lpString;
  TreeView_InsertItem( hTree, &tree );
}

// 全部クリア
static VOID pushMenuClear( HWND hTree )
{
  if ( !TreeView_DeleteAllItems(hTree) ){
    MessageBeep( MB_OK );
  }
}

// ツリービューのテスト(プロシージャ)
BOOL CALLBACK mainDialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  static HWND hTree;
  
  switch ( uMsg ){
    case WM_INITDIALOG:
      InitCommonControls();
      hTree = GetDlgItem( hDlg, LID_TREEVIEW01 );
      pushItemRoot( hTree, TEXT("あいうえお") );
      pushItemRoot( hTree, TEXT("かきくけこ") );
      pushItemRoot( hTree, TEXT("さしすせそ") );
      pushItemRoot( hTree, TEXT("たちつてと") );
      break;
    case WM_LBUTTONDOWN:
      pushItemRoot(  hTree, TEXT("追加") );
      break;
    case WM_RBUTTONDOWN:
      pushMenuClear( hTree );
      break;
    case WM_CLOSE:
      EndDialog( hDlg, IDOK );
      break;
    default:return FALSE;
  }
  return TRUE;
}

上のソースをコンパイルしてプログラムを起動します。
すると最初に4つのアイテムが追加されます。
次にマウスの右クリックをすると全項目がクリアされます。
ここまでは正常です。

[質問内容]
クリア後にマウスの左クリックで追加するとアイテムの文字列「追加」が上手く表示されません。
TreeView_GetCount() で調べるとちゃんと追加された個数が返されます。
だから追加処理は正常なのです。戻り値も含めて。
でも何も表示されないのです。

僕には原因が分かりません。
原因が分かる方いますか?教えて下さい。
お願いします。

ちなみにリースでは
CONTROL  "",LID_TREEVIEW01,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | TVS_SHOWSELALWAYS | TVS_NOSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP,6,6,204,288
としています。
TVS_LINESATROOT をつけているのでこの部分だけしか表示されないのです。
TreeView_EditLabel() を使って編集状態にするとエディットボックスが現れ追加した文字列が
表示されます。フォーカスを移動して編集を確定すると内容は変更されますが文字列だけが
表示されません。いろいろと試行錯誤して子のアイテムを追加も表示されません。でも正常に
追加はされています。表示だけがまるで空白を登録したように表示されません。

原因が分かる方は教えて下さい。
お願いします。


ぴょぴょ  2007-09-05 11:44:57  No: 66203

試行錯誤の結果に原因が判明いたしました。

ツリービューに TVS_NOSCROLL スタイルを付けるとなる現象のようです。
TVS_NOSCROLL スタイルを取り除きスクロール可能にすると全項目をクリア後に
アイテム追加するとちゃんと追加文字列が表示されいます。子のアイテムも同様。

確認の為に TVS_NOSCROLL スタイルをまた付けてスクロール不可能にしてから
全項目をクリア後にアイテムを追加すると追加文字列がきちんと表示されなくなった。

よって原因は TVS_NOSCROLL スタイルの有無です。
皆様の環境ではどうのようになりますか?
お暇な方や興味のある方はちょっとテストしてみて下さい。

なお、この質問はもう解決しました。
でも、しばらくはこの質問を覗きに来ます。


ぴょぴょ  2007-09-05 11:57:09  No: 66204

原因は分かったもののなぜ TVS_NOSCROLL スタイルを付けると
全項目クリア後に追加された文字列が正しく表示されないのでしょうか?
これはツリービューのバグなのでしょうか?
皆様はどう思いますか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加