No.3ベストアンサー
- 回答日時:
御礼いただきました。
えぇと、要はDIBファイルを読み込みたいのでしょうか。>>こちらをコピペしてコンパイルしてみましたが「hDib」が定義されていないと出ました。
すいません。中途半端すぎました。
>>これはどうすればよいのでしょうか?
プログラム内で使用する為にビットマップハンドルを作成します。
作成したビットマップハンドルに対して、DIBヘッダへのポインタ等を使用して書き込みします。
局所的に言及して説明出来る代物では無いので、以下を参考にしてみてください。
DIBファイルを読み込んでウィンドウに表示します。デバッガで追跡してDIBヘッダの中身などを確認してみてください。
#include<windows.h>
#include<stdio.h>
//バッファを作成してファイルを丸ごと読み込む
static BYTE* CreateBufferFromFile(const char* pszFileName)
{
FILE* pf = ::fopen(pszFileName, "rb");
::fseek(pf, 0, SEEK_END);
const long size = ::ftell(pf);
::rewind(pf);
BYTE* pFileBuf = (BYTE*)::malloc(size);
::fread(pFileBuf, size, 1, pf);
::fclose(pf);
return pFileBuf;
}
//バッファを消す
static void DeleteBuffer(BYTE* pFileBuf)
{
::free(pFileBuf);
}
//ビットマップを作成する
static HBITMAP ReadDIB(const BYTE* pFileBuf)
{
//ファイル先頭のポインタ
const LPBITMAPFILEHEADER ph = (LPBITMAPFILEHEADER)(pFileBuf);
//DIBヘッダーのポインタ
const LPBITMAPINFO pbmi= (LPBITMAPINFO)(pFileBuf + sizeof(BITMAPFILEHEADER));
//ビットイメージ先頭のポインタ
const void* pSrc= pFileBuf + ph->bfOffBits;
//デスクトップウィンドウのデバイスコンテキストを作成する
HWND hWndDesktop= ::GetDesktopWindow();
HDC hDCDesktop= ::GetDC(hWndDesktop);
//プログラム内で使用するためのビットマップを作成する。フォーマットはデスクトップと同じにする
HBITMAP hBitmap= ::CreateCompatibleBitmap(hDCDesktop, pbmi->bmiHeader.biWidth, pbmi->bmiHeader.biHeight);
::ReleaseDC(hWndDesktop, hDCDesktop);
//ビットマップハンドルの為のデバイスコンテキストを作成する
HDC hDCBitmap = ::CreateCompatibleDC(NULL);
::SelectObject(hDCBitmap, hBitmap);
//DIBヘッダのポインタを使用して、hDstに対して書き込む
::SetDIBits(hDCBitmap, hBitmap, 0, pbmi->bmiHeader.biHeight, pSrc, pbmi, DIB_RGB_COLORS);
::DeleteDC(hDCBitmap);
return hBitmap;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitmap = 0;
switch(uMsg)
{
case WM_CREATE:
{
BYTE* pFileBuf = ::CreateBufferFromFile("ビットマップファイル名");
hBitmap = ::ReadDIB(pFileBuf);
::DeleteBuffer(pFileBuf);
return TRUE;
}
case WM_CLOSE:
::DestroyWindow(hWnd);
return FALSE;
case WM_DESTROY:
::DeleteObject(hBitmap);
::PostQuitMessage(0);
return FALSE;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC = ::BeginPaint(hWnd, &ps);
//ビットマップハンドルから情報を取る
BITMAP bmp;
::GetObject(hBitmap, sizeof(bmp), &bmp);
//描写する
HDC hDCSrc = ::CreateCompatibleDC(NULL);
::SelectObject(hDCSrc, hBitmap);
::BitBlt(hDC, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCSrc, 0, 0, SRCCOPY);
::DeleteDC(hDCSrc);
::EndPaint(hWnd, &ps);
}
default:break;
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
お礼が遅れました。
今行っているのは画像表示の際にDIBヘッダが必要というものでございまして。
今回はいろんな意見を聞いて、解決することができました。
今回教えていただいたものは今後、プログラムに役立てて行きたいと思います。
ありがとうございました。
No.2
- 回答日時:
こんにちは。
BMPファイル(又はそれを読み込んだバッファー)の先頭から、sizeof(BITMAPFILEHEADER)バイト分下にずらした位置の事ではないでしょうか。
大体、こんな感じです。
HBITMAP ReadDIB(const BYTE* pFileBuf)
{
//ファイル先頭のポインタ
const LPBITMAPFILEHEADER ph = (LPBITMAPFILEHEADER)(pFileBuf);
//DIBヘッダーのポインタ
const LPBITMAPINFO pbmi= (LPBITMAPINFO)(pFileBuf + sizeof(BITMAPFILEHEADER));
//ビットイメージ先頭のポインタ
const void* pSrc= pFileBuf + ph->bfOffBits;
//作成してビットマップハンドルを返す
return hDib;
}
No.1
- 回答日時:
DIBヘッダがわかりません?
それともポインタ?
DIBヘッダなら
http://wisdom.sakura.ne.jp/system/winapi/win32/w …
あたりがかなり具体的に書いてあると思いますよ。
DIBファイルもポインタもわかるんですが、
「DIBヘッダへのポインタ」というのがわかりません。
DIB構造体って確か4種類ぐらいありますよね。
それのすべてDIBヘッダというのですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 掲示板のセキュリティについてアドバイスお願い致します 1 2023/08/11 20:44
- その他(パソコン・スマホ・電化製品) ワードでテキストボックス内の文字を連動させない方法 2 2023/02/09 16:56
- JavaScript JSON について 1 2022/06/09 18:17
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- デスクトップパソコン 全画面表示でもタスクバーを前面に隠す、表示させるようにしたい 3 2022/03/23 12:30
- C言語・C++・C# C言語で構造体の参照渡しができません 2 2022/12/18 21:22
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# C言語 配列とポインタについて 2 2022/06/02 11:53
- AI・ロボット chat.openAIの限界。私は「何事にもやる気が起きない」と相談して、対策よりも原因に付いて 3 2023/04/13 11:34
- 放射線治療・リハビリテーション 二次救急と三次救急の違いについて 1 2023/05/27 21:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
C言語のポインタに直接アドレス...
-
LPSTR型の初期化について
-
PASCALとFARの意味
-
単方向リスト
-
C言語でのconstを返す関数
-
別のDLLのダイアログを・・・
-
関数ポインタの利点
-
デバイスハンドルとは?
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
ハンドル、アドレス、ポインタ...
-
C++で関数ポインタから関数名を...
-
DirectXのDIRECT3DTEXTURE9
-
セグメントエラー
-
fopne で失敗する原因
-
gccでMAKEINTRESOURCEするとdif...
-
登録した文字列をランダムに表...
-
どうしてエラーになるかわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
Cで作成したDLL関数をVBから呼...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
構造体とfscanf
-
c言語で任意のファイルから読み...
-
デバイスハンドルとは?
-
main(int argc,char **argv[])...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
C言語の関数と配列に関する質問
-
参照型で受け取った引数をポイ...
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
おすすめ情報