/* カラーテーブル変更とフレームレート  1998/ 9/ 6 宍戸 輝光 */ #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void draw(void); LPBYTE lpBuf,lpBMP; LPBITMAPINFO lpDIB; LPRGBQUAD lpRGB; RECT invRect; HWND hWind; DWORD dwTime,dwPreTime,dwCount; int cl,dcl; HINSTANCE hInst; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; int i,j; hInst=hInstance; wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "Test Window"; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); RegisterClassEx (&wndclass); lpBuf=GlobalAlloc /* DIB用メモリ確保 */ (GPTR,sizeof(BITMAPINFO)+255*sizeof(RGBQUAD)+256*256); lpDIB=(LPBITMAPINFO)lpBuf; /* DIB用メモリを分配 */ lpRGB=(RGBQUAD*)(lpBuf+sizeof(BITMAPINFOHEADER)); lpBMP=(BYTE*)(lpBuf+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)); lpDIB->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); /* BITMAPINFO構造体 */ lpDIB->bmiHeader.biWidth=256; lpDIB->bmiHeader.biHeight=256; 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=0; lpRGB[i].rgbBlue=i; } cl=0; dcl=0; /* 最初はカラーテーブルを変更しない */ for (i=0;i<128;i++) /* ビットマップ作成 */ for (j=0;j<256;j++) lpBMP[j+i*256]=192-i-rand() % 8; for (i=0;i<256;i++) lpBMP[(rand() % 256)+((rand() % 128)+128)*256]=rand() % 128+128; for (i=0;i<24;i++) for (j=i;j<64-i;j++) FillMemory(lpBMP+(j+96)*256+96+i,64-i*2,i*4+163); hWind = CreateWindow ("Test Window", "フレームレート", WS_OVERLAPPEDWINDOW, 32,32, 348,320, NULL, NULL, hInstance, NULL); invRect.left=0; /* 更新領域設定 */ invRect.top=0; invRect.right=256; invRect.bottom=288; ShowWindow (hWind,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hWind); /* 再描画 */ 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) { int i; dwPreTime=dwTime; if (GetTickCount()>dwTime+1) dwTime=GetTickCount(); else return; dwCount=dwTime-dwPreTime; /* 前回からの経過時間を記録 */ if (dcl!=0) { /* カラーテーブル変更 */ cl+=dcl; for (i=0;i<256;i++) /* 緑成分を変更 */ lpRGB[i].rgbGreen=cl; if (cl>255) dcl=-1; else if (cl<1) dcl=1; } InvalidateRect(hWind,&invRect,FALSE); UpdateWindow (hWind); // 再描画 } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static HWND hwBut; char lpStr[128]; switch (iMsg) { case WM_CREATE: hwBut=CreateWindow("Button","開始", // ボタン作成 WS_CHILD | WS_VISIBLE,268,32,64,32,hwnd, (HMENU)0,hInst,NULL); return 0; case WM_COMMAND: /* 開始ボタン */ cl=0; dcl=1; return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); StretchDIBits(hdc,0,0,256,256,0,0,256,256,lpBMP,lpDIB, DIB_RGB_COLORS,SRCCOPY); /* DIB を画面に描画 */ if (dwCount!=0) { /* フレームレートを表示 */ wsprintf(lpStr,"FrameRate=%3d",(DWORD)(1000/dwCount)); TextOut(hdc,32,264,lpStr,lstrlen(lpStr)); } EndPaint(hwnd,&ps); return 0; case WM_DESTROY : GlobalFree(lpBuf); /* メモリを解放 */ PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }