ツリービューアイテムのテキスト編集について – プログラミング – Home

ツリービューアイテムのテキスト編集につ...
 
通知
すべてクリア

[解決済] ツリービューアイテムのテキスト編集について


まさ
 まさ
(@まさ)
ゲスト
結合: 24年前
投稿: 64
Topic starter  

VS2003にてMFCを利用しているのですが、ツリービューアイテムのテキスト編集について
ご教授願います。

ツリービューアイテムのテキストを直接編集しているのですが、テキストを決定するため
にエンターキーを入力しております。
ダイアログベースなので、エンターキー入力時にダイアログを閉じないため、以下のコー
ドを記述しております。

-------------------------------------------------------------------------
BOOL CSampleDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch( pMsg->wParam )
{
case VK_RETURN:

// m_TreeはDDX_ControlでCTreeCtrlのコントロールをサブクラス化したメンバー
です
if (m_Tree.GetEditControl() != NULL)
{
return TRUE;
}

break;
default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
-------------------------------------------------------------------------

本コードを実行したところ、ダイアログは閉じないのですが、ツリービューアイテムの編
集も完了せず、編集中状態のままとなります。
編集を完了し、編集内容を反映させるためにはどのように行えばよろしいでしょうか?

なお、編集開始と終了時にはTVN_ENDLABELEDITとTVN_BEGINLABELEDITのイベントをキャッ
チしております。
(イベントハンドラ関数中身は、結果として0を返す(第2引数)だけの関数となっており
ます。)


引用未解決
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

思うにm_Tree.GetEditControl() が常に有効なCEditオブジェクトを
戻しているのではないでしょうか。
「CEditが有効なHWNDを持っているかどうか」を判定してみてはどうでしょう。
これでだめなら「編集中フラグ」を別立てに用意してみてはどうでしょう。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

メッセージを処理した訳じゃないので、
> return TRUE;
ではまずいのでは?

return FALSE;
にしてみてはどうでしょう。


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

こういう解法もある、って事で載せておく。

http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200709/07090020.txt
SetWindowLongPtr() が毎回呼ばれたりとそのままではマズいかもしれないコードなので注意

やってる事は、エディットボックスで WM_GETDLGCODE を処理してダイアログにキー入力
を奪われないようにしてるだけ。


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

BOOL CSampleDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch( pMsg->wParam )
{
case VK_RETURN:

if (m_Tree.GetEditControl() != NULL)
{
((CEdit*)m_Tree.GetEditControl())->SendMessage(WM_CLOSE,0,0); // ここ
return TRUE;
}

break;
default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}

こうしたら、終了できました・・・が、
「入力をキャンセルして終わらせる」方法がわからなかった。
CListCtrlなら、CancelEditLabelがあるのに、CTreeCtrlにはない・・・


返信引用
まさ
 まさ
(@まさ)
ゲスト
結合: 24年前
投稿: 64
Topic starter  

bunさんの提案であるreturn FALSEを返すやり方と、
rinさんの提案であるSendMessageを行うやり方と、
両方で解決できましたが、
PreTranslateMessageの関数仕様上、return FALSEを返すのが妥当だと考えました。
(TVN_ENDLABELEDITイベントをキャッチする必要があるため)

みなさん、ご提案、ご回答ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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