none
スレッドの入力データの画面表示 RRS feed

  • 質問

  • WM_PAINT処理で描画するのははじめての者のです。

    WinMain()関数で、CreateWindow()をCALLしする。HWNDは外部変数にもつ。
    その後、スレッドを作成する。

    実際の処理はスレッドがメインで、画面は表示用に使います。
    スレッドは複数の名前付きパイプでデータを待機モードでとりこみます。トリガーはイベントフラグ通知です。

    スレッドでは、イベント通知であるパイプからデータを読み込みます。
    イベントの間隔は短くても1sec間隔ぐらいです。

    hDC = GetDC( hWnd );ReleaseDC( hWnd, hDC );の中で描画を行う。
    調べたらこんな方法でできそうなのですが、普通はどのような方法によるのか知りたいです。
    入力データは文字列ではないのですが、データを識別し、画面には起動中とかの文字列を表示します。

    複数の端末から同時にデータが送信されてきた場合には、間隔はもっと短くなる可能性もあります。

    よろしくお願いいたします。

    2009年6月12日 1:48

回答


  • 参考になるかわかりませんが、「起動中」とかの表示だけであればダイアログベースで作成し、スタティックコントロールに表示した方が簡単ではないでしょうか。
    WM_PAINTで描画する必要があるのであれば、BeginPaint() ...   EndPaint()だと思います。
    • 回答としてマーク clematis0401 2009年6月15日 6:49
    2009年6月12日 2:09
  • 単純に状況を次々と書き換える形で表示するのであれば、雅さんが書かれているようにダイアログベースでスタティックコントロールにした方が
    数段簡単です。最初にclematis0401さんが書かれている方法だと他のウインドウが重なったりしたら多分、表示が消えてしまいます。

    ウインドウでの画面描画はOSからの要請でいつでもその時点の画面を再現できるような作りにしておく必要があります。
    この場合、WM_PAINTがその要請に当たりますね。
    このメッセージは他のウインドウが重なっていた部分が見えるようになったとか、スクリーンセーバーから復帰したとか
    そういった場面でも送られてきます。
    ですから、表示を維持する為に必要な情報を常に内部で保持しておく必要があるのです。
    Win32APIでプログラミングする場合の一般的なやり方としては表示に必要な情報をグローバル変数にでも保持できるようにしておいて
    WM_PAINTメッセージを受けた時の処理で描画を行なうようにします。
    そして、言われている表示を変更するタイミングでグローバル変数に表示内容が特定できる情報を設定して
    画面を無効化します。無効化する事でWM_PAINTメッセージが発生して描画部分が動きます。

    他にも方法がありますが、基本的な考え方はこれで良いと思います。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク clematis0401 2009年6月15日 6:49
    2009年6月12日 4:57

すべての返信


  • 参考になるかわかりませんが、「起動中」とかの表示だけであればダイアログベースで作成し、スタティックコントロールに表示した方が簡単ではないでしょうか。
    WM_PAINTで描画する必要があるのであれば、BeginPaint() ...   EndPaint()だと思います。
    • 回答としてマーク clematis0401 2009年6月15日 6:49
    2009年6月12日 2:09
  • ありがとうございます。実は、コンソールしか表示したことがなく、ダイアログベースも作ったことがないのですが、御回答のイメージ(何分、イメージしか思い浮かばなくて)からすると、その方がよいようですね。ちなみに入力は一切ありません。
    2009年6月12日 2:29
  • 単純に状況を次々と書き換える形で表示するのであれば、雅さんが書かれているようにダイアログベースでスタティックコントロールにした方が
    数段簡単です。最初にclematis0401さんが書かれている方法だと他のウインドウが重なったりしたら多分、表示が消えてしまいます。

    ウインドウでの画面描画はOSからの要請でいつでもその時点の画面を再現できるような作りにしておく必要があります。
    この場合、WM_PAINTがその要請に当たりますね。
    このメッセージは他のウインドウが重なっていた部分が見えるようになったとか、スクリーンセーバーから復帰したとか
    そういった場面でも送られてきます。
    ですから、表示を維持する為に必要な情報を常に内部で保持しておく必要があるのです。
    Win32APIでプログラミングする場合の一般的なやり方としては表示に必要な情報をグローバル変数にでも保持できるようにしておいて
    WM_PAINTメッセージを受けた時の処理で描画を行なうようにします。
    そして、言われている表示を変更するタイミングでグローバル変数に表示内容が特定できる情報を設定して
    画面を無効化します。無効化する事でWM_PAINTメッセージが発生して描画部分が動きます。

    他にも方法がありますが、基本的な考え方はこれで良いと思います。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク clematis0401 2009年6月15日 6:49
    2009年6月12日 4:57
  • スレッドとメインのWM_PAIN処理の関連がわからなかったのですが、無効領域を設定することによりWM_PAINメッセージで再描画する仕組みがあることがわかりました。どうもありがとうございました。

    2009年6月15日 6:47
  • スレッドとメインルーチンのWM_PAINT処理との関連がわからなかったのですが、無効領域を設定することにより、強制的にWM_PAINTメッセージの処理を行う仕組みがわかりました。今回はダイアログベースでスタティックコントロールにしたいと思います。ありがとうございました。
    2009年6月15日 6:48