WinAPIでの画像高速切り替え表示プログラム1
WinAPIを使用して、ビットマップ画像を8枚読み込み、それを連続高速表示するプログラムを作成しています。
今はSetTimerを使ってWM_TIMERを受け取ったときに画像をInvalidateRect(再描画)しています。
以下のソースで動作はするのですが、WM_TIMERは整数ミリ秒でしか設定できず、精度も悪く優先順位も遅いようなので他の方法を考えています。
画像8枚を6.25msecで切り替えて表示するというのをESCAPEするまで繰り返したいのですが...。
リフレッシュレートは160Hzにあげています。
QueryPerformanceFrequencyというものを使えばいいのかなと思っていますが、どこでどう使えばいいのか、それをどう受け取って再描画すればいいのかわかりません。
どなたかご教授お願いします。ソースファイルを書いていただけたら嬉しいです。
#include<windows.h>
#define BMP_SUM8//画像の総数
#define TIMER_ID (100) // 作成するタイマの識別ID
#define TIMER_ELAPSE (6) // WM_TIMERの発生間隔
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
HDC hdc;
PAINTSTRUCT ps;
HBITMAP hBitmap;
int i;
const char *filename[BMP_SUM]={"gazou0.bmp", "gazou1.bmp", "gazou2.bmp", "gazou3.bmp", "gazou4.bmp", "gazou5.bmp", "gazou6.bmp", "gazou7.bmp"};
static HDC hMemDC[BMP_SUM];
static BITMAP bmp;
static int bmp_index;//現在の画像番号
LONG lResult;
switch(uMsg) {
case WM_CREATE:
hdc=GetDC(hWnd);
for(i=0;i<BMP_SUM;i++){
hBitmap=(HBITMAP)LoadImage(0,filename[i],IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hMemDC[i]=CreateCompatibleDC(hdc);
SelectObject(hMemDC[i],hBitmap);
}
GetObject(hBitmap,sizeof(BITMAP),&bmp);
DeleteObject(hBitmap);
ReleaseDC(hWnd,hdc);
return 0;
case WM_TIMER:
if( wParam != TIMER_ID )
{
break; // 識別IDが一致しないタイマメッセージはDefWindowProc()に任せる
}
if(++bmp_index >= BMP_SUM) bmp_index=0;
for(i = 0; i < BMP_SUM; i++){
InvalidateRect( hWnd, NULL, FALSE );
}
return 0;
case WM_DESTROY:
for(i=0;i<BMP_SUM;i++) DeleteDC(hMemDC[i]);
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hMemDC[bmp_index],0,0,SRCCOPY);
EndPaint(hWnd,&ps);
return 0;
case WM_KEYDOWN:
switch((CHAR)wParam)
{
case VK_ESCAPE:
for(i=0;i<BMP_SUM;i++) DeleteDC(hMemDC[i]);
PostQuitMessage(0); //WM_QUITメッセージを出す
return 0;
}
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
入りきらないので2つに分けます。
続きは「WinAPIでの画像高速切り替え表示プログラム2」を見てください。
お礼
うまくいきました。ありがとうございます。