#include <windows.h>
#include "resource.h"
//定数の宣言
#define TIMER_ID 100 //タイマの識別ID
#define TIMER_ELAPSE 100 //WM_TIMERの発生間隔
//関数の宣言
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE,int,LPTSTR);
void Create(HWND hWnd);
void Paint(HWND hWnd);
void Destroy(HWND hWnd);
void SetColor(int,int,int);
void FillRect(int,int,int,int);
void DrawImage(HBITMAP hBmp,int x,int y);
//変数の宣言
HINSTANCE ghInst; //インスタンス
HGDIOBJ hPen; //ペン
HGDIOBJ hBrush; //ブラシ
HDC hMdc; //メモリDC
HDC hBdc; //バッファDC
HBITMAP hBBmp; //バッファBMP
RECT clientRect;//クライアント領域
//ビットマップ
HBITMAP hBmp; //ビットマップ
int bmpX; //ビットマップX座標
int bmpY; //ビットマップY座標
int bmpVX;//ビットマップX速度
int bmpVY;//ビットマップY速度
//メイン
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,int nShowCmd) {
MSG msg;
BOOL bRet;
//インスタンスの保持
ghInst=hInstance;
//ウィンドウの生成
if (!InitApp(hInstance)) return FALSE;
if (!InitInstance(hInstance,nShowCmd,
_T("TimerEx"))) return FALSE;
//メインループ
while((bRet=GetMessage(&msg,NULL,0,0))!=0) {
if (bRet==-1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
//ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst) {
WNDCLASSW wc;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;
wc.hIcon=NULL;
wc.hCursor=NULL;
wc.hbrBackground=(HBRUSH)COLOR_WINDOW;
wc.lpszMenuName=NULL;
wc.lpszClassName=_T("win01");
return (RegisterClassW(&wc));
}
//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst,int nShowCmd,
LPTSTR title) {
HWND hWnd;
hWnd=CreateWindowW(_T("win01"),title,
WS_CLIPCHILDREN,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL);
if (!hWnd) return FALSE;
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
return TRUE;
}
//ウィンドウのイベント処理
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) {
PAINTSTRUCT ps;
HDC hdc;
switch (msg){
//生成
case WM_CREATE:
GetClientRect(hWnd,&clientRect);
Create(hWnd);
break;
//描画
case WM_PAINT:
//前処理
hdc=BeginPaint(hWnd,&ps);
hMdc=CreateCompatibleDC(hBdc);
//描画
Paint(hWnd);
SelectObject(hdc,hBBmp);
BitBlt(hdc,0,0,clientRect.right,
clientRect.bottom,hBdc,0,0,SRCCOPY);
//後処理
DeleteDC(hMdc);
EndPaint(hWnd,&ps);
break;
//タイマーイベント
case WM_TIMER:
if (wp==TIMER_ID) {
//移動
if (bmpX<0 || clientRect.right<bmpX) bmpVX=-bmpVX;
if (bmpY<0 || clientRect.bottom<bmpY) bmpVY=-bmpVY;
bmpX+=bmpVX;
bmpY+=bmpVY;
//再描画
InvalidateRect(hWnd,NULL,FALSE);
} else {
return (DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
//破棄
case WM_DESTROY:
Destroy(hWnd);
PostQuitMessage(0);
break;
//その他
default:
return (DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
}
//生成
void Create(HWND hWnd) {
PAINTSTRUCT ps;
HDC hdc;
//ダブルバッファの生成
hdc=BeginPaint(hWnd,&ps);
hBdc=CreateCompatibleDC(hdc);
hBBmp=CreateCompatibleBitmap(hdc,
clientRect.right,clientRect.bottom);
SelectObject(hBdc,hBBmp);
EndPaint(hWnd,&ps);
//ビットマップの読み込み
hBmp=LoadBitmap(ghInst,MAKEINTRESOURCE(IDB_BITMAP1));
//ビットマップの位置
bmpX=120;
bmpY=120;
bmpVX=10;
bmpVY=10;
//タイマーの生成
SetTimer(hWnd,TIMER_ID,TIMER_ELAPSE,NULL);
}
//描画
void Paint(HWND hWnd) {
//背景の描画
SetColor(255,255,255);
FillRect(0,0,clientRect.right,clientRect.bottom);
//イメージの描画
DrawImage(hBmp,bmpX-57,bmpY-57);
}
//破棄
void Destroy(HWND hWnd) {
//ダブルバッファの解放
DeleteDC(hBdc);
DeleteObject(hBBmp);
//ビットマップの破棄
DeleteObject(hBmp);
//タイマーの破棄
KillTimer(hWnd,TIMER_ID);
}
//色の指定
void SetColor(int r,int g,int b) {
//ペンとブラシの解放
DeleteObject(hPen);
DeleteObject(hBrush);
//ペンとブラシの生成
hPen=CreatePen(PS_SOLID,1,RGB(r,g,b));
SelectObject(hBdc,hPen);
hBrush=CreateSolidBrush(RGB(r,g,b));
SelectObject(hBdc,hBrush);
}
//矩形の塗り潰し
void FillRect(int x,int y,int w,int h) {
Rectangle(hBdc,x,y,x+w,y+h);
}
//イメージの描画
void DrawImage(HBITMAP hBmp,int x,int y) {
BITMAP info;
GetObject(hBmp,sizeof(BITMAP),&info);
SelectObject(hMdc,hBmp);
BitBlt(hBdc,x,y,info.bmWidth,info.bmHeight,hMdc,0,0,SRCCOPY);
}
|