任意のBMPファイル名を渡し、そのBMPの幅と高さを取得して、任意のHDCにBitBltするまでの一番シンプルなコードを教えてください。WindowsAPIのみを使用で、VCLやMFCを使うのは禁止でお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:aki73ix No.1

回答回数5224ベストアンサー獲得回数27

ポイント10pt

ここにWindowsAPIのみで作ったサンプルのシンプルなコードがあります

このサイトでWindowsSDKの勉強すると一番分かりやすいと思います

id:ryoko

具体的なコードが良かったのですが……参考にさせて頂きます。

2004/10/03 01:42:20
id:suzuki1972 No.2

回答回数14ベストアンサー獲得回数0

ポイント60pt

http://www.hatena.ne.jp/1096726906#

任意のBMPファイル名を渡し、そのBMPの幅と高さを取得して、任意のHDCにBitBltするまでの一番シンプルなコードを教えてください。WindowsAPIのみを使用で、VCLやMFCを使う.. - 人力検索はてな

URLはダミーです。

即席で作ったコードですが、こんなとこでしょうかね。

HDC hdc;

HBITMAPhbmp = (HBITMAP)LoadImage( NULL, ”test,bmp”, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );

BITMAPbitmap;

GetObject( hbmp, sizeof(bitmap), &bitmap );

HDChdcbmp = CreateCompatibleDC( hdc );

HBITMAP holdbmp = (HBITMAP)SelectObject( hdcbmp, hbmp );

BitBlt( hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcbmp, 0, 0, SRCCOPY );

SelectObject( hdcbmp, holdbmp );

id:ryoko

具体的なコード、有難うございます。参考にさせて頂きます :)

2004/10/03 01:44:13
id:aki73ix No.3

回答回数5224ベストアンサー獲得回数27

ポイント10pt

すみません、2回目の回答です

「コードを教えてください」と言うことでしたね、勘違いしていました

と言うわけで、ソースファイルです

WIN32APIのVC6のプロジェクトになっていますので解凍して使ってください

// BMPLOAD2.cpp : アプリケーション用のエントリ ポイントの定義

//

#define STRICT

#include <windows.h>

#include ”stdafx.h”

#include ”resource.h”

#include <COMMDLG.H>

#define MAX_LOADSTRING 100

// グローバル変数:

HINSTANCE hInst;// 現在のインスタンス

// このコード モジュールに含まれる関数の前宣言:

ATOMMyRegisterClass( HINSTANCE hInstance );

BOOLInitInstance( HINSTANCE, int );

LRESULT CALLBACKWndProc( HWND, UINT, WPARAM, LPARAM );

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow )

{

// TODO: この位置にコードを記述してください。

MSG msg;

// グローバル ストリングを初期化します

MyRegisterClass( hInstance );

// アプリケーションの初期化を行います:

if( !InitInstance( hInstance, nCmdShow ) )

{

return FALSE;

}

// メイン メッセージ ループ:

while( GetMessage(&msg, NULL, 0, 0) )

{

TranslateMessage( &msg );

DispatchMessage( &msg );

}

return msg.wParam;

}

ATOM MyRegisterClass( HINSTANCE hInstance )

{

WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = WndProc; //プロシージャ名

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInst; //インスタンス

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wc.lpszMenuName= (LPCSTR)IDC_BMPLOAD2;

wc.lpszClassName = ”BMP_Loader”;// タイトル バー テキスト

return (RegisterClass(&wc));

}

BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )

{

HWND hWnd;

hInst = hInstance; // グローバル変数にインスタンス ハンドルを保存します

hWnd = CreateWindow(”BMP_Loader”,”BMP Loader”, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if( !hWnd )

{

return FALSE;

}

ShowWindow( hWnd, nCmdShow );

UpdateWindow( hWnd );

return TRUE;

}

void OpenF(HWND hWnd, BOOL bPrint)

{

OPENFILENAME ofn;

HANDLE hF;

HANDLE hMem1, hMem2;

LPBITMAPFILEHEADER lpBf;

LPBITMAPINFOHEADER lpBi;

DWORD dwResult;

LONG wx, wy;

DWORD dwFileSize, dwOffBits;

WORD wBitCount;

DWORD dwClrUsed, dwClrImportant;

DWORD dwSizeImage;

char str[256];

char szFType[3];

char szFileName[256]=””; // オープンするファイル名(パス付き)

char szFile[MAX_PATH];

memset(&ofn, 0, sizeof(OPENFILENAME));

ofn.lStructSize = sizeof(OPENFILENAME);

ofn.hwndOwner = hWnd;

ofn.lpstrFilter = ”bmp(*.bmp)¥0*.bmp¥0All files(*.*)¥0*.*¥0¥0”;

ofn.lpstrFile = szFileName;

ofn.lpstrFileTitle = szFile;

ofn.nMaxFile = MAX_PATH;

ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

ofn.lpstrDefExt = ”bmp”;

ofn.lpstrTitle = ”開きたいBMPを選択”;

if(GetOpenFileName(&ofn) == 0)

return;

hF = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,

NULL);

if (hF == INVALID_HANDLE_VALUE) {

MessageBox(hWnd, ”ファイルのオープンに失敗しました”, ”Error”, MB_OK);

return;

}

hMem1 = GlobalAlloc(GHND, sizeof(BITMAPFILEHEADER));

lpBf = (LPBITMAPFILEHEADER)GlobalLock(hMem1);

ReadFile(hF, (LPBITMAPFILEHEADER)lpBf, sizeof(BITMAPFILEHEADER), &dwResult, NULL);

dwFileSize = lpBf->bfSize;

szFType[0] = LOBYTE(lpBf->bfType);

szFType[1] = HIBYTE(lpBf->bfType);

szFType[2] = ’¥0’;

dwOffBits = lpBf->bfOffBits;

wsprintf(str, ”dwFileSize = %d, szFType = %s dwOffBits = %d”,

dwFileSize, szFType, dwOffBits);

// MessageBox(hWnd, str, ”BMP情報その1”, MB_OK);

hMem2 = GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER));

lpBi = (LPBITMAPINFOHEADER)GlobalLock(hMem2);

ReadFile(hF, (LPBITMAPINFOHEADER)lpBi, sizeof(BITMAPINFOHEADER), &dwResult, NULL);

wx = lpBi->biWidth;

wy = lpBi->biHeight;

wBitCount = lpBi->biBitCount;

dwClrUsed = lpBi->biClrUsed;

dwClrImportant = lpBi->biClrImportant;

dwSizeImage = lpBf->bfSize - lpBf->bfOffBits;

wsprintf(str, ”wx = %d, wy = %d¥nwBitCount = %d, dwClrUsed = %d, dwClrImportant = %d”,

wx, wy, wBitCount, dwClrUsed, dwClrImportant);

// MessageBox(hWnd, str, ”BMP情報その2”, MB_OK);

{

HDC hdc;

HANDLE hMem;

char *szBuffer;

BITMAPINFO bmp_info;

bmp_info.bmiHeader = *lpBi;

hMem = GlobalAlloc(GHND, dwFileSize - sizeof(BITMAPFILEHEADER));

szBuffer = (char *)GlobalLock(hMem);

SetFilePointer(hF, sizeof(BITMAPFILEHEADER), 0, FILE_BEGIN);

ReadFile(hF, szBuffer, sizeof(BITMAPINFOHEADER) + dwSizeImage, &dwResult, NULL);

hdc = GetDC(hWnd);

SetDIBitsToDevice(hdc,

0, 0, //転送先座標

wx, wy, //幅、高さ

0, 0, //転送元座標

0, wy, //走査開始番号、走査線の本数

//ビットマップデータ開始のアドレス

(char *)szBuffer + dwOffBits - sizeof(BITMAPFILEHEADER),

&bmp_info, //BITMAPINFO構造体へのポインタ

DIB_RGB_COLORS);

GlobalUnlock(hMem);

GlobalFree(hMem);

ReleaseDC(hWnd, hdc);

}

GlobalUnlock(hMem1);

GlobalFree(hMem1);

GlobalUnlock(hMem2);

GlobalFree(hMem2);

CloseHandle(hF);

return;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

TCHAR szHello[MAX_LOADSTRING];

LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

switch( message )

{

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// メニュー選択の解析:

switch( wmId )

{

case IDM_EXIT:

DestroyWindow( hWnd );

break;

case IDM_OPEN:

OpenF(hWnd,false);

break;

default:

return DefWindowProc( hWnd, message, wParam, lParam );

}

break;

case WM_DESTROY:

PostQuitMessage( 0 );

break;

default:

return DefWindowProc( hWnd, message, wParam, lParam );

}

return 0;

}

id:ryoko

有難うございます。でも、これはシンプルじゃないですね(涙)……お手数かけてしまって申し訳ありませんでした。

2004/10/03 01:46:44

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません