ダブルクリックの検出を止めるには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jacoby

ダブルクリックの検出を止めるには

#1

投稿記事 by jacoby » 9年前

フリーの開発環境BCC Developer(BCC5.5)にて、C++でWin32アプリケーションプログラムを作っています。

メインのウインドウと別に、一つのモードレス・ダイアログを持っているプロジェクトなのですが
そのモードレス・ダイアログ上では「ダブルクリック」の検出を止めたいと思い、
ダイアログ・コールバックプロシージャ内のInitDialogイベントで下のように書きました。

コード:

switch (msg){
   case WM_INITDIALOG:
       SetClassLong(hWnd, GCL_STYLE, GetClassLong(hWnd,GCL_STYLE) ^ CS_DBLCLKS);
("ウインドウクラススタイルからダブルクリックのみを抜く"処理)

 これで確かにダブルクリックは検出されなくなったのですが、
但しここでこう書いてしまうと以降メインのウインドウでもダブルクリックが効かなくなるようなのです。
 この動作を見る限り、モードレスダイアログはメインのウインドウと「ウインドウクラス」を共用(?)しているのでしょうか。
 もしそうならダイアログはダイアログで別にウインドウクラスを作り、それを適用させなければならないのなとも思うのですが、その方法が。。。
(メインのウインドウはCreateWindowEx()で作り、その第二引数で「クラス名」がセット出来たのですが、ダイアログはリソース・エディタ(BCC Form)で作っていてクラスをどのように適用出来るのかがまだ分からず。)


「モードレスウインドウ上のみダブルクリックを検出せず」
「しかしメインウインドウ上では普通通りダブルクリックを検出したい」
このようなことを実装するにはどうすれば良いでしょうか?

アバター
へろりくしょん
記事: 92
登録日時: 10年前
住所: 福岡

Re: ダブルクリックの検出を止めるには

#2

投稿記事 by へろりくしょん » 9年前

ダイアログプロシージャで、WM_LBUTTONDBLCLK を読み捨てるってのは無しですか?

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: ダブルクリックの検出を止めるには

#3

投稿記事 by ISLe » 9年前

メインウィンドウで効かなくなるのですか?
メインウィンドウは自分でRegisterWindowClassしたウィンドウクラスをセットしているのですよね。
そうであればモードレスダイアログとは関係ないはずなんですけどね。

未確認ですが
GetWindowLong(hWnd,GCL_STYLE) & ~CS_DBLCLKS
だとどうなりますか?

ウィンドウクラスは、ウィンドウ共通の動作のひな形なので同じウィンドウクラスを元に作成されたウィンドウは同じ動作になります。
標準ダイアログや標準コントロールのたぐいはウィンドウズが用意したウィンドウクラスから作られるウィンドウです。
自分で作成したウィンドウクラス以外を変更するとシステムにどんな影響が出るか分からないのでやめた方が良いですよ。
メインウィンドウがおかしくなるのはそのせいかもしれません。

jacoby

Re: ダブルクリックの検出を止めるには

#4

投稿記事 by jacoby » 9年前

へろりーな さん、 ISLeさん、返信ありがとうございます。
>GetWindowLong(hWnd,GCL_STYLE) & ~CS_DBLCLKS
>だとどうなりますか?

こちらでも早速やってみたんですが、どうもダブルクリックは除外できないようです。
"CS_DBLCLKS"は"CS_"(クラススタイル)のものらしく、SetWindowLongでセット
出来る"GWL_STYLE"(ウインドウスタイル)、とは異なるもののようです。

>ダイアログプロシージャで、WM_LBUTTONDBLCLK を読み捨てるってのは無しですか?
出来れば、カチカチと早くクリックした時、それを捨てることなくシングルクリック2回と
して拾いたいところなんですが。
ただ現実的にはそうした方が良いのかもしれません。

>自分で作成したウィンドウクラス以外を変更するとシステムにどんな影響が出るか分
>からないのでやめた方が良いですよ。
>メインウィンドウがおかしくなるのはそのせいかもしれません。

そうですね。だとするとこれはやめた方が良いのかもしれません。
メインのウインドウだけなら自分で定義したウインドウクラスを直せばよいだけなので
簡単だったのですか、今回はダイアログだけ変えたいということだったので
かなりつまづいてしまいました。これは手を出さない方がいいですね。

お二方とも、レスありがとうございました。また何かの時には、よろしくお願いします。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: ダブルクリックの検出を止めるには

#5

投稿記事 by ISLe » 9年前

読み捨てるのではなくWM_LBUTTONDBLCLKだったらWM_LBUTTONDOWNに(左ボタンの場合)差し替えてDefDlgProcに投げたらどうなりますかね。

自前のダイアログプロシージャ内の処理だったらWM_LBUTTONDOWNとWM_LBUTTONDBLCLKを区別しなければダブルクリックをシングルクリックとして処理できますよね。
何かダイアログの標準的な挙動を変えたいわけですよね。

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: ダブルクリックの検出を止めるには

#6

投稿記事 by tk-xleader » 9年前

リソーススクリプトでダイアログに自作のウィンドウクラスを適用する方法。
http://wisdom.sakura.ne.jp/system/winap ... win89.html

それで、システム定義のダイアログボックスのウィンドウクラスの情報を複製,取得して、別のウィンドウクラスとして定義しなおすのが次のコード。

コード:

WNDCLASSEX my_dlgclass;
GetClassInfoEX(NULL,WC_DIALOG,&my_dlgclass);
my_dlgclass.style ~= CS_DBLCLKS;
my_dlgclass.hInstance = (HINSTANCE)GetModuleHandle(NULL);
my_dlgclass.lpszClassName = TEXT("WC_MYDIALOG"); //文字列はjacobyさんが自由に設定してください。
RegisterClassEx(&my_dlgclass);
こうしてやれば、たぶん大丈夫だと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る