プロパティシートでエディットの内容が全選択される – プログラミング – Home

プロパティシートでエディットの内容が全...
 
通知
すべてクリア

[解決済] プロパティシートでエディットの内容が全選択される


daigo
 daigo
(@daigo)
ゲスト
結合: 13年前
投稿: 3
Topic starter  

プロパティシート(ウィザードモード)を作成し
ダイアログにエディットを作っています。
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


引用未解決
トピックタグ
hiro
 hiro
(@hiro)
ゲスト
結合: 23年前
投稿: 40
 

::PostMessage(エディットのHWND, EM_SETSEL, -1, 0);
でいかがでしょうか?


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

仕様と言えば、仕様です。

実際、ダイアログのリソースにエディットボックスを貼りつけただけの
アプリを起動して、エディットボックスに文字を入力後、
TABキーでフォーカス移動を繰り返して、エディットボックスに
フォーカスが戻ってくると全選択状態になります。

コーディングでその状態を強制的に変えることは可能でしょうが、
私的にはお勧めしません。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

デファクトスタンダードだと考えます。(Windows2.x等、大昔はこうはならなかった)
さて、とは言うもののフォーカスが来たら全ての文字が選択されるというのが、
全てのエディットにふさわしいとは言い切れませんですね。

Editはフォーカスを獲得すると親のDLGに対してWM_COMMANDを使って報告してきます。
このときのHIWORD( wParam)がEN_SETFOCUSですね。
当然ですが、動作が定義されている以上、親DLGはこの報告を処理する権利があります。
その中にはEM_SETSELの行使も含まれると考えます。

さて、EM_SETSELですが、Postで動作するとは書いてありません。
SendMessage()を使ってください。
当然ですが、当該のEditからEN_SETFOCUSの報告を受けたタイミングですね。


返信引用
ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

EDITがWM_GETDLGCODEでDLGC_HASSETSELを返し、
結果、ダイアログが選択する、というのが正しいようです。

根拠 : DLGC_HASSETSELをマスクすると動作は変わる


返信引用
daigo
 daigo
(@daigo)
ゲスト
結合: 13年前
投稿: 3
Topic starter  

いろいろ考えた結果、仕様ということなので
このままで行くことにしました。
hiroさん、bunさん、仲澤@失業者さん、ロマさん
どうもありがとうございました。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> コーディングでその状態を強制的に変えることは可能でしょうが、
> 私的にはお勧めしません。
WM_KEYUP/WM_KEYDOWNでエディットボックスで使うすべてのキーに対して
フォーカス/選択範囲の設定等を行なったことがあります。
結構大変でしたね。
顧客の要望は
  携帯端末・タッチパネルの様にカーソルキーで自由にエディット
 できるようにしてほしい
でしたね。


返信引用
hiro
 hiro
(@hiro)
ゲスト
結合: 23年前
投稿: 40
 

質問者が解決としているのでいいのですが・・・

> さて、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を投げて実現できます。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

>EM_SETSELはPostMessageではないと期待した動作にならない時があります。

おおっそうでしたか。
自分はマニュアルにある通りSendMessageでしか使ってませんです。
それで、問題がおきたことありません。

ちなみに、提示のページのEditはListCtrlが所有しているEditですね。
このコードも色々と苦労しているようですね。LVN_BEGINLABELEDIT時は
Editがまだ完全に初期化されていないようなので、できないことが
結構あるようです。それで、PostMessageになっているのかもしれません。
このEdit、あまり手を加えなければそれなりに動くんですけど、
色々と問題を抱えていたので、結局今は外部から供給したEditを使用する
ようにしてますです。当時の苦労が思い出されますねぇ(vv;)。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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