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引数)だけの関数となっており
ます。)
思うにm_Tree.GetEditControl() が常に有効なCEditオブジェクトを
戻しているのではないでしょうか。
「CEditが有効なHWNDを持っているかどうか」を判定してみてはどうでしょう。
これでだめなら「編集中フラグ」を別立てに用意してみてはどうでしょう。
メッセージを処理した訳じゃないので、
> return TRUE;
ではまずいのでは?
return FALSE;
にしてみてはどうでしょう。
こういう解法もある、って事で載せておく。
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200709/07090020.txt
SetWindowLongPtr() が毎回呼ばれたりとそのままではマズいかもしれないコードなので注意
やってる事は、エディットボックスで WM_GETDLGCODE を処理してダイアログにキー入力
を奪われないようにしてるだけ。
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にはない・・・
bunさんの提案であるreturn FALSEを返すやり方と、
rinさんの提案であるSendMessageを行うやり方と、
両方で解決できましたが、
PreTranslateMessageの関数仕様上、return FALSEを返すのが妥当だと考えました。
(TVN_ENDLABELEDITイベントをキャッチする必要があるため)
みなさん、ご提案、ご回答ありがとうございました。