• ベストアンサー

VC++.netで、フォーム上のある部分をクリックしたらイベントが発生

VC++.netで、フォーム上のある部分をクリックしたらイベントが発生する プログラムを作りたいのですが、どうもうまく製作できません。 ボタンをつかえば出来るのですが、ボタンは配置したくありません。 フォーム上にイラストを配置する為。 開発環境は、VC++のExpressEditionです。MFCは使えません。 初心者なのですが、よろしくお願いします。

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

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.6

>error C3861: 'rectClickContains': 識別子が見つかりませんでした 誤:if(rectClickContains(e->Location)) 正:if(rectClick.Contains(e->Location)) です。上で宣言しているオブジェクト名が「rectClick」なのに、エラーメッセージで出ているオブジェクト名が「rectClickContains」と出ているわけですから、そこからおかしい場所はすぐ特定できます。 こういったエラーの原因特定方法は、自分でプログラムを組んでゆく上で必要になってきます。 あと、提示されているコードでは、「Windows.h」は必要ないと思うのですが・・・一度その部分をコメントにして試してはいかがでしょう?

bimetal7
質問者

お礼

回答ありがとうございます。 rectClickContainsでなく、rectClick.Containsですね、 . が抜けていました。 おかげさまで、無事プログラム完成しました。 ありがとうございました。 実は、昨日から出来ていて、お礼をしようとしていたのですが、 書き込める所がなく困っていました 返答していただいて、本当によかったです。 どうもありがとうございました。

その他の回答 (5)

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.5

>しかし、if ((e->X < 100) && (e->Y < 100)) は、 >フォーム上のどの位置か指定しなければならないのに >どこにも記述していない? ここで前回の質問の回答が生きてきます。 >if ((e->X < 100) && (e->Y < 100)) System::Drawing::Rectangle rectClick(100, 100, 80, 20); if (rectClick.Contains(e->Location)) こんな感じかな?

bimetal7
質問者

補足

回答ありがとうございます : error C3861: 'rectClickContains': 識別子が見つかりませんでした というエラーが出てしまいました メイン.cppの方に何か書き足さないとダメなのでしょうか? <windows.h>とは、リンクできているのですが メイン.cppソースです #include "stdafx.h" #include <windows.h> #include "Form1.h" #pragma comment(lib, "user32.lib") using namespace aviMouseClick; [STAThreadAttribute] int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; Form1.hのイベントのソースです #pragma endregion private: System::Void Form1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { if (e->Button == System::Windows::Forms::MouseButtons::Left)//左ボタン { System::Drawing::Rectangle rectClick(100, 100, 80, 20); if(rectClickContains(e->Location)) { axWindowsMediaPlayer1->Visible = true; axWindowsMediaPlayer1->Size = System::Drawing::Size(1280, 1024); axWindowsMediaPlayer1->Ctlcontrols->play(); axWindowsMediaPlayer1->settings->setMode("loop",false); } } } private: System::Void axWindowsMediaPlayer1_PlayStateChange(System::Object^ sender, AxWMPLib::_WMPOCXEvents_PlayStateChangeEvent^ e) { if (e->newState == 8){ axWindowsMediaPlayer1->Visible = false; axWindowsMediaPlayer1->Ctlcontrols->stop(); return; } } 自分なりいろいろ試しているのですが・・ 御指導おねがいします

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.4

#2の補足で出ているエラーは、以下のコードを直せば無くなると思います。 >if (e->Button == ::MouseButtons::Left)//左ボタン if (e->Button == System::Windows::Forms::MouseButtons::Left)//左ボタン 個人的には、MouseUpではなくMouseClickで実装したほうがいいと思いますが・・・

bimetal7
質問者

補足

回答ありがとうごさいます。 出来ました。 しかし、if ((e->X < 100) && (e->Y < 100)) は、 フォーム上のどの位置か指定しなければならないのに どこにも記述していない? 今は、フォームの一番左上からになっています 座標を、指定するコードは、やはりイベトの所で記述しなければならないのですか? あと少しで完成なので、本当に申し訳ないですが 御指導おねがいできないでしょうか? よろしくお願いします。 Form.hのイベントのコードです #pragma endregion private: System::Void Form1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { if (e->Button == System::Windows::Forms::MouseButtons::Left)//左ボタン { if ((e->X < 100) && (e->Y < 100)) { axWindowsMediaPlayer1->Visible = true; axWindowsMediaPlayer1->Size = System::Drawing::Size(1280, 1024); axWindowsMediaPlayer1->Ctlcontrols->play(); axWindowsMediaPlayer1->settings->setMode("loop",false); } } } private: System::Void axWindowsMediaPlayer1_PlayStateChange(System::Object^ sender, AxWMPLib::_WMPOCXEvents_PlayStateChangeEvent^ e) { if (e->newState == 8){ axWindowsMediaPlayer1->Visible = false; axWindowsMediaPlayer1->Ctlcontrols->stop(); return; } }

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.3

前回「QNo.5885411」で質問していた内容の実装ができないってことかなぁ? 先の質問で、Rectangleを利用した例を挙げたを思います。あの方法で実行を制御するのではなく、イベントが発生する範囲を限定したいということでしょうか? クリックされた位置を判定するだけなら前回の回答や、#2さんの方法が使えると思いますが・・・

bimetal7
質問者

補足

回答ありがとうございます。 実はビルドエラーで成功しませんでした。 なんとか自分でいろいろ書き足したのですが、 わけがわからないコードになってしまい、修復不可能になってしまいました。 せっかく教えてもらったのに申し訳ありません。 今度は、ちゃんと動作するかどうか確認してから 返答するようにがんばります。

回答No.2

> 出来れば100×100ピクセルぐらいのある範囲だけ指定したいのですが > マウスクリックイベントの記述の方に何か書き足せば良いのでしょうか?  イベントハンドラのパラメータの中にマウスの座標が入っているので、それで判定して特定の範囲の時だけ処理するようにすれば良いだけかと。 private: System::Void Form1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {   if (e->Button == ::MouseButtons::Left) // 左ボタン   {     if ((e->X < 100) && (e->Y < 100))     {       // 処理     }   } }

bimetal7
質問者

補足

すばやい回答ありがとうございます。 ビルドしてみたのですが、エラーが出てしまいました。 自分で解決しようとがんばっていますが、うまくいきません。 どうか、助けてください。 お願いします。 エラーコード error C3083: 'MouseButtons': '::' の左側のシンボルには、型を指定しなければなりません error C2039: 'Left' : '`global namespace'' のメンバではありません。 error C2678: 二項演算子 '==' : 型 'System::Windows::Forms::MouseButtons' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。 'int operator ==(const GUID &,const GUID &)' の可能性があります。 引数リスト '(System::Windows::Forms::MouseButtons, int)' を一致させようとしているとき Form1.hのイベントのソース #pragma endregion private: System::Void Form1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { if (e->Button == ::MouseButtons::Left)//左ボタン { if ((e->X < 100) && (e->Y < 100)) { axWindowsMediaPlayer1->Visible = true; axWindowsMediaPlayer1->Size = System::Drawing::Size(1280, 1024); axWindowsMediaPlayer1->Ctlcontrols->play(); axWindowsMediaPlayer1->settings->setMode("loop",false); } } } メインの.cppのソース #include "stdafx.h" #include <windows.h> #include "Form1.h" #pragma comment(lib, "user32.lib") using namespace aviMouseClick; [STAThreadAttribute] int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; } Form1.hの頭の部分 namespace aviMouseClick { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace WMPLib; using namespace AxWMPLib; /// <summary> /// Form1 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します よろしくお願いします。

回答No.1

 単にコントロール以外のフォーム上で、ボタンダウンかボタンアップのイベントメッセージを拾えば良いだけだと思いますが。  フォームのプロパティウインドウでイベントボタン(雷みたいなアイコン)をクリックし、マウスの項にあるMouseDownなりMouseUpの横の空欄をクリックすると、該当するイベントハンドラが追加されるので、そこに処理を書けば良いだけです。  フォーム上の他のコントロール上でも同じことを行いたければ、それぞれのコントロールに対して同様の操作をします。  MouseDownとMouseUpでは、どっちかというとMouseUpを使うのが行儀が良いかな。マウスを押した後でやめたくなったら、そのままフォームの外にマウスを出してから放せば良いから……(MouseDownだと押した時点で処理が決定されてしまう)

bimetal7
質問者

補足

回答ありがとうございます。 質問の内容が、良くなかったですね、 すみませんでした。 この方法だとフォーム上のどこの場所でもイベントが発生するのですよね 出来れば100×100ピクセルぐらいのある範囲だけ指定したいのですが マウスクリックイベントの記述の方に何か書き足せば良いのでしょうか? 御指導お願いします。

関連するQ&A