タイトル : 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 の結果は未検証)。 |