imgctl.dllの機能のひとつであるCreateDIB関数の使い方が分りません。
付属のリファレンスには
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
HDIB CreateDIB(const BITMAPINFO *pbmi, LPCVOID pvData)
BITMAPINFO構造体及び実データのビット並びからDIBデータを作成して、そのハンドルを返します。
v1.10B4 より、pvData にNULLを指定出来るようになりました。
NULLを指定した場合、実データ部が 0 で埋められたDIBデータを返します。
Visual Basic では、NULLの代わりに 0 を指定します。
v1.12B3 より、トップダウン形式からの作成が可能になりました。
====================
ICERR_MEM_ALLOC
ICERR_PARAM_NULL
ICERR_IMG_COMPRESS
ICERR_IMG_RLESIZE
ICERR_IMG_BITCOUNT
ICERR_IMG_AREA
ICERR_IMG_RLETOP
====================
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
とありますが、引数LPCVOID pvDataには何を渡せば良いのでしょうか、
BITMAP構造体だと思ったのですがうまくいきません。
どうかよろしくお願いします。
No.2ベストアンサー
- 回答日時:
こんばんは。
すんません、的ハズレな事を書いてしまいました。NULLの場合ではなく、pvDataに何を入れるべきかと言う事でした。
pvDataには、これから作成するDIBの元となる、グラフィックの配列を入れると言う事です。
例えば、これから作成するDIBが 320 x 240 x 24bit(3byte)である場合、 320 x 240 x 3 = 230400byte の一次元配列を入れる事になります(その位置次元配列に絵のデータが入っている訳です)。
//320 x 240 x 24bitの真っ黒なDIBハンドルを作成する
BITMAPINFO bmi = {sizeof(BITMAPINFOHEADER)};
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biWidth = 320;
bmi.bmiHeader.biHeight = 240;
//1ピクセル辺りのバイト数
const int bytesPerPixel = (bmi.bmiHeader.biBitCount / 8);
//1行辺りのバイト数
const int strideByte = bmi.bmiHeader.biWidth * bytesPerPixel;
//イメージ全体のバイト数
bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biWidth * bmi.bmiHeader.biHeight * bytesPerPixel;
//グローバルメモリを作成する(win32api)
HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, bmi.bmiHeader.biSizeImage);
//グローバルメモリからポインタを開く(win32api)
LPBYTE pData = (LPBYTE)::GlobalLock(hMem);
//適当にグラデーションを作る
for(int y = 0; y < bmi.bmiHeader.biHeight; ++y)
for(int x = 0; x < bmi.bmiHeader.biWidth; ++x)
{
const int pos= (x * bytesPerPixel) + (y * strideByte);
pData[pos]= x * ((double)255 / (double)bmi.bmiHeader.biWidth);
pData[pos+1]= 0xff;
pData[pos+2]= (bmi.bmiHeader.biWidth - x) * ((double)255 / (double)bmi.bmiHeader.biWidth);
}
//先程作成したpDataを元にDIBハンドルを作成する(imgctl.dll)
HDIB hDIB = ::CreateDIB(&bmi, pData);
//ウィンドウデバイスコンテキストを取る(win32api)
HDC hDC = ::GetDC(hWnd);
//ウィンドウに描写する(imgctl.dll)
::DIBtoDC(hDC, 0, 0, bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight, hDIB, 0, 0, SRCCOPY);
//ウィンドウデバイスコンテキストの解放(win32api)
::ReleaseDC(hWnd, hDC);
//DIBハンドルを消去(imgctl.dll)
::DeleteDIB(hDIB);
//グローバルメモリのポインタを閉じる(win32api)
::GlobalUnlock(hMem);
//グローバルメモリを消去(win32api)
::GlobalFree(hMem);
お礼が遅れてすみません。
すばらしい!貴重なコードをありがとうございます。
問題解決しました。また何かありましたらよろしくお願いします。
No.1
- 回答日時:
こんばんは。
NULLを入れると、真っ黒なDIBを作成するのだそうです。
HDIB型はHBITMAP型とは関係ないので、SelectObject()api等に渡してはいけないので要注意。
以下はウィンドウに真っ黒なDIBを表示します。参考程度に。
//320 x 240 x 24bitの真っ黒なDIBハンドルを作成する
BITMAPINFO bmi = {sizeof(BITMAPINFOHEADER)};
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biWidth = 320;
bmi.bmiHeader.biHeight = 240;
//DIBハンドルを作成する(imgctl.dll)
HDIB hDIB = ::CreateDIB(&bmi, NULL);
//ウィンドウデバイスコンテキストを取る(win32api)
HDC hDC = ::GetDC(hWnd);
//ウィンドウに描写する(imgctl.dll)
::DIBtoDC(hDC, 0, 0, bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight, hDIB, 0, 0, SRCCOPY);
//ウィンドウデバイスコンテキストの解放(win32api)
::ReleaseDC(hWnd, hDC);
//DIBハンドルを消去(imgctl.dll)
::DeleteDIB(hDIB);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
自作DLLってkernel32.dllやuser...
-
APIの呼び出しDLLファイルの場...
-
VC++2010でdllファイルの作成に...
-
ファイルをvbaで圧縮したいので...
-
指定された引数が有効範囲にな...
-
ILMergeのエラーの原因と対策
-
[VBA]64b版-行数表示.dllの登録...
-
res://ieframe.dll/について
-
NlsData000c.dllの入手方法
-
Sound Engine で MP3ファイル...
-
C# DLL エントリ ポイントが...
-
dllをいじる。。
-
steamのゲームが起動しません。
-
VBAエディタのコード画面で、カ...
-
C# ネット上に公開されているFF...
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
VBAを何回も作り直して、容量が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
res://ieframe.dll/について
-
ASP.NETのDLL入れ替えについて
-
VB6.0(SP6)にて開発を行なって...
-
WIN10で常にフォームを手前に
-
C# DLL エントリ ポイントが...
-
ファイルをvbaで圧縮したいので...
-
visual studioの不要なDll削除方法
-
手書き文字認識のdll
-
M365にアップデートしてからコ...
-
[VBA]64b版-行数表示.dllの登録...
-
VBAエディタのコード画面で、カ...
-
ベースアドレスの設定について
-
メイクファイルからdllを生成す...
-
VBからIMEパッドを呼び出す方法...
-
パソリからIDをVB6で読み込みた...
-
実行ファイルからソースファイ...
-
steamのゲームが起動しません。
-
APIの呼び出しDLLファイルの場...
-
指定された引数が有効範囲にな...
-
dllをいじる。。
おすすめ情報