2004年に書いていたソースコードを公開します。当時書いていたプログラムが間違ってたので修正版です。当時はVisual C++ 6.0でプログラミングしていました。
CODE:
//Image.h
#ifndef IMAGE_H
#define IMAGE_H
#include
typedef struct tagImage
{
int width; //横幅
int height; //縦幅
HDC hdc; //デバイスコンテキスト
HBITMAP hbmp; //ビットマップハンドル
}IMAGE,*LPIMAGE;
int CreateImage(IMAGE* image, HWND hWnd, int w, int h);
int CreateImageFromFileA(IMAGE* img, HWND hWnd, const char* name); //マルチバイト対応版
int CreateImageFromFileW(IMAGE* img, HWND hWnd, const wchar_t* name); //ユニコード対応版
int BltImage(IMAGE* dst,int x,int y,IMAGE* scr, RECT scr_r,DWORD flag);
int DeleteImage(IMAGE* image);
#ifdef _UNICODE
#define CreateImageFromFile CreateImageFromFileW
#else
#define CreateImageFromFile CreateImageFromFileA
#endif
#endif
CODE:
//Image.cpp
#include "stdafx.h"
#include "Image.h"
//------------------------------------------------------------
// CreateImage()
// Memo:画像の作成する
//------------------------------------------------------------
int CreateImage(
IMAGE* image, //画像を作成するためのポインタ
HWND hWnd, //ウィンドウハンドル
int w, int h) //作成する横幅と縦幅
{
HDC hdc;
hdc = GetDC(hWnd);
//仮想画面とDCの作成
image->hbmp = CreateCompatibleBitmap(hdc, w, h);
image->hdc = CreateCompatibleDC(hdc);
ReleaseDC(hWnd, hdc);
if( image->hbmp == NULL || image->hdc == NULL ){
return -1;
}
SelectObject(image->hdc, image->hbmp);
image->width = w;
image->height = h;
BitBlt(image->hdc, 0, 0, w, h, NULL, 0, 0, WHITENESS);
return 0;
}
//------------------------------------------------------------
// CreateImageFromFileA()
// Memo:画像のロード(マルチバイト文字列対応版)
//------------------------------------------------------------
int CreateImageFromFileA(
IMAGE* img, //画像格納用変数ポインタ
HWND hWnd, //ウィンドウハンドル
const char* name) //読み込むファイル名
{
HDC hdc;
HINSTANCE hInst;
BITMAP bmp;
//画像ファイルのロード
hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
img->hbmp = (HBITMAP)LoadImageA(hInst, name, IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//DCの作成
hdc = GetDC(hWnd);
img->hdc = CreateCompatibleDC(hdc);
ReleaseDC(hWnd, hdc);
//関連付け
SelectObject(img->hdc, img->hbmp );
if( img->hbmp == NULL || img->hdc == NULL ){
return -1;
}
//ビットマップ情報の取得
if(GetObject(img->hdc, sizeof(BITMAP), &bmp) == 0){
return -1;
}
img->width = bmp.bmWidth;
img->height = bmp.bmHeight;
return 0;
}
//------------------------------------------------------------
// CreateImageFromFileW()
// Memo:画像のロード(ユニコード文字列対応版)
//------------------------------------------------------------
int CreateImageFromFileW(
IMAGE* img, //画像格納用変数ポインタ
HWND hWnd, //ウィンドウハンドル
const wchar_t* name) //読み込むファイル名
{
HDC hdc;
HINSTANCE hInst;
BITMAP bmp;
//画像ファイルのロード
hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
img->hbmp = (HBITMAP)LoadImageW(hInst, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//DCの作成
hdc = GetDC(hWnd);
img->hdc = CreateCompatibleDC(hdc);
ReleaseDC(hWnd, hdc);
//関連付け
SelectObject(img->hdc, img->hbmp );
if( img->hbmp == NULL || img->hdc == NULL ){
return -1;
}
//ビットマップ情報の取得
GetObject(img->hdc, sizeof(BITMAP), &bmp);
img->width = bmp.bmWidth;
img->height = bmp.bmHeight;
return 0;
}
//----------------------------------------------------------
// BltImage()
// Memo:描画する処理
//----------------------------------------------------------
int BltImage(
IMAGE* dst, //転送先イメージ
int x, //転送先X座標
int y, //転送先Y座標
IMAGE* scr, //転送元イメージ
RECT scr_r, //転送元領域
DWORD flag) //転送フラグ
{
int w = scr_r.right - scr_r.left;
int h = scr_r.bottom = scr_r.top;
BitBlt(dst->hdc, x, y, w, h, scr->hdc, scr_r.left, scr_r.top, flag);
return 1;
}
//----------------------------------------------------------
// DeleteImage()
// Memo:画像を破棄する
//----------------------------------------------------------
int DeleteImage(IMAGE* image)
{
DeleteDC(image->hdc);
DeleteObject(image->hbmp);
image->hdc = NULL;
image->hbmp = NULL;
return 0;
}
CreateImageもしくはCreateImageFromFileを呼び出した後はDeleteImageで破棄してください。