自分用のプログラムをいろいろ書いてるのなかで、気がついたことを記しています。
スレッドの生成が必要となってきたので勉強。ワーカスレッド/ユーザインタフェーススレッド両方必要そうだ。で、取り敢えず、ワーカスレッドから作成。
スレッドの生成は、
AfxBeginThread( 制御関数へのポインタ,制御関数へ渡すパラメータ);
で生成できるのだが、制御関数はスタティックでないとだめらしい(記述を見つけられなかったが)。 で、スタティックな関数では、メンバ変数/関数へのアクセスができないので、制御関数へ渡すパラメータに呼び出した側のthisポインタを渡してやる。こんな感じ。
CxxxView { static UINT ThreadFunc( LPVOID ); : AfxBeginThread( ThreadFunc, this ); } CxxView::ThreadFunc( LPVOID this ) { ((CxxView *)this)->m_value; : return 0; }
とりあえず、MSCOMM32を使用したRS-232Cの割り込みの処理はできるようになった。サンプルをここに置いておく。必要な方がもしいれば取っていってください。連絡不要で使用してもかまいませんが、役にたったら教えてね。
説明もなにもないですが、簡単に言うと、ダイアログベースのMFCアプリで、ポートを監視し、RINGをポートから受信すると(電話がかかって来ると)メッセージボックスを出すというものです。また、ON_COMMAND_UPDATE_UIを使用して、メニューの動的書き換えもやってます。
VidulalC++でフルスクリーンのサイズの取得って、昔、簡単にできた記憶があるけど、気のせいか?。ボケボケ。
取り敢えず、以下のようにすれば取得できることは確認。
HDC hdc; hdc = CreateDC("DISPLAY",NULL,NULL,NULL); int width = GetDeviceCaps(hdc,HORZRES); int height = GetDeviceCaps(hdc,VERTRES);
CreateDCに"DISPLAY"とするとディスプレイのデバイスコンテキストがとれるようだ。 CreateDCは、MFCのCDCクラスメンバの方ではASSERTエラーとなってしまいます。
上のコードをCMainFrameのPreCreateWindowに突っ込んでおくと、ディスプレイサイズ に応じたウインドウを作成することができます。
SDIプログラムでキャプションにドキュメント名を表示しない方法。 フレームウインドウスタイルのFWS_ADDTOTITLEのビットを立てないことで、 ドキュメントウインドウの"無題"を表示しないようにできる。これも、CMainFrameのPreCreateWindowに突っ込んでおくのが良い。
フルスクリーンのサイズの取得は、気のせいではなかった。
int x = ::GetSystemMetrics(SM_CXSCREEN); int y = ::GetSystemMetrics(SM_CYSCREEN);
で、スクリーンサイズは取得できるのであった。MSDNでもAPI系をインストールしていないから、このあたりはネットで探さざるをえない。ディスク見当たらないし。
測定のプログラムは、24時間以上運用したかったのだが、9時間でアプリケーションエラーが出ていた。まあ、24時間動かないだろうとは思ったが、意外ともったかな。
しかし、VC++とMFCのプログラミングは情報が命だねぇ。どこでどんなメッセージが発行されるか理解していないと全然書けません。
まだ、Win32APIで作れば自分の管理下にあるんで何とかなりそうな気もするが、コーディングが大変そうだし(人のを見ると結構簡単に書いてるけど)。
どの順番で関数が呼ばれるか分かりずらい。とりあえずFrameViewでボタンの再描画(位置変更)には、OnCreate()やPreCreate()ではなく、OnInitalUpdate()で行わなければいけないようである。
まだ、張りつけたBitMapとデバイスコンテキストの関係がいま一つ分からない。pDCで領域上書きしてしまえば良いのだろうか?
で、結局、SDIのOnCreateで作成する方法に戻す。Dialogではポートをアクセスしようとすると保護違反で落っこちるから。理由は想像がつくけど、対処方法でスマートなやり方が分からないので、どうせ美しくないコーディングなら、SDIでやった方が便利がいい。 OnCommのメッセージ処理ができないけど、ポーリングで動いているようなので、やっつけとしてはまぁいいか。
しかし、C++は、メモリ管理がシステム任せになってしまうので不安。ガーベージコレクションの動作にイマイチ信用がおけないせいだけど。 確かにマルチスレッドのメモリ管理を自分でやるのは大変だからいたしかたないところではあるが。
Active X コントロールは、実質 Dialog からしか使用ができないようで?、Dialogに張りつけたらプロバティおよびメッセージを、リソースエディタで参照できるようになった。
ただ、Dialogに張りつけると、プログラム上からプロバティの変更ができないのはなぜ?。ASSERTマクロがエラーを返してしまう。
シリアルポートの解説をInternetであさって、やっと MSDEVのCOMM98.CHMにあることを発見。 とりあえず、送受信はできるのだが、エラーに対しての対応ができない。 インターネットであさってもVBからの使い方は結構出ているんだけど。
シリアルポート制御のPROGRAMを会社で組んでいるのだが、MSCOMM32.OCXの解説がどこにもなくて困ってしまう。
いろいろ試して送信までは行くようになったのだが、受信が全くできない。VC++のCDにもインターネットにも情報がなくてお手上げ。