VC++6.0 MFC SDI
基本クラス CFormView
通信を行うクラスを作成し、通信で受信したデータを
画面に表示したいのですが、どうしたら出来るのか悩んでいます。
①表示方法は解ります。データはちゃんと受信しています。
②通信は、断続的に送られてくるデータをマルチスレッドで受信します。
受信する度に、画面(エディットボックス)に表示させたいと思っています。
③RS_232CView.h で、エディットボックスの表示とか行うのですが、
通信を行うクラスで、#include RS_232CView.hとするとエラーに
なってしまい、受信したデータをエディットボックスが使えるRS_232CView
クラスに送る方法がわかりません。
よろしくお願いします。
エラーメッセージがわからないと回答できない。常考(ry
コンパイルエラー?
実行時エラー?
とおりすがりさんありがとうございます。
エラーはコンパイルエラーです。
エラーメッセージは以下の通りです。
RS_232CView.h:
error C2065: 'IDD_RS_232C_FORM' : 定義されていない識別子です。
error C2057: 定数式が必要です。
error C2143: 構文エラー : ';' が '*' の前に必要です。
error C2501: 'CRS_232CDoc' : 識別名を宣言するのに、型が指定されていません。
error C2501: 'GetDocument' : 識別名を宣言するのに、型が指定されていません。
試しに、test.cppと言うファイルを作り、
この2行だけ書いた場合でも同じエラーメッセージがでます。
#include stdafx.h
#include RS_232CView.h
RS_232CView.hは自動生成されたままの状態で、
何も追記していません。
class CRS_232CView : public CFormView
{
protected: // シリアライズ機能のみから作成します。
CRS_232CView();
DECLARE_DYNCREATE(CRS_232CView)
public:
//{{AFX_DATA(CRS_232CView)
enum{ IDD = IDD_RS_232C_FORM };
// メモ: ClassWizard によってこの位置にデータ メンバが追加されます。
//}}AFX_DATA
// アトリビュート
public:
CRS_232CDoc* GetDocument();
RS_232CView.cppの
>#include RS_232CView.h
より上に#includeしているヘッダファイルがありませんか?
>error C2065: 'IDD_RS_232C_FORM' : 定義されていない識別子です。
推測ですが、そのViewは別のプロジェクトからコピーしてきた
クラスだったりしませんか?
その場合は新しいものに合わせてDocumentを取得するならそのようにする
必要がありますし
リソースの*.h *.rc ファイルを手動で修正・追加しなければなりません。
Blueさん、とおりすがりさんありがとうございます。
>RS_232CView.cppの
>>#include RS_232CView.h
>より上に#includeしているヘッダファイルがありませんか?
RS_232CView.cppは自動で生成されたままの状態で、
このように書かれています。
#include stdafx.h
#include RS_232C.h
#include RS_232CDoc.h
#include RS_232CView.h
>error C2065: 'IDD_RS_232C_FORM' : 定義されていない識別子です。
自動生成されたままで、ただこのRS_232CView.hを
自作のファイルでインクルードするとコンパイルエラーになります。
コメントにするとエラー0になります。
やった事は、VC++6.0で、
MFC Appwizard(exe) で、
作成するアプリケーションを、MDI ⇒ SDI に変更。
基本クラスを、CView ⇒ CFormView に変更。
OKしました。
これでダイアログに、IDD_RS_232C_FORM が自動で作られていました。
>#include stdafx.h
>#include RS_232C.h
>
>#include RS_232CDoc.h
>#include RS_232CView.h
より
RS_232CView.h では
・stdafx.h
・RS_232C.h
・RS_232CDoc.h
があるものとして扱われる。
(#include ~.hをファイルに記述されているテキストすべてが展開されている
と考えればすぐわかると思います。)
よって、自作ファイル test.cpp でも
#include stdafx.h
#include RS_232C.h
#include RS_232CDoc.h
#include RS_232CView.h
とすればうまくいくのではないでしょうか?
基本的にスレッドを跨いでウインドウクラスの操作をするのは
Microsoftが公式にしないようにと書いていますので
受信スレッドにViewクラスのヘッダを書く必要は無いような気がします。
ViewクラスのHWNDだけをスレッドに渡すようにして
ユーザー定義メッセージとかでやり取りするようにする方が
良いと思いますよ。
スレッドが直接エディットボックスの更新をするのではなくて
Viewに対して更新を依頼するようにしてエディットボックスの更新は
Viewがやるようにした方が良いと思います。
Blueさんのありがとうございます。
コンパイル通りました!!
とても勉強になりました。
これから表示させる為のコード書いてみます。
とりあえず見通しがたったので、
解決とします。
本当にありがとうございました。
H.H氏の2回目の質問でresource.hをインクルードしてないことが分かるのに
なんでこんなに回りくどい回答を?
「resource.hが足らない。resource.hをインクルードしてるxxx.hをインクルードすれ
ば?」
の一言で済むのに・・・