プロパティシート(ウィザードモード)を作成し
ダイアログにエディットを作っています。
WM_INITDIALOGでエディットに文字列を設定すると
そのエディットの文字列が全選択された状態で表示されます。
選択されていない状態にしたいのですが、
SendDlgItemMessage(hDlg,ID,EM_SETSEL,-1,0);
をやってみてもダメでした。(-1,0でなく0,0でやっても無理でした。)
WM_INITDIALOGでなくWMNOTIFYのPSM_SETACTIVEの時点でやってもダメでした。
WM_INITDIALOGで戻り値をFALSE,TRUEどちらでやってもダメでした。
どの時点でどのように設定すればエディットで全選択されなくなるのでしょうか?
それともこれはこういう仕様なのでしょうか?
よろしくお願いします。
Windows XP VC6.0 SDK
::PostMessage(エディットのHWND, EM_SETSEL, -1, 0);
でいかがでしょうか?
仕様と言えば、仕様です。
実際、ダイアログのリソースにエディットボックスを貼りつけただけの
アプリを起動して、エディットボックスに文字を入力後、
TABキーでフォーカス移動を繰り返して、エディットボックスに
フォーカスが戻ってくると全選択状態になります。
コーディングでその状態を強制的に変えることは可能でしょうが、
私的にはお勧めしません。
デファクトスタンダードだと考えます。(Windows2.x等、大昔はこうはならなかった)
さて、とは言うもののフォーカスが来たら全ての文字が選択されるというのが、
全てのエディットにふさわしいとは言い切れませんですね。
Editはフォーカスを獲得すると親のDLGに対してWM_COMMANDを使って報告してきます。
このときのHIWORD( wParam)がEN_SETFOCUSですね。
当然ですが、動作が定義されている以上、親DLGはこの報告を処理する権利があります。
その中にはEM_SETSELの行使も含まれると考えます。
さて、EM_SETSELですが、Postで動作するとは書いてありません。
SendMessage()を使ってください。
当然ですが、当該のEditからEN_SETFOCUSの報告を受けたタイミングですね。
EDITがWM_GETDLGCODEでDLGC_HASSETSELを返し、
結果、ダイアログが選択する、というのが正しいようです。
根拠 : DLGC_HASSETSELをマスクすると動作は変わる
いろいろ考えた結果、仕様ということなので
このままで行くことにしました。
hiroさん、bunさん、仲澤@失業者さん、ロマさん
どうもありがとうございました。
> コーディングでその状態を強制的に変えることは可能でしょうが、
> 私的にはお勧めしません。
WM_KEYUP/WM_KEYDOWNでエディットボックスで使うすべてのキーに対して
フォーカス/選択範囲の設定等を行なったことがあります。
結構大変でしたね。
顧客の要望は
携帯端末・タッチパネルの様にカーソルキーで自由にエディット
できるようにしてほしい
でしたね。
質問者が解決としているのでいいのですが・・・
> さて、EM_SETSELですが、Postで動作するとは書いてありません。
> SendMessage()を使ってください。
普通に使えますし、私も使っています。
EM_SETSELはPostMessageではないと期待した動作にならない時があります。
http://rodents.googlecode.com/svn-history/r12/trunk/src/main/listview.cpp
の749行目にも、must be Postとのコメントがあります。
Vista、7のExplorerで、ファイル名変更時に拡張子以外を選択しているEditも
PostMessageでEM_SETSELを投げて実現できます。
>EM_SETSELはPostMessageではないと期待した動作にならない時があります。
おおっそうでしたか。
自分はマニュアルにある通りSendMessageでしか使ってませんです。
それで、問題がおきたことありません。
ちなみに、提示のページのEditはListCtrlが所有しているEditですね。
このコードも色々と苦労しているようですね。LVN_BEGINLABELEDIT時は
Editがまだ完全に初期化されていないようなので、できないことが
結構あるようです。それで、PostMessageになっているのかもしれません。
このEdit、あまり手を加えなければそれなりに動くんですけど、
色々と問題を抱えていたので、結局今は外部から供給したEditを使用する
ようにしてますです。当時の苦労が思い出されますねぇ(vv;)。