プロジェクト新規作成でwin32→win32コンソール→windowsアプリケーション
として作成したものに、追加→UI→windowsフォームを追加したのですが、
このフォームの表示の仕方とフォーム上にあるdatagridviewとのデーターの
やり取りの仕方がわかりません。
どのようにすればいいのでしょうか?
とりあえず、ちゃんとコンパイルできていますか?
コンパイルオプションを変えないとコンパイルできないと思いますが。
それと、普通はWin32プロジェクトで Windows フォームを使うことはありません。
(それを理解して利用しなければなりません。
その際、マネージド<->アンマネージドの変換がやたら走ります。)
>コンパイルできていますか?
>コンパイルオプションを変えないと
コンパイルできています。
プロジェクトの設定で共通言語ランタイム サポート (/clr)にしています。
>それと、普通はWin32プロジェクトで Windows フォームを使うことはありません。
CLRというのを選べばよかったんでしょうか?
こっちで作りたかったのですがwin32APIのDDE通信のDdeInitialize等の
の書き方がわからなかったので断念しました。現在の状態で通信したデータを
蓄積してファイルに書き出すことは出来るのですがリアルタイムでデータを
見たいと考えdatagridviewを使いたいのです。
ちなみに、表示だけならば、普通の「Windowsフォームアプリケーション」
のプロジェクトと同じで、
Form1 f;
f.ShowDialog();
でできるはずです。
>CLRというのを選べばよかったんでしょうか?
そうですね。
CLRプロジェクトからでも、Win32APIは利用できますし。(リンクを通せば普通に使える(構成プロパティ→リンカ→入力「親またはプロジェクトの規定値から継承にチェック」))
また、おそらく.NET Frameworkにも
>DDE通信のDdeInitialize等
の記述方法はあるんじゃないでしょうか。
(C++/CLIに絞り込まずに、C#のプログラムやVB.NETのプログラムを参考にされるよいです)
あと、逆に
>datagridview
を使わないで、ダイアログ&リストビューとかを使えばいいのではないでしょうか。
ただ、Express Editonの場合リソースエディタが使えないので不便ですが。
つうか、バージョン等の環境は明示してもらわないと、話が伝わらないかと。
(今までのはすべてVS2005 Express Editionとして話しています。)
ご回答ありがとうございました
CLRプロジェクトで作り直しました。
>ダイアログ&リストビューとかを使えばいいのではないでしょうか。
リストビューもCLRのフォームにしか見当たらないのですが?
>つうか、バージョン等の環境は明示
すみませんVS2005standard edtionです。
新たな質問となってしまうんですがCLRプロジェクトで
int main(array<System::String ^> ^args)
のすぐ後にDdeInitializeその後Application::Run (gcnew Form1());
}//main関数記述終わり
の下にコールバック関数を作成して、そこで得た値をForm1のlabelのtextに設定するにはどうすればいいのでしょうか?
ネットで調べたのですが
Form1^ f = gcnew Form1();
f->label1->Text=(systemstring);
をコールバックに書いたらフォームが次々作成されてしまいます。
>リストビューもCLRのフォームにしか見当たらないのですが?
リソースファイル(〜.rc)をつかうかCreateWindowExでリストビューを作成します。
(リソースビューからダイアログを追加してList Ctrlを配置して、
適切なDlgProcを記述してDialog関数で表示させる。)
参考)
猫でもわかるプログラミング(http://www.kumei.ne.jp/c_lang/)
のSDK編の第1章、第2章
※MFCならば若干APIをラッピングしてくれるため記述コードは少なくなります。
>そこで得た値をForm1のlabelのtextに設定するにはどうすればいいのでしょうか?
よくわからないけど、どのタイミングでその関数は呼ばれますか?
表示する前に関数が動いてその値を設定するのであれば、単純に
Application::Run (gcnew Form1());
を分割すればいいのでは。
Form1^ f = gcnew Form1();
f->label1->Text=(systemstring); // label1はpublicメンバ
Application::Run(f);
てなかんじ。
また、gcnewを使わないで
Form1 f;
f.label1->Text = (systemstring);
Application::Run(%f);
のようにも記述できます。
よく調べてみたら、
http://www.kumei.jp/c_lang/sdk2/sdk_154.htm
なかんじのものをつくりたいのでしょうかね?
そこのコードのように、コールバック関数から更新したいということだったらhParent のように
親のウィンドウハンドルグローバル変数で持つようなつくりになるんでしょうかね?
(CreateThreadやtimeSetEventのように、ウィンドウハンドルを渡すような方法はないような。)
やはり、CLRプロジェクトであれば.NET Frameworkの機能を使うべきなんじゃないでしょうか?
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconnetremotingoverview.asp
私だったら、リストビューを使うためだけにCLRの Formを使うという選択肢は絶対ありえませんけど。
>どのタイミングでその関数は呼ばれますか?
フォームを表示した後も常に呼ばれます。
label1もpublicメンバにしてみましたが、上記の記述だと
コールバック関数内でf->としても候補がでないんです。
フォーム間のデータのやり取りなども参考にしましたができなかったです。
>リソースファイル(〜.rc)をつかうかCreateWindowExでリストビューを作成
できなかったらこっちでやってみようと思います。ありがとうございます
やりたいことって、結局はDDEサーバをつくるということなんですかね?
となると、もうすでに記述済みですが、コールバック関数からローカル変数である
Form1のインスタンスをアクセスすることは不可能です。
(というか、C言語の基本だと思うけど)
で、普通の関数と違って引数で渡すことが出来ないので、グローバル変数として
扱うしかないようです。
Form1をそのままグローバルにおくべきではないと思います。(できるかできないか試していないけど)
ですので、やるのであれば、Form1を作成後、そのウィンドウハンドルをグローバル変数に格納してあげれば
いいと思います。
で値を変更したいとかそのような操作はSendMessage関数を使うことになるでしょう。
(この考え方はMFCでもWin32SDKでも同じやり方になります。)
で、変更の対象が Label の場合、Form1のLoadイベントあたりで、
Labelのウィンドウハンドルを取得することになるでしょう。
(親(Form1)のウィンドウハンドルでも出来ないことはないけど。)
hLabel = static_cast< HWND >( label->Handle.ToPointer() );
(ということなので別ファイルのグローバル変数を扱うためにも記憶クラスの理解が必須になります)
>結局はDDEサーバをつくるということなんですかね?
DDEホットリンククライアントのほうです。
SendMessageについて調べてみます。
>SendMessageについて調べてみます。
なんでDDEを知っていてSendMessageを知らないのかなぞです。
学習する順番をあやまっているのではないでしょうか?
(C言語基礎→Windowsプログラミング基礎→DDEの使い方 と段階を踏まなければまともに作れないとおもう。)
>学習する順番をあやまっているのではないでしょうか?
ご指摘の通りだと思います。C言語だけ本を数冊通読して他は自分が作りたい物の為に拾い読みしている程度です。
フォームにクリックイベントを追加して、そこにデーター更新などしたい処理を書いておくSendMessageでフォームにWM_LBUTTONDOWNとWM_LBUTTONUPを送る
クリックイベントが発生してデーター更新される。
と、したいことが出来るようになりました。メッセージの種類とイベントを変えたほうがいい気がしますがこれで解決いたしました。
本当にありがとうございました。
ツイート | ![]() |