• ベストアンサー

VC++のwin32アプリ作成におけるボタンの扱い

Visual C++でWin32アプリケーションを作成しています。 作成環境: Windows Vista 64bit (iMac bootcamp) Microsoft Visual C++ 2010 Express フォーム上にbutton1とbutton2がセッティングされている状態で、 button1_Clickの処理を行っている間に、button2が押されたとします。 その作用として、button1_Click内部の変数を変更したいと考えています。 この処理は可能でしょうか。 または、代替処理として、何らかの形で干渉する事は出来ますでしょうか。

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

  • ベストアンサー
回答No.3

>ただ、よりシンプルに記述する方法はないのでしょうか。 #2 のプログラムは、質問に >button1_Click内部の変数を変更したいと考えています。 と書かれていたので、無理やりこのような形にしただけのことです。 #2 のプログラムを private 変数を使用する方法にすると次のようになります。 private: bool loopFlag; System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { loopFlag = false; } // 開始 System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { if( !loopFlag ) { loopFlag = true; while( loopFlag ) { Application::DoEvents(); this->label1->Text = DateTime::Now.ToString(); } this->label1->Text = ""; } } // 停止 System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { loopFlag = false; } System::Void Form1_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) { loopFlag = false; } マルチスレッドについては .NETマルチスレッド・プログラミング入門 第2回 .NETにおけるマルチスレッドの実装方法を総括 http://www.atmarkit.co.jp/fdotnet/mthread/mthread02/mthread02_01.html Windowsフォームで別スレッドからコントロールを操作するには? http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html などを参考にされると良いと思います。

その他の回答 (2)

回答No.2

C++/CLI ということですね? button1_Click の中で Application.DoEvents() を実行してやれば、多少動作はぎこちなくなると思いますが、button1_Click の処理中に button2 をクリックすることが可能となります。 static 変数にすれば、無理やり感はありますが、button2_Click から button1_Click を呼び出して static 変数を変更することは可能です。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { static bool loopFlag = false; if( ((Button^)sender)->Name == "button1" ) { if( !loopFlag ) { loopFlag = true; while( loopFlag ) { Application::DoEvents(); this->label1->Text = DateTime::Now.ToString(); } this->label1->Text = ""; } } else { loopFlag = false; } } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { button1_Click(sender, e ); } private: System::Void Form1_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) { this->button2->PerformClick(); } ただ、static 変数にせず、private などで宣言するのが一般的なやり方ではないかと思います。 ( Application.DoEvents() も使用せず、別スレッドを作成する方がよいような気がします。)

asanosiki
質問者

補足

ご回答ありがとうございます。解りやすいコードでやり方を理解できました。 Application::DoEventsがミソになるんですね。 ただ、よりシンプルに記述する方法はないのでしょうか。 例えば、button1が再生ボタンで、そこに中断ボタン(button2)があったり、 ボリューム調整ボタン(trackBar1)があったりして、 button1_Click中に、複数のイベントが発生する場合があると思います。 別スレッドの作成についてももう少し詳しい説明をいただければ幸いです。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>button1_Clickの処理を行っている間に、button2が押されたとします。 >その作用として、button1_Click内部の変数を変更したいと考えています。 button1_Click()の処理が終わるまで、button2の操作に対する処理(button2_Click())は実行できません。 仮にbutton2_Click()が処理できても「button1_Click内部の変数」はスコープ外でしょうから無理かと。 # 静的変数にしていない限り、寿命は処理が終わるまで…ですしね。 button1_Click()内で、自前でメッセージ処理すれば可能かも知れませんが…いろいろ面倒かと思われます。 「メッセージポンプ」とか「PeekMessage」で検索すると見つかるかと。 MFC固有の処理が実行されるか…はどうなんでしょうかね。 まぁ、現実的にbutton1_Click()で時間のかかる処理でもしていない限り、button2を押すのは無理でしょう。 また、時間のかかる処理をしているならワーカースレッド起こしてそちらで処理するべきです。 同期処理が手間になりますが。(button1が連打されるとか) ワーカースレッドなしで時間のかかる処理をしていると…OSから「(応答なし)」のラベルを貰えるかも知れません。 # button1を押した後、ウィンドウの移動してみるとかAlt+TAB等でアクティブを切り替えるとか。

関連するQ&A

  • Visual C#を用いたボタン押し処理について

    Visual C#を用いたボタン押し処理について Visual C#のWindowsアプリケーションについての質問です。 「ボタンA、ボタンB、ボタンC」ボタンを3つ作ります。 private void button1_Click(object sender, EventArgs e){} このようなソースになるのですが、ボタンAを押したときにボタンB、ボタンCを押した処理を行いたいです。ボタンB、Cを button2_Click(X,Y); button3_Click(X,Y); でロードするのはわかるのですが、XとYには何を入れればいいのでしょうか? 検索した結果、おそらくnullを入れてはいけないのはわかったのですが、何を入れればいいのかがわかりません。 >非静的イベントを発生させるときは、sender パラメーターとして null (Visual Basic の場合は Nothing) を渡さないでください。 よろしくお願いします。

  • VC++ 2008

    VC++2008(Express Edition)であるボタンを押したときの動作についてですが private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { richTextBox1->Text = "測定開始\n"; func(); // ある測定の関数です richTextBox1->Text += "測定終了"; } 上記のようなプログラムが実行されたとき、button1_Click()を抜けるまでテキストボックスに 測定開始 測定終了 の表示がされませんが何故でしょう? func()自体の処理に1分程かかるため、ボタンを押してから1分程経たないとテキストボックスには何も表示されない状態です。 リアルタイムで表示することは可能でしょうか?

  • VC++2010でdllファイルの作成について

    プログラミングを始めたばかりです。 詳しく教えて下さい。 Microsoft Visual C++ 2010 Expressにて コンソールアプリを作ってdllファイルから「Test」とprintfで表示するプログラムを作ろうとしていますが、 ネットで探してもこれだ!と言うものがヒットしません。 どなたかご教授お願いします。 dllの作成方法と、dllの読み込み方法をあわせて教えてください。

  • vc++ グラフ作成

    visual c++ (visual studio)において、等高線グラフを表示させたいです。 等高線グラフの画像イメージを張り付けておきます。 http://www.fastpic.jp/images.php?file=0669754988.gif 3D点(x,y,z)の点(データ)を線で結びつけて、色付けしたものです。 【質問1】 この等高線を作成する手法、手段を教えて下さい。 ちなみに、チャートコントロール(mschar)↓では等高線をサポートしておらず、実現できません。 System::Windows::Forms::DataVisualization::Charting::Chart 【質問2】 Microsoft.Office.Tools.Excel.Char の用途/導入方法を教えて下さい。 Excelグラフでは等高線があり、添付画像もExcelで作成したので、 Excelのアドイン?みたいな物でグラフを作成して、それをFormに張り付ける、 的なことができるのかな、とも思いまして… ググってみたところ、Microsoft.Office.Tools.Excel.Char でグラフを作成できるのかな、 と思いました。 Microsoft.Office.Tools.Excel.Charの使い方というか、 そもそもこいつは何をするためにあるものでしょうか? 望みのことができますか? できるなら、どのように導入(参照設定やら名前空間やらツールボックスやら)できますか? [環境] visual c++ expressです。 visual studio 2012 へのアップグレードを検討中です。 よろしくお願いします。

  • テキストエディタの作成法を教えてください。VC++

    テキストエディタの作成法を教えてください。 Visual C++ (2005,Express)で作れるものをお願いします。MFCで作るサイトは多いのですが、それ以外のサイトがほとんど見当たりません。もし詳しいサイトがあれば教えていただきたいのですが。 Pltform SDK 2003が入っているのでWin32アプリは作れるようになってます。あとWindows Vistaです。

  • アプリを実行すると、作成者を確認できませんが出る

    Visual C++ 2010 expressでアプリを作成しておりますが、実行ファイルを起動すると セキュリティの警告で、Windows7では「このファイルの作成者を確認できません。...」 WindowsXPでは、「発行元を確認できませんでした。」 と、メッセージボックスが出力されます。 これを出さないようにするには、デジタル署名等を付加しないといけないようですが 方法としては、どのような方法があるでしょうか? express版では、だめなのかもしれませんが、、、、、 以上、よろしくお願いいたします。

  • MS VC++ のプロジェクト作成時のエラーについて

    Microsoft Visual C++2008 Eepress Editionを使おうと思いインストールしたのですが,プロジェクトを作成しようとすると 「プロジェクト ’ファイル名’ の作成に失敗しました」となり先に進めません. MSのサイトなどいろいろ調べてみましたが解決できません. 2005 Express Editionも試してみましたが同じエラーが出て先に進めませんでした. 再インストールしてみてもダメで,困っています. どなたかご教授お願いします.ちなみにC++だけでなくC#などでも同じエラーがでました(・ ・;))

  • VC++2010での開発について

    『Microsoft Visual C++ 2010 Express』をインストールして、 Windowsアプリケーションを作成したのですが・・・ 初期作成されたヘッダファイル(Form1.h)にいろいろとコードがかかれていました! 昔(VC6)時代が最後だったので少しびっくりしたのですが、 cppファイルに書いていたような内容がhファイルにあるので?となり質問しました。 質問内容 1..NETになってからは、hファイルにイベントやコンストラクタなどの処理は記述するものなのでしょうか? 2.新規関数を作成する場合はどうするの? 3.VC++ 2010を勉強するにあたって、参考になる『本』『サイト』はありますでしょうか? よろしくお願いいたします。

  • Visual studioで作成したexeファイル

    Visual C# express editionで作成したプログラムをビルドしてexeファイルが出来上がりました。 C#学習のために、パスワードなどを管理するようなプログラムを作成してみたのですが、 exeをメモ帳で開いてビックリ、自分が作成したクラス、メソッド、メンバの名前がバレバレです。 私にはできないのですが、これはリバースエンジニアリングされた場合には、簡単に解読されてしまいますか? 例えばメンバ変数にパスワードをキャッシュしておくPasswordstringなんて変数名があったらすぐにメモリ上から探せたりするでしょうか? よろしくお願いします。

  • 動的に作成したボタンオブジェクトのプロパティ

    以下のようにして動的にボタンオブジェクトを作成しました。 Dim NewButton = New Button NewButton.ID = "NewButton1" NewButton.CommandName = "ComName" NewButton.Text = "NewButton" form1.Controls.Add(NewButton) ここまではいいのですが、このボタンを押したときに処理されるルーチンを指定するための方法がわかりません。 NewButton.onClick = "NewButton_Click" としても、 NewButton.onCommand = "NewButton_Command" としても、「…はProtectedであるため、このコンテキストではアクセスできません」と怒られます。 どうすればいいでしょうか?