• ベストアンサー

STATICコントロール

質問があります。 CreateWindowで作ったSTATICコントロールなのですが サブクラス化をして処理をしようと思っていたのですがWM_LBUTTONDOWN、その他マウスイベントメッセージが返ってきません。 これは仕様なのでしょうか? 環境はBorlandです。

質問者が選んだベストアンサー

  • ベストアンサー
  • davidfox
  • ベストアンサー率58% (21/36)
回答No.2

補足に書かれてあるSTN_CLICKED/STN_DBLCLKの話ですが、これはWM_COMMANDで親ウィンドウへ返されるものですね。 ですのでサブクラス化したSTATICには送られないですよ。 希望のメッセージをキャッチ出来たのなら放っておいて良いと思いますが。

参考URL:
http://www.nitoyon.com/vc/reference/gui/static.htm
Missing0001
質問者

お礼

そうだったのですか? だから返ってこなかったんですね 回答、ありがとうございます。

その他の回答 (1)

回答No.1

こんにちは。Borlandの環境は使ったことがないですが Staticコントロールのオーナーに対して 欲しいイベントが通知されていませんか? また、該当部分のコードが示されれば 経験者の方からコメントがもらえるかもしれません。

Missing0001
質問者

補足

当該部分というより試した結果を載せます CreateWindow( "STATIC", "", WS_BORDER | WS_CHILD | WS_VISIBLE, 100,100,100,100,hWnd,NULL,NULL,NULL); という風にSTATICウィンドウを作りました。 それだと質問したときと同じくWM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONDBLCLKなどは来ませんでした。 そのあと、 ttp://yokohama.cool.ne.jp/chokuto/urawaza/prm/ctl_style.html のサイトでSS_NOTIFYを指定すると「STN_CLICKED or STN_DBLCLK通知メッセージが送られる」とあるのでWM_LBUTTONDOWNももしかしたら・・・ と思ってしてみたら WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBLCLK、WM_RBUTTONDOWN、WM_RBUTTONUP、WM_RBUTTONDBLCLK: 、WM_MOUSEMOVE、32、33、123 が返ってくるようになりました。 けれどSTN_CLICKED or STN_DBLCLKが返ってきません。 書いていることと結果が違うのがよくわかりません。 私としましては WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVEさえ返ってくればいいのでほっといてもいいのですけど なぜ返ってこないのか気になります。 よろしくお願いします。

関連するQ&A

  • staticコントロール

    CreateWindow( "static", // スタティックコントロールのクラス名 "text is here.", // 表示する文字列 SS_SIMPLE | WS_CHILD | WS_VISIBLE, // 詳細はあとで。 x, y, // 左上の座標 iWidth, iHeight, // 幅と高さ hParent, // 親ウインドウのウインドウハンドル NULL, // メニューハンドル。NULLでよい。 hInstance, // アプリケーションのインスタンスハンドル。 NULL // ウインドウ作成データ。NULLでよい ) ; のメッセージを処理したいのですが既成のwindowなのでどのようにウィンドウ処理関数を指定すればいいのかわかりません。 自分で登録した場合にはウィンドウ処理関数を指定できますが既成の場合どうするのでしょうか。

  • CreateWindowでSTATICコントロールを使ってBITMAP表示する。

    WIN32、VC++2005にて開発中です。 CreateWindowでSTATICコントロールを使ってBITMAPを表示する方法が分からなくて困ってます。 ウィンドウプロシージャのWM_CREATEで、 下記の様に書いてみたんですがダメでした。 CreateWindowW(L"Static", L"***", WS_VISIBLE|WS_CHILD|SS_BITMAP,120, 3, 100, 45, hWnd, HMENU(-1), NULL, NULL); ビットマップはIDB_BITMAP1という名前で追加してリソースビューで確認しました。 CreateWindowで表示させたいんですがいい方法ありますか? 初心者でアホなんでなるべく解り易くお願いします。

  • クリック連打ソフトの作り方

    windows APIを使い、実際にマウスを使わずにクリックしたことにできるソフトを作りたいのですが方法がわかりません。 実際にマウスでクリックした場合、WM_LBUTTONDOWN等のメッセージが発生し そのメッセージに対する処理を書けばいいことはわかるのですが、 この場合にはこの方法ではできないように思います。 WM_LBUTTONDOWN等のメッセージを任意に発生させる方法があるのか、 それともまったく別な方法なのか見当もつきません。 どのようにすれば実際にマウスを使わずにクリックしたことにできるのか教えてください。 よろしくお願いします。

  • WM_NCHITTESTの流れ

    マウスの動きをキャッチする ↓ myProc(hWnd, WM_NCHITTEST, なし, 座標)に送られる ↓ myProc内で処理されなく、最後のreturn DefWindowProc(hWnd, WM_NCHITTEST, なし, 座標)が返される ↓ すると戻り値はLRESULT型で、その内容はHTCAPTIONやHTCLIENTである ↓ ここで問題、このHTなんとかという戻り値って、次はどこにもってかれて、どういう処理をされてWM_LBUTTONDOWNとかのメッセージになるんですか? HTなんとかの戻り値には、座標が含まれていないのに、どうやってWM_LBUTTONDOWNと座標とのメッセージに繋げられるんでしょう。

  • VC++ のマウス入力

    visual c++のAPIでアクションゲームをつくっていてアクションはWM_TIMERに50ミリ秒に設定しておいています。マウスも使いたいのでWM_LBUTTONDOWNで左クリックが押されたフラグを立てるようにしたのですが効かない時があります。 WM_TIMERの処理の最後にフラグをfalseにするようにしています。 WM_LBUTTONDOWNの代わりにWM_TIMERでGetKeyStateでフラグをたてるとちゃんと動きます。 どうすればマウスがちゃんと効くようにできますか? よろしくお願いします。 

  • マウスでの押しっぱなし排除処理

    マウスでボタンをクリックしたときに、押しっ放しを排除する処理が出来ずに困っています。 いちおう、WM_LBUTTONDOWNメッセージが来た時に、 if(!m_isKeepLeft){  m_isMouseLeft = true; } m_isKeepLeft = true; WM_LBUTTONDOWN以外のメッセージが来た時には、 m_isKeepLeft = false; m_isMouseLeft = false; として、 m_isMouseLeftが押しっ放しの時はfalseになるはずなのですが、trueになってしまいます。 どうしたらよいのでしょうか。 ちなみに、WM_LBUTTONUPの時に、m_isMouseLeftをtrueにしても上手くいきません。

  • プログラムを組んでいる途中、行き詰ってしまったので質問させていただきま

    プログラムを組んでいる途中、行き詰ってしまったので質問させていただきます。 ボタンを左クリックしたらコモンダイアログを表示し、ファイル名を取得するものを作っていたのですが、ファイルを選択した後ボタンが押したままになってしまいます。 ボタンはサブクラス化をしてあります。(サブクラス化しないと上手くいっているため、原因はここだと思います。) 画面が切り替わると判断できるものがあれば、その中でボタンを離したことにすれば良いと考えたのですが、判断できるウィンドウメッセージが分かりません。 サブクラス化したボタンプロシージャの中身の一部 switch(Msg){  case WM_LBUTTONDOWN:   SendMessage(親ウィンドウのハンドル,Msg,wParam,lParam);  case /*ここに切り替わりを判断できるメッセージ*/:   SendMessage(親ウィンドウのハンドル,WM_LBUTTONUP,(省略),(省略));   break; ※とりあえず左クリックのみ対応と言うことでWM_LBUTTONUPになっています。 分かる方いましたら、お願いします。 環境:Windows 言語:C++(WinAPI使用)

  • PeekMessage

    キューにあるメッセージを調べて、その結果で 処理を場合分けしようと思っています。  case 123:   //ここでキューにWM_LBUTTONDOWNがあればそれは消さずに   //PM_NOREMOVEでMyFunc()を実行する。   MSG msg;   PeekMessage(&msg, hWndCap, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE);   if(msg.message == WM_LBUTTONDOWN) MyFunc();  break; これであってますか? キューにメッセージが2つ以上溜まっていることもあると思うけど そんな時はPeekMessage()でMSG構造体にメッセージを入れたら どうなるんですか? 2つ以上溜まっている場合、1番有効なメッセージがMSG構造体に 格納されて、その後それがSendMessage()されて、2番有効な メッセージがPeekMessage()でMSG構造体に格納 っていうのを繰り返すんですか?

  • ウィンドウのないActiveXコントロールへのメッセージ通知方法

     内部的にWinsock2を使用して別のサーバアプリケーションと通信を行うActiveXコントロールを作成しています。サーバからのデータ受信を非同期で行うため、WSAAsyncSelect()関数を使用して指定したウィンドウにWinsockからイベントメッセージ(メッセージIDはWM_USER+1を使用)を通知させます。 コントロールをウィンドウなしのアクティベーション使用で開発しているので、WSAAsyncSelect()のメッセージ通知対象ウィンドウがコントロール内にありません。 コンテナによりコントロール充てにメッセージを送ってくれるということなので、コンテナのウィンドウハンドルを取得し、WSAAsyncSelect()のメッセージ通知対象ウィンドウに設定しました。が、コントロールのOnMessageWindowless()にWM_USER+1のイベントは来ていないようです。 私が試したウィンドウハンドルは、次のコードで取得できるものです。 1. AfxGetMainWnd()->m_hWnd 2. CWnd::GetActiveWindow()->m_hWnd (CWndは使用するなとありましたが)  取得するウィンドウハンドルが間違っているのでしょうか?それとも、コンテナアプリケーションはWM_USERメッセージをコントロールに送ることができないのでしょうか?もしくは、コンテナにWM_USER+1のメッセージはコントロールへ、という設定をしてやる必要があるのでしょうか?  なお、なぜウィンドウありのコントロールにしないかと申しますと、ウィンドウありだとコンテナ(IEを想定)に乗った直後にウィンドウが生成されず、自分のウィンドウハンドルを取得しようとするとNULLが返ってしまうからです。ユーザがマウスで一度クリックすればOKなのですが・・・オブジェクト生成時に自動的にウィンドウを生成する方法がわかりませんでした。もしこちらが分かればウィンドウありで行くこともできますので、分かる方いらっしゃいましたらお願いいたします。

  • マウスの左クリックの内容を知りたい

    いつもお世話になっております。 WinXP,SDKです。 WM_LBUTTONDOWN時に、別なウィンドウへ移動メッセージを出しています。 SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); ただ、受け取り側のウィンドウでは WM_EXITSIZEMOVE時にのみ処理を行っています。 マウスを左クリックし、押したままの状態で移動した時はWM_EXITSIZEMOVEが有効ですが、マウスを左クリックしてすぐに離した時はWM_EXITSIZEMOVEメッセージは来ない為に結果がおかしくなります。 左クリック後にすぐに離した時は SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); このメッセージは送らないようにしたいのですが、どのようなタイミングでどうチェックすれば良いでしょうか? ウィンドウの移動をさせたいので、どうしても左クリックと同時に移動メッセージは出したいのです。 でも、まったく移動されずにマウスを離された時に困ります。 WM_MOSEMOVE時にMK_LBUTTONをチェックして処理をしてみましたが結果は一緒でした。 移動開始の左クリックなのか、シングルクリックなのかが分かればいいような気がするのですが、それもどのように知ることが出来るか分かりません。 アドバイスをお願い致します。

専門家に質問してみよう