スレ立てました
まずダイアログにピクチャーボックスとボタンをつくります。なにかしらファイルを開
いてボタンを押すと画像が出るようにします。
BITMAPINFOHEADERやStretchDIBitsを使うようにして、画像をウインドウを閉じても、ま
た、何か他のウインドウが重なっても消えず、ウインドウ拡大しても消えなくし
たいです。
その場合
bottun1
{
BITMAPINFOHEADER
描画
StretchDIBits
}
をbottun1の部分でまとめて、出来ますか?
できるなら、やり方を教えてください
StretchDIBitsの使いかたが微妙なんで・・
ようするにDIBを保持しておいて、このDIBに描画を行ってからビューにStretchDIBitsで
転送します。
256×256のオブジェクトを作成←そこに描画をする、そして転送するということ
をやりたいです。
いい例を書いてくれるとうれしいです。
SDIベースでクラスビューにbottun1をくわえました
OnPaintをメンバ関数に加えればいいだけだと思います。
ちなみに、OnPaintとはウィンドウの再描画が
必要なとき(最小化、最大化など)にフレームワークから呼び出されます。
OnPaintに書けば問題は解決しますけれど、
なぜそこに書けばいいのかがわかっていないと意味が無いような気もしますね。
Viewを使ったときはまたちょっと変わってきますし。
なぜOnPaintでコードを記述すべきなのかはWindowsの仕組みに依存するところです。
入門書等できちんと調べて意味を理解することをお勧めします。
取り合えずコードを書くだけでなくてWindowsの仕組みの理解を深めることも
必要なのでそちらの方も頑張った方が応用力がついてよいと思いますよ。
あと、OnPaintに書くというのは必ずしもOnPaintにコードが無いと駄目という
意味ではありません。
描画用の関数を用意しておいてそれを呼ぶというのもありだと思います。
ただ、描画用のDCは、関数の外側で用意して引き渡すようにした方が
応用が出来ていいと思います。
この辺もWindowsの仕組みが理解できてMFCのからくりも理解できれば
自然と思いつくようになると思います。
OnPaintだと意味がないんです。
それだと大きなプログラムだと描画スピードが遅いんです。BITMAPINFOHEADER、
StretchDIBitsを使ってプログラムを簡潔にしたいんです。
>それだと大きなプログラムだと描画スピードが遅いんです。
それは描画処理に問題があるのではないでしょうか?
GetUpdateRect()やメモリDCを使って描画してやればそんなに気にならないと思います。
それでもダメなら DirectX を使ったりしないとダメですね。
ビットマップに表示を書いておいて、
それをOnPaint()で、画面に転送したいということでしょうか?
でしたら、BITMAPINFOHEADERではなく、
メモリDC、バックバッファ、CreateCompatibleDC、CreateCompatibleBitmap
あたりをキーワードにして調べてみた方が良いと思います。
うーん、Windowsの仕組みがわかっているのであれば、
そういう方向に思考が行かないと思うんですけれど。
OnPaintに書くと遅いというのはInvalidateで画面全体を無効化しているとか、
そういうことなのでは?
あと、メモリ上のビットマップにGDIで描画しておいてそれを実画面に転送するという
方法の話なんでしたら、OnPaintの中だから遅いとかということは無いと思いますよ。
私自身、そういった方法をとったことがありますけれど、その部分で差が出たということは
無かったと思います。むしろ、GDIでは描画速度が稼げないのでビットマップに直接描画する
方法を取っていました。もっとも、256色に限定していましたが。
ゆうじんさんがやりたい事がこの掲示板を読んでいる人間にきちんと伝わってこないので
適切なアドバイスが難しくなっているように思えます。
説明はできる限り具体的に、説明を省略して良いかどうか判断がつかないときには
判断でき無い部分も含めて説明した方が二度手間を省けて、より適切なアドバイスを
受けられると思います。