CTreeCtrlで選択でフォーカスが外れた時も、選択している状態を残したい – プログラミング – Home

CTreeCtrlで選択でフォーカスが...
 
通知
すべてクリア

CTreeCtrlで選択でフォーカスが外れた時も、選択している状態を残したい


takeno
 takeno
(@takeno)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

VC++6.0 MFC WinXP sp2

初心者です。
CTreeCtrlを利用したツリーを選択するダイアログを作成しています。
そのダイアログにはコンボボックスも作成しています。
Treeを選択している時は、青色で選択している事がすぐわかるのですが、
コンボボックスにマウスを移したときに、
Treeには選択しているという青色が表示されません。

青色をずっと残しておくにはどうすればよいですか。


引用解決済
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

TVS_SHOWSELALWAYS について調べてみてください。


返信引用
takeno
 takeno
(@takeno)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

シャノン様
下記の様に設定致しました。
しかし、表示は変化ありません。

何がおかしいのでしょうか?

CTreeCtrl& m_Tree = GetTreeCtrl();
m_Tree.ModifyStyle(NULL,TVS_HASLINES | TVS_SHOWSELALWAYS);


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

TVS_SHOWSELALWAYSを指定
(Tree Control のプロパティのスタイルで選択を常に表示)しても、
>青色をずっと残しておくにはどうすればよいですか。
とならず、グレーになってしまいます。

その色を変える(グレー→選択状態の色)のがわからなかったので、
ツリーコントロールのNM_KILLFOCUSを使って、以下のようにしてみたら
うまくいきました。

ちなみにツリーコントロールのIDは IDC_TREE1 です。

void CTreeDlg::OnKillfocusTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
// ツリーコントロールを取得
CTreeCtrl* pTree = ( CTreeCtrl* )this->GetDlgItem( IDC_TREE1 );
// 描画用のデバイス コンテキスト
CClientDC dc( pTree );

// ツリーコントロールのフォントを設定
CFont* pOldFont = dc.SelectObject( pTree->GetFont() );

// 選択中のアイテムのハンドルを取得
HTREEITEM hItem = pTree->GetSelectedItem();

// アイテムのテキストを取得
CString strText = pTree->GetItemText( hItem );
// アイテムの外接四角形を取得
CRect rect;
pTree->GetItemRect( hItem, &rect, TRUE );

// 背景色と文字色を設定
dc.SetBkColor( ::GetSysColor( COLOR_HIGHLIGHT ) );
dc.SetTextColor( ::GetSysColor( COLOR_HIGHLIGHTTEXT ) );

// テキストを描写
dc.TextOut( rect.left + 2, rect.top + 1, strText );

// フォントを元に戻す
dc.SelectObject( pOldFont );

*pResult = 0;
}

環境 WinXp Pro SP2, VC++6.0 Stand SP6
参考サイト
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TVcolor.html

なんかもっと楽ちんな方法がありそう。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

あれ?よくみたらダイアログじゃない?
>CTreeCtrl& m_Tree = GetTreeCtrl();
GetTreeCtrlで戻り値がCTreeCtrl&ってことはCTreeViewでしょうか?

どっちにしろ処理的にはあまり変わりないですけど。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

カスタムドローとか。
なんかアイテム選択の切り替えが重い。改良の余地ありだな。

void CTreeDlg::OnNMCustomDrawTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVCUSTOMDRAW pNMTVCD = reinterpret_cast<LPNMTVCUSTOMDRAW>(pNMCD);
switch( pNMTVCD->nmcd.dwDrawStage )
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
return;

case CDDS_ITEMPREPAINT:
if( pNMTVCD->nmcd.uItemState & CDIS_SELECTED )
{
pNMTVCD->clrTextBk = GetSysColor( COLOR_HIGHLIGHT );
pNMTVCD->clrText = GetSysColor(
COLOR_HIGHLIGHTTEXT );
*pResult = CDRF_NEWFONT;
return;
}

default:
break;
}

*pResult = CDRF_DODEFAULT;

}


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

ちょっと軽くなった

case CDDS_ITEMPREPAINT:
if( GetFocus()->m_hWnd != this->m_Tree1.m_hWnd )
{
if( pNMTVCD->nmcd.uItemState & CDIS_SELECTED )
{
pNMTVCD->clrTextBk = GetSysColor( COLOR_HIGHLIGHT );
pNMTVCD->clrText = GetSysColor(
COLOR_HIGHLIGHTTEXT );

*pResult = CDRF_NEWFONT;
}
}


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> if( GetFocus()->m_hWnd != this->m_Tree1.m_hWnd )

if ( !GetFocus() || ( GetFocus()->m_hWnd != m_Tree1.m_hWnd ) )
とするとダイアログからフォーカスを失っても、選択状態の色になります。
(そのままコピペしたらGetFocus()で落ちる)

# まぁ私の最初のやつは長いしそれも考慮してないですからねw


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>(そのままコピペしたらGetFocus()で落ちる)
まちがえたコメントを書いてしまいました。。。orz

>> if( GetFocus()->m_hWnd != this->m_Tree1.m_hWnd )
のままコピペするとGetFocus()のところで落ちてしまうので、
>if ( !GetFocus() || ( GetFocus()->m_hWnd != m_Tree1.m_hWnd ) )
としたのでした。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

>> if( GetFocus()->m_hWnd != this->m_Tree1.m_hWnd )
> のままコピペするとGetFocus()のところで落ちてしまうので、

む、俺んトコじゃ落ちなかったけどなぁ。
GetFocus()->GetSafeHwnd() だと大丈夫かも?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

落ちるときは、
ダイアログ内にフォーカスがない場合、
つまり最小化や他のウィンドウにフォーカスがある時です。
(GetFocus()がNULLのとき)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました