/*   DIBのアニメーション表示 1999/ 1/28 宍戸 輝光 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void draw(void); LPBYTE lpBuf,lpFrame[128]; LPBITMAPINFO lpDIB; LPRGBQUAD lpRGB; HWND hwMain; DWORD dwTime,dwIndex=0,dwStart=0; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; int i,j; wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = NULL; wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = NULL; RegisterClassEx (&wndclass); hwMain=CreateWindow ("CWindow",NULL, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,152,200, NULL,NULL,hInstance,NULL); lpBuf=(LPBYTE)GlobalAlloc /* 必要なメモリをまとめて確保 */ (GPTR,sizeof(BITMAPINFO)+255*sizeof(RGBQUAD)+128*128*128); lpDIB=(LPBITMAPINFO)lpBuf; lpRGB=(RGBQUAD*)(lpBuf+sizeof(BITMAPINFOHEADER)); lpDIB->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); /* BITMAPINFO構造体 */ lpDIB->bmiHeader.biWidth=128; lpDIB->bmiHeader.biHeight=128; lpDIB->bmiHeader.biPlanes=1; lpDIB->bmiHeader.biBitCount=8; lpDIB->bmiHeader.biCompression=BI_RGB; lpDIB->bmiHeader.biSizeImage=0; lpDIB->bmiHeader.biXPelsPerMeter=0; lpDIB->bmiHeader.biYPelsPerMeter=0; lpDIB->bmiHeader.biClrUsed=0; lpDIB->bmiHeader.biClrImportant=0; lpDIB->bmiColors[0]=lpRGB[0]; /* カラーテーブルの先頭 */ for (i=0;i<256;i++) { /* カラーテーブル作成 */ lpRGB[i].rgbRed=i; lpRGB[i].rgbGreen=i; lpRGB[i].rgbBlue=i; } lpRGB[1].rgbRed=255; lpRGB[1].rgbGreen=0; lpRGB[1].rgbBlue=0; lpRGB[2].rgbRed=255; lpRGB[2].rgbGreen=192; lpRGB[2].rgbBlue=224; for (i=0;i<28;i++) { /* フレームデータ作成 */ lpFrame[i]=(LPBYTE)lpRGB+256*sizeof(RGBQUAD)+128*128*i; FillMemory(lpFrame[i],128*128,255); for (j=64-i*2;j<64+i*2;j++) { FillMemory(lpFrame[i]+j*128+64-i*2,i*4,128-i*4); if (j!=64-i*2 && j!=63+i*2) FillMemory(lpFrame[i]+j*128+65-i*2,i*4-2,255); } } for (i=0;i<100;i++) { lpFrame[i+28]=lpFrame[i+27]+128*128; for (j=64-i/2;j<64+i/2;j++) FillMemory(lpFrame[i+28]+j*128+64-i/2,i,128+i); FillMemory(lpFrame[i+28]+i*128,128,255); } FillMemory(lpFrame[8],128*128,2); FillMemory(lpFrame[9],128*128,1); FillMemory(lpFrame[10],128*128,2); ShowWindow (hwMain,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hwMain); dwTime=GetTickCount(); while (1) { /* メインループ */ if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE)) { if (!GetMessage (&msg,NULL,0,0)) /* メッセージ処理 */ return msg.wParam ; TranslateMessage(&msg); DispatchMessage(&msg); } else draw(); /* 描画処理 */ } } void draw(void) { /* メインループ描画処理 */ if (GetTickCount()>dwTime+5) dwTime=GetTickCount(); else /* 前回の処理から5ms 以上経ってなければ戻る */ return; if (dwStart==0) /* 最初の時間を記録 */ dwStart=GetTickCount(); dwIndex=(GetTickCount()-dwStart)/50; /* 1/20秒毎に1増やす */ if (dwIndex>127) { /* 最後まで再生したらまた最初から */ dwIndex=127; dwStart=0; } InvalidateRect(hwMain,NULL,FALSE); UpdateWindow (hwMain); /* フレーム表示 */ } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (iMsg) { case WM_PAINT: hdc=BeginPaint(hwnd,&ps); /* フレームを表示 */ StretchDIBits(hdc,8,8,128,128,0,0,128,128, lpFrame[dwIndex],lpDIB,DIB_RGB_COLORS,SRCCOPY); EndPaint(hwnd,&ps); break; case WM_DESTROY : /* 終了処理 */ GlobalFree(lpBuf); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }