MFC(VC++6.0)のダイアログベースでプログラムを製作していますが、
そのテキストにマウスカーソルが乗ったときに処理をさせたいです。
そして、マウスカーソルがテキストから離れたときにも処理をさせたいです。
どういうメッセージが送られてくるのかが知りたいので、
ご存知の方、ご教授お願いします。

わかりやすく言うと、ダイナミックHTMLの
OnMouseOverとOnMouseOutみたいな処理をさせたいのです。

A 回答 (1件)

ダイアログで、メッセージループを作成して、メッセージループないで、『WM_MOUSEMOVE』をサーチして、メッセージループのパラメータで、現在位置が取得出来るので、その現在位置から、コントロールを調べれば出来ます(GetCaptureで、マウスをキャプチャしているMOOを調べる必要もありますね)



 また、どういったメッセージが送られてくるのか調べるだけでしたら、VC++の中のツールでスパイって奴があるので、これでメッセージを調べる事が出来ます。
    • good
    • 0
この回答へのお礼

教えていただいたことを参考にいろいろやってみます。

ありがとうございました。

お礼日時:2001/05/25 23:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMFC・ダイアログベースで、ダイアログの変更内容が反映されない・・・

初めて質問させていただきます。よろしくお願いします。

当方、VisualStdio2005内のC++2005で、
ダイアログベースにてツールを開発していました。

ある日、ダイアログ上に多くのEditコントロールを作成(追加)することになり、
ダイアログリソースをVC内のリソースエディタにて、
テキスト形式でコントロールを追加していきました。

そのときは、テキストでの変更内容がダイアログにも反映されていたのですが、
その後はダイアログにツールボックスでのコントロールの追加やサイズ変更など、
見た目には反映されてもビルド後に反映されなくなってしまいました。

クリーン後のリビルドでも、問題は解決しません。

原因と対策をご存知の方、いらっしゃいましたらご教授いただけませんでしょうか。

よろしくお願いします。

Aベストアンサー

VC2005は初心者です。VC6.0は仕事で使っていました。

私はダイアログリソースをテキスト形式でコントロールを追加したことがないので、基本的にご期待に添える回答ではないと思いますが、ご参考までに。

回答する前に質問ですが、もっと詳しい問題の状況、状態を教えていただけませんか?「ビルド後に反映」とは?実行までおこなっていない、ということですか?

以下、回答です。

ダイアログリソースとダイアログのウィンドウの関連付けは正しいですか?ダイアログIDが間違って指定されていませんか?変更対象のダイアログとビルド後の実行したダイアログが違っているなんてことがあったりします。

上記のような間違いがなければ、Editコントロールを1つだけにしてビルド&実行してみてください。それで問題があれば、Editコントロールの書き方に問題があるかも?(いや、その場合はコンパイルでエラーになるはずだけど)。問題がなければ、Editコントロールを1つずつ増やしてビルド&実行する。ある程度増やしたら、思い切って半分くらい増やしてみたりしてもいいと思います。

VC2005は初心者です。VC6.0は仕事で使っていました。

私はダイアログリソースをテキスト形式でコントロールを追加したことがないので、基本的にご期待に添える回答ではないと思いますが、ご参考までに。

回答する前に質問ですが、もっと詳しい問題の状況、状態を教えていただけませんか?「ビルド後に反映」とは?実行までおこなっていない、ということですか?

以下、回答です。

ダイアログリソースとダイアログのウィンドウの関連付けは正しいですか?ダイアログIDが間違って指定されていませんか?...続きを読む

Qダイアログベースでの様々なフォントのスタティックテキストの貼り付け

お世話になります。
現在MFCのダイアログベースアプリケーションを作成しており、ダイアログ上に大小さまざまフォントのスタティックテキストを貼り付けています。
さまざまフォントがあるということは、それだけスタティックテキストに割り当てるCFontも多数作らなければならないと思います。

そこで質問なのですが、
この大小さまざまな(約5種類ほど)のフォントのスタティックテキストを、複数のダイアログで貼り付けようと思っているのですが、その際にダイアログ毎にメンバ変数としてCFontを5種類定義するのと、5種類のサイズ用のCStaticのクラスを作成し、それらを複数のダイアログに貼り付けるのとどちらがよいでしょうか?

クラスをむやみに増やすのもプログラムが見づらくなる気もしますし、ダイアログ毎にその都度CFontをCreateFontするのも面倒かなと思い、質問させて頂きました。

ご意見をよろしくお願い致します。

Aベストアンサー

>しかしCPaint()内でCreateFontをして、CPaint()の最後にリソースの確保をしたCFontをDeleteObjectすると、そのフォントがダイアログに反映されないのではないでしょうか?

フォントがスタティックテキストに反映されるのは「スタティックテキストのCPaint()内で行った描画のみ」です。

なので、ダイアログのCPaint()を書き換えても、何の意味もありません。

つまり、

・スタティックテキストのCPaint()をオーバーライドする
・そのCPaint()内で、CFontをCreateFontする
・スタティックテキストのDCをGetDCする。このDCは親から継承され、フォントや色などのプロパティは「スタティックテキストの親であるダイアログ」に設定されたプロパティと同じになっている筈
・得たDCに作成したフォントを設定する
・フォントを変えたDCに対してCDC::DrawTextExで文字列を描画する←ここで行った「DCに対する描画」のみがダイアログに反映される。他の場所で描画しても、ウィンドゥが再描画された瞬間に消えてしまう。
・GetDCしたDCをReleaseDCする←同時に使用できるDC数は非常に少ないので、これを忘れるとあっという間に破綻する
・CFontをDeleteObjectする

と言う事です。

ダイアログベースでなくフォームデザイナを使ってアプリを書く場合、フォームデザイナでフォームにスタティックテキストを貼り付ける際に、Fontプロパティを「好みのフォント」にしておけば済むので、上記のような「面倒な事」は一切必要ありません。

スタティックテキストのCPaint()をオーバーライドしなかった場合、以下のようなデフォルトの描画処理が行われます。

・スタティックテキストのDCがGetDCされる。このDCは親から継承され、フォントや色などのプロパティは「スタティックテキストの親であるダイアログ」に設定されたプロパティと同じになっている筈
・そのDCに対してCDC::DrawTextExで文字列が描画される。つまり、スタティックテキストの親であるダイアログと同じフォントで描画される
・GetDCしたDCをReleaseDCされる

要は「CPaint()の中で描画した事がすべて」です。「そこでやったことだけ」がウィンドゥに反映され、「そこでやらなかったこと」はウィンドゥに反映されません。

CDC::DrawTextExでなく、CDC:FillRectやCDC::Polylineをやったって構いません。ともかく「そこでやった描画がすべて」です。

逆にいうと「CPaint()を乗っ取ったら、他の場所で何やっても無駄」って事で、フォントを削除しても描画には何の影響も出ません。

>しかしCPaint()内でCreateFontをして、CPaint()の最後にリソースの確保をしたCFontをDeleteObjectすると、そのフォントがダイアログに反映されないのではないでしょうか?

フォントがスタティックテキストに反映されるのは「スタティックテキストのCPaint()内で行った描画のみ」です。

なので、ダイアログのCPaint()を書き換えても、何の意味もありません。

つまり、

・スタティックテキストのCPaint()をオーバーライドする
・そのCPaint()内で、CFontをCreateFontする
・スタティックテキストのD...続きを読む

Qマウスムーブでのマウスカーソル表示・非表示

いつもお世話になっております。
VS2005でC++を利用してWindowsアプリケーション作成を行っています。

マウスカーソルが一定時間動かなかったらマウスカーソルを非表示、
マウスカーソルが移動したらマウスカーソルを表示させる

このようなプログラムを作成したいと考えています。
今、ShowCursorでマウスカーソルの表示・非表示はできたのですが、
「マウスムーブが一定時間無かった場合」というのは
どのように調べたらよいのでしょうか。

ご教授お願いいたします。

Aベストアンサー

>あと3秒をチェックするのにif文を使っているため ==3 としていたのですが、それではできないのでしょうか。
きっちり動けば良いですが例えばイベント動作が遅れて
Timer関数走ったときの求めた時間秒数が
2・4のように変化していたら ==3 のチェックでは引っかかりませんよね
>=3でチェックすれば4でも引っかかりますよね
ということです

> =3 だとエラーが出てデバッグできません。
> を引用と見間違えられたかな? 比較式としての >= です
(今見たら確かに間違えそうだ)

#2さんへの補足についても一つ
>エラーはでずにデバッグできるのですがマウスカーソルの表示非表示はなりませんでした。
ShowCursor時間数の御理解がいまひとつのようです
TRUE・FALSEのパラメータでで一回呼べば表示・非表示になるという関数ではないのです
(前書いたURLの説明を再度お読みください)

内部にマウス表示のカウンターを持っていてそのカウント値が
負数だったとき初めて非表示0以上で表示と切り替わります
ですのでちゃんと動作させるためには関数の戻り値をチェックして
必要な回数分ShowCursor関数をコールし続けなければなりません
whie(ShowCursor(TRUE) >= 0 );
whie(ShowCursor(FALSE) < 0 );  のように

書いているコードではShowCursor(TRUE)は数回呼ばれる
可能性があるのにShowCursor(FALSE)は
一定時間経過後1回しか呼ばれません
その為非表示にならないのです

> CXX0017: エラーです: シンボル "ShowCursor" が見つかりません
これについてはどのような状況で出ているのか分からないので
なんともいえません

>あと3秒をチェックするのにif文を使っているため ==3 としていたのですが、それではできないのでしょうか。
きっちり動けば良いですが例えばイベント動作が遅れて
Timer関数走ったときの求めた時間秒数が
2・4のように変化していたら ==3 のチェックでは引っかかりませんよね
>=3でチェックすれば4でも引っかかりますよね
ということです

> =3 だとエラーが出てデバッグできません。
> を引用と見間違えられたかな? 比較式としての >= です
(今見たら確かに間違えそうだ)

#2さん...続きを読む

QVC++のMFCでエラーが出ます

MFCを使って、本を見ながらMDIアプリケーションを作ったのですが、実行してみるとカーソルがツールバーのところへ来ると「ハンドルされていない例外です」というエラーが出ます。このエラーは最初に実行したときには起こらないのですが、2回目以降の実行で起こり、また、MFCで作った他のアプリケーションでもこのエラーが起こるようになります。
 オンラインヘルプを見て、サービスパックをインストールしたのですが直りません。VC++も再インストールしました。これはWindowsを再インストールするべきなのでしょうか?どなたか、私と同じ状況になられた方いらっしゃいますか?是非とも教えていただきたいです。「3週間マスター」どころじゃないです。お願いします。

Aベストアンサー

補足から...

 デバッグが、出来ますし、修正も可能です。

 また根性があるのなら...MFCをラッピングした独自クラスの作成も可能です。

 また、環境の責任かどうかを調べる為に、releaseで作成したアプリケーションを、別のパソコンで動作させてみてはどうでしょうか?
 それで問題なければ、開発環境が変になっている可能性が高いですので、OSの再セットアップから行った方が気分が良いと思います。

Qwaitせずにキー入力があった場合のみ処理をさせたい(C言語)

getch()だと、そこでいったん待機状態になりますが、何もキー入力が無かった場合通常通り処理が続行され、もしキー入力があった場合のみ、何か処理をさせたいって時はどうすればいいでしょうか?

ちなみにヘッダーファイルが見つからなくて、kbhit()が使えませんでした。

Aベストアンサー

select()でstdinを監視すれば可能だと思います。
select()のマニュアル(man select)にサンプルがあるので試してみてください。


人気Q&Aランキング

おすすめ情報