• 締切済み

C++ライブラリからWPFコントロールの変更方法

お世話になります。 メイン画面をWPF(C#)で作成していまして、WPFからC++の関数を実行しています。 C++はライブラリでCLR経由で読み込んでいます。 そこで質問なのですが、 C++の関数の実行途中に、処理結果によってWPFの画面を変更することは可能でしょうか? C++の関数が終わった時にはいくらでもやり方はあるのですが、あくまで関数の途中でWPFの画面を変更したいです。 キーワード、参考になるサイトでも結構ですのでご教授願います。

みんなの回答

回答No.1

WPF とのことなので,標準的な MVVM 構成を想定して書きます。 ・C++/CLI を利用している場合 Model クラスを変更して,アップデートを ViewModel に通知する。 あとは,ViewModel が変更を View を自動的に変更する。 ・P/Invoke を利用していて関係する Model クラスは C# の場合 コールバックを利用して C# に変更を通知。 コールバックされた C# コードが Model クラスを変更して,アップデートを ViewModel に通知する。 あとは,ViewModel が変更を View を自動的に変更する。 ・P/Invoke を利用していて関係する Model が C++ の場合 (実用に耐える環境か不明ですが) Model を変更して,アップデートを ViewModel に通知する。 あとは,ViewModel が変更を View を自動的に変更する。 # アップデート通知でコールバックを使っていそう。 Model の変更ではなく, Messanger の呼び出しであっても同じ事になると思います。

関連するQ&A

  • WPF C# Focus()と同等の処理

    お世話になります。 よろしくお願いします。 題名通りです C#でのFocus()と同等のWPFの処理をご教授願えませんでしょうか 現在Focusの代わりにCaptureMouse()を使用してますが 思った通りに動いてくれないので、ご教授お願いいたします。 簡単な仕様ですが WPFユーザーコントロール( A )に、WPFユーザーコントロール( B )をAddして A にMouseEnterすると、B にフォーカスを当ててBのイベント処理をするようにしております。 宜しくお願い致します。

  • 〔C#〕WPFのディープコピーをするには?

    オブジェクトのディープコピーは、以下のURLを参考にして作成しました。 http://d.hatena.ne.jp/tekk/20100131/1264913887 WPF(UserControl)で作成したViewに対して上記URLのDeepCopy()関数を実行すると、 実行時に次のエラーが出てしまいます。 「'System.Windows.UserControl'はシリアル化可能として設定されていません。」 調べますと、Sezializable属性を付ければ良いとあるのですが、 該当のWPF(xaml)のcsファイル(XXX.xaml.cs)のクラスの宣言の上に以下のように付けましたが、 変わらずエラーが出てしまいます。 [Serializable] public partical class XXX { ・・・ どのようにしたら、上記のエラーを解決し、Viewのディープコピーができるのでしょうか? とても困っています。 ご教授よろしくお願いいたします。

  • Cランタイムライブラリ

    まだWINDOWSプログラミングを始めて間もない初心者です。 宜しくお願い致します。 マルチスレッドの動作確認をする際に簡単なソースを作る過程で、1つ疑問が浮かびました。 CreateThreadについてMSDNのサイトを見ると、 ”C のランタイムライブラリに記録されている関数を使うスレッドは、CreateThread 関数と ExitThread 関数ではなく、C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。” とあるのですが、この関数はCのランタイムライブラリに属する、この関数はCのランタイムライブラリに属さない、というのは、例えばどこかのサイトを見れば分かるものなのでしょうか? あと、”わずか”、というのがどの程度を指しているのか良く分かりませんが、”わずかなメモリリークが発生”すると、具体的には何が起こるのでしょうか? どなたか分かる方ご教授下さい。

  • あったらいいなと思う、C文字列ライブラリ関数

    みなさんC言語で開発してきた中で、ライブラリとして用意されてたら いいなと思った事のある関数・処理としてどのようなものがありますでしょうか。 特定業務向けの話でなく、汎用的な処理ででも結構です。 例えば、いつも思うのが、なんで文字列A中の文字列Bを、文字列Cに置換する 関数ってなんでないんだろう、などですかね。 (そりゃstrstr、strcatなど既存ライブラリ関数を使いまわせば書けますが...)

  • gprofはprintfのようなCの標準ライブラリ関数で使われたコスト

    gprofはprintfのようなCの標準ライブラリ関数で使われたコストを どのように認識するのでしょうか? 普通にプロファイルしたいプログラムをmakeしても、標準ライブラリの 関数が処理時間・呼ばれた回数の一覧に出てきません。 gprofは次のどちらとして処理しているでしょうか? ・呼ぼうとしてる親関数の処理時間に、標準ライブラリ関数の時間が含まれる。 ・標準ライブラリ関数の処理時間はまるまる抜け落ちる Linux環境(SLES 10)で、gprofを使ってCで書かれたプログラムの チューニングを行えるかチェックしています。 ただし、OSレベルまでいじりたくないので、-pgオプションをつけて ライブラリを再コンパイルするのは考えていません。 以上、よろしくお願いします。

  • C言語からC++の関数をコールする方法について

    初めて質問させて頂きます。 質問は2つあります。 ●1つ目の質問です。 この度、C言語ベースのプログラムに、C++で作成した関数を使用することになりました。 方法としてextern等を駆使しつつ、ラッパー関数を使って対応しております。 そこで質問なのですが、この場合、ラッパー関数に使用するファイル形式はcppまたはcのどちらが正しいのでしょうか?(どちらでも動きました) ●2つ目の質問です。 Windows環境(vs2005)では無事、CからC++の関数を呼ぶことに成功はしました。 しかし、本当に動かしたいのはLinuxでの環境になります。 先程作成したラッパー関数のファイルとC++で作成した関数のファイルをライブラリ(soファイル)化したものを使用し、コンパイルとリンクは問題なく通すことに成功したのですが、 実行させてみると、Cの関数からラッパー関数をコールしているのは確実なのですが、ラッパー関数の処理を通らず、プログラムが止まってしまいます。 試しにラッパー関数の処理を「return 0;」だけにして実行させてみましたが現象は変わらずでした。 そのため、ラッパー関数を呼ぶための何かに問題があると思っています。 ここで質問なのですが、ビルドのときにライブラリをリンクさせるだけでは駄目なのでしょうか。また、他に思い当たることがありましたらご教示頂きたいです。 Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。

  • WPFでCanvas の子要素にアクセスする方法

    C#でWPFに取り組んでいるのですが・・・現在,詰まっています. 事前に List<Canvas> MyList = new List<Canvas>(); Canvas C =new Canvas(); Rectangle R = new Rectangle(); C.Child.Add(R); MyList.Add(C); としておき あとで,MyList経由でCやRの状態を変更したいのですが, この場合だと,「 MyList[i].~ 」でCanvasは操作できるのですが Rectangleはどうやって操作すればよいのでしょうか?? どなたかご存知の方がいらしましたら教えていただけないでしょうか? 宜しくお願いします!!

  • Pro*Cで動的SQLを実現する為のライブラリ関数はどのファイルに入っているのでしょうか?

    こんにちわ。 UNIXのC++でPro*Cを使って動的SQLを使ったプログラムを作っています。 プログラムコードは出来上がっていて、単独コンパイルは通るのですが、 実行形式のプログラムを作る時のリンクで「未定義のシンボル」として 以下の4ライブラリ関数がエラーになります。 sqlald()関数、sqlprc()関数、sqlnul()関数、sqlclu()関数 これはおそらく、リンクする際にこれらの関数が含まれているライブラリを リンクできていないだけなのではないかと思っているのですが、 肝心のライブラリがどこのどれなのかがわかりません。 どなたかご存知の方がいらっしゃいましたら、教えてください。 もしかして、プログラム中でもこれらの関数をextern する以外に 何か必要なのでしょうか?

  • 任意関数最小二乗法のC++フリーライブラリ

    関数オブジェクトとvector<double>のデータ点セット(x,y)を与えたら、 与えた関数オブジェクトの関数に従って最小二乗法を実行してくれるような Linuxで使えるC++のフリーライブラリはないでしょうか。Cでもいいです。

  • OpenCvライブラリを用いて、C++を使い画像処理をしています。

    OpenCvライブラリを用いて、C++を使い画像処理をしています。 私は今、人が映ったら保存するプログラムができています。 そこで、人が映るたび、ファイル名を自動的に変えてフォルダに保存していくプログラムが作れなくて困っています。 どのようにcvSaveImage関数を使えばよいのか教えてください。

専門家に質問してみよう