tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^9: GetDIbitsの使用方法について
投稿日: 2014/03/16(Sun) 22:59
投稿者魔界の仮面弁士
> ・申し訳ありませんでした。記載ミスです。理解できております。
一回や二回の間違いではなく、すべての箇所で記載ミスしているので、
typo(書き損じ)ではなく、間違えて記憶されているのかと思っていました。



>  CreateDIBitmap、CreateDIBSection (メモリデバイスコンテキストでのみビット
>                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
>                    ↑意味がわかりません。調べる必要有り!

これについては、No15863 、No15864 を参照してください。


> ・魔界の仮面弁士や花ちゃんのようにすべてを理解した上で、使用できれはいいので
すべて理解はしていません。調べながら回答しているぐらいですし。
どちらかといえば、描画系は苦手な分野です。通信系よりはマシですが。


>  今の自分にとっては、「良くわからないけど、やってみたら狙い通りに
>  できた=うれしい!」ってのがさらに次ステップへ進めるモチベーションになるの
>  です。理解より達成感が、次の階段を踏み出す大きな動機付けなのです。
VB の標準命令だけでやりくりする分には、それでも良いかもしれません。
ただ、API に手を出そうとするのであれば、その背景となる理論は知っておいた方が良いでしょう。
既存のサンプルを使いまわすだけであれば、そうした知識なしでも使えるとは思いますが、
それを使いこなすには、最低限の知識が必要ということです。


>  ・つまりFrame1DCは「非互換のオブジェクト」ということなんでしょうか。
>   ここで指定するデバイスコンテキストのハンドルは、何を使用したらいいのでしょ
>   うか?

こんな感じで如何でしょうか。API 宣言は既出なので省略。


'描画の元となるDC
hFrameDC = GetDC(Frame1.hWnd)

'描画結果の色数・サイズを決めるためのメモリビットマップ
hBmp = CreateCompatibleBitmap(hFrameDC, Frame1.Width, Frame1.Height)  'ScaleMode = ピクセル

'実際の描画処理は、メモリデバイスコンテキストに対して行う
hMemDC = CreateCompatibleDC(hFrameDC)

'メモリデバイスコンテキストのサーファイスは、作成直後は
'1x1サイズのモノクロ画像が選択されているので、適切な hBmp を選択しなおす
hOld = SelectObject(hMemDC, hBmp)

'★★★★★
'★ここに、hMemDC への描画処理を記述する
'★(DrawIcon とか BitBlt とか)
'★★★★★

'ビットマップ情報の取得
Dim bmpinfo As BITMAPINFO
bmpinfo.bmiHeader.biSize = Len(bmpinfo.bmiHeader)   '40

'lpvBits に ヌルポインタ を渡して、BITMAPINFO からデータサイズを調べる
GetDIBits hMemDC, hBmp, 0, bmpinfo.bmiHeader.biHeight, ByVal 0&, bmpinfo, DIB.RGB_COLORS

'上記は、モニタ設定の画像情報をそのまま取得する場合の処理手順です。
'(biBitCount = 0 にしておくと、現在のビットマップ属性が取得されます)
'
'ビットマップのサイズ、色数などが事前に分かっている場合や、
'他の形式(モニタの色数と異なる画像にしたい場合など)を
'得たい場合などは、BITMAPINFOHEADER の先頭 6 項目を自前で組み立てください。

'あらためて、ビットマップ情報を取得しなおす
ReDim pixel(bmpinfo.bmiHeader.biSizeImage - 1) As Byte
GetDIBits hMemDC, hBmp, 0, Abs(bmpinfo.bmiHeader.biHeight), pixel(0), bmpinfo, DIB.RGB_COLORS

'ビットマップの走査方向(トップダウン/ボトムアップ)を変更したい場合は、
'biHeightの符号を逆転させてください。
'また、pixel() のデータの並びは、ビットマップの色数・幅によって異なります。

'後始末
SelectObject hMemDC, hOld   '既存のオブジェクトを選択しなおす
DeleteObject hBmp           'サイズ指定に使っていたビットマップ
DeleteObject hMemDC         '描画に用いたメモリデバイスコンテキスト
ReleaseDC Frame1.hWnd, hFrameDC    '元となったデバイスコンテキスト



上記では Frame1 を GetDC してデバイスコンテキストを得ていますが、
「GetDIBits を使うこと」だけが目的なのであれば、デバイスコンテキストの取得は
CreateDC("DISPLAY", ByVal vbNullString, ByVal vbNullString, ByVal 0&)
でも良いかも知れません(CreateDC の結果は未検証)。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。