コード:
#include<windows.h>
#include<vector>
#define WIDTH 230
#define HEIGHT 350
using namespace std;
//--------------------------------------------------------------------
// クラス定義
//--------------------------------------------------------------------
class CImage {
public:
CImage(){ Width = 189; Height = 150; }
~CImage() { DeleteDC(memoryDC); DeleteObject(hBmp); }
int getWidth(){ return Width;}
int getHeight(){ return Height;}
HDC getMemDC(){ return memoryDC;};
void loadBmpFile(char *, HINSTANCE, HWND);
private:
char * Name;
int Width;
int Height;
HDC hDC;
HANDLE hBmp; // ビットマップハンドル
HDC memoryDC;
};
class CImageManager {
public:
int ImgCount; // CIMGクラス登録数
int SelectNumber; // 選択注のIMG番号
HINSTANCE hInst; // メインウインドウのインスタンスを保持する
HWND hDlgWnd; // 親ウインドウ(ダイアログ)のウインドウハンドル
void Initialize(HINSTANCE,HWND); // 情報の初期化
void addImage(char * filename);
void write(HDC);
private:
vector<CImage> Image;
vector<CImage>::iterator itrImage; // CImageクラスLISTのイテレータ
CImage ImageArr[10];
};
void CImage::loadBmpFile(char *filename, HINSTANCE hInst, HWND hDlgWnd) {
hDC = GetDC(hDlgWnd);
hBmp = LoadImage(
hInst,
filename,//このファイルを読み込む
IMAGE_BITMAP,
0,
0,
LR_CREATEDIBSECTION | LR_LOADFROMFILE
);
memoryDC = CreateCompatibleDC(hDC);
SelectObject(memoryDC, hBmp);
ReleaseDC(hDlgWnd, hDC);
}
void CImageManager::Initialize(HINSTANCE i_hInst, HWND i_hWnd){
hInst = i_hInst;
hDlgWnd = i_hWnd;
}
void CImageManager::addImage(char * filename){
CImage obj;
obj.loadBmpFile(filename, hInst, hDlgWnd);
Image.push_back(obj);
itrImage = Image.begin();
}
void CImageManager::write(HDC destDC) {
itrImage = Image.begin();
BitBlt(destDC, 0, 0, itrImage->getWidth(), itrImage->getHeight(), itrImage->getMemDC(), 0, 0, SRCCOPY);
}
//--------------------------------------------------------------------
// グローバル変数宣言
//--------------------------------------------------------------------
CImageManager cImgMng;
CImage cImg;
HINSTANCE hInst;
char * showFileOpenDialog(HWND);
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HBITMAP hBitmap;
static HDC hMemDC;
static BITMAPINFO bmpInfo;
static LPDWORD lpPixel;
switch(uMsg) {
case WM_CREATE:
//DIBの情報を設定する
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth=WIDTH;
bmpInfo.bmiHeader.biHeight=HEIGHT;
bmpInfo.bmiHeader.biPlanes=1;
bmpInfo.bmiHeader.biBitCount=32;
bmpInfo.bmiHeader.biCompression=BI_RGB;
//DIBSection作成
hdc=GetDC(hWnd);
hBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0);
hMemDC=CreateCompatibleDC(hdc);
SelectObject(hMemDC,hBitmap);
ReleaseDC(hWnd,hdc);
cImgMng.Initialize(hInst, hWnd);
cImgMng.addImage("c:\\test.bmp");
cImg.loadBmpFile("c:\\test.bmp",hInst, hWnd);
SetTimer(hWnd,1,100,NULL);
return 0;
case WM_TIMER:
InvalidateRect(hWnd,NULL,FALSE);
return 0;
case WM_PAINT:
SelectObject(hMemDC,GetStockObject(BLACK_BRUSH));
Rectangle(hMemDC,0,0,WIDTH,HEIGHT);
cImgMng.write(hMemDC);
//BitBlt(hMemDC,0,0,WIDTH,HEIGHT,cImg.getMemDC(),0,0,SRCCOPY);
hdc = BeginPaint(hWnd,&ps);
BitBlt(hdc,0,0,WIDTH,HEIGHT,hMemDC,0,0,SRCCOPY);
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
KillTimer(hWnd,1);
DeleteDC(hMemDC);
DeleteObject(hBitmap);
PostQuitMessage(NULL);
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int WINAPI WinMain(
HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow)
{
WNDCLASS wc;
MSG msg;
hInst = hInstance; //グローバル変数にコピー
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = (LPCSTR)"";
wc.lpszClassName = __FILE__;
if(!RegisterClass(&wc)) return 0;
HWND hWnd=CreateWindow(
__FILE__,"ex",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,
320,240,
NULL,NULL,hInstance,NULL);
if(hWnd==NULL) return 0;
BOOL bRet;
while((bRet=GetMessage(&msg,NULL,0,0))!=0){
if(bRet==-1) break;
DispatchMessage(&msg);
}
return (int)msg.wParam;
}