ここにWindowsAPIのみで作ったサンプルのシンプルなコードがあります
このサイトでWindowsSDKの勉強すると一番分かりやすいと思います
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 );
具体的なコード、有難うございます。参考にさせて頂きます :)
すみません、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;
}
有難うございます。でも、これはシンプルじゃないですね(涙)……お手数かけてしまって申し訳ありませんでした。
具体的なコードが良かったのですが……参考にさせて頂きます。