WindowsApiを使ってアニメーションを試していたのですが
なぜか画面がちらついてしまいます。どうすれば直せるでしょうか。よろしくお願いします
#define ID_MYTIMER 100
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
LPCTSTR lpszClassName=TEXT("animation01");
TCHAR szCaption[64]=TEXT("szcaption");
int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrecInst,LPSTR lpsCmdLine,int nCmdShow)
{
MSG msg;
BOOL bRet;
if(!InitApp(hCurInst))
return FALSE;
if(!InitInstance(hCurInst,nCmdShow))
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)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc; //プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;//インスタンス
wc.hIcon = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL; //メニュー名
wc.lpszClassName = lpszClassName;
wc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
return (RegisterClassEx(&wc));
}
BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(lpszClassName,
TEXT("test"), //タイトルバーにこの名前が表示されます
WS_OVERLAPPEDWINDOW&~WS_THICKFRAME&~WS_MAXIMIZEBOX, //ウィンドウの種類
CW_USEDEFAULT, //X座標
CW_USEDEFAULT, //Y座標
CW_USEDEFAULT, //幅
CW_USEDEFAULT, //高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
HDC hdc;
UpdateWindow(hWnd);
hdc=GetDC(hWnd);
ReleaseDC(hWnd,hdc);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
int id;
static int ballx,bally,ballw,ballh,speed=1;
static HBITMAP hBmp;
static HDC hdc_mem;
HDC hdc;
static HBRUSH hBrush;
static int direction = 0;
PAINTSTRUCT ps;
BITMAP bmp_info;
switch (msg) {
case WM_CREATE:
hdc=GetDC(hWnd);
hBmp=CreateCompatibleBitmap(hdc,640,480);
hdc_mem=CreateCompatibleDC(NULL);
SelectObject(hdc_mem,hBmp);
hBrush = CreateSolidBrush(RGB(255,0,0));
SelectObject(hdc_mem,hBrush);
ballx=0;
bally=0;
ballw=20;
ballh=20;
Ellipse(hdc_mem,ballx,bally,ballx+ballw,ballx+ballh);
ReleaseDC(hWnd,hdc);
SetTimer(hWnd,ID_MYTIMER,0,NULL);
break;
case WM_LBUTTONDBLCLK:
SendMessage(hWnd,WM_CLOSE,60,0);
break;
case WM_TIMER:
PatBlt(hdc_mem,0,0,640,480,BLACKNESS);
Ellipse(hdc_mem,ballx,bally,ballx+ballw,ballx+ballh);
switch(direction){
case 0:
ballx+=speed;
bally+=speed;
if(bally>480-ballh)direction=1;
if(ballx>640-ballw)direction=3;
break;
case 1:
ballx+=speed;
bally-=speed;
if(bally)direction=2;
if(ballx>600-ballw)direction=0;
break;
case 2:
ballx-=speed;
bally-=speed;
if(bally<0)direction=1;
if(ballx<0)direction=3;
break;
case 3:
ballx-=speed;
bally+=speed;
if(bally>400-ballh)direction=0;
if(ballx<0)direction=2;
break;
}
InvalidateRect(hWnd,NULL,TRUE);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc,0,0,640,480,hdc_mem,0,0,SRCCOPY);
EndPaint(hWnd, &ps);
break;
case WM_KEYDOWN:
if(wp==VK_UP){
speed++;
if(speed>10)
speed=10;
}
if(wp==VK_DOWN){
speed--;
if(speed<-10)
speed=-10;
}
wsprintf(szCaption,TEXT("はやさ%d"),speed);
SetWindowText(hWnd,szCaption);
break;
case WM_CLOSE:
id = MessageBox(hWnd,
TEXT("終了してもよろしいですか"),
TEXT("確認"),
MB_YESNO | MB_ICONQUESTION);
if (id == IDYES)
DestroyWindow(hWnd);
break;
case WM_DESTROY:
KillTimer(hWnd,ID_MYTIMER);
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}