/* PeekMessageによるメインループ  1998/ 8/26 宍戸 輝光 */ #include #include void draw(void); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LPBYTE lpBuf,lpBMP; LPBITMAPINFO lpDIB; LPRGBQUAD lpRGB; HWND hwnd; DWORD tm; 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 = 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); hwnd = CreateWindow ("Test Window", "メインループ", WS_OVERLAPPEDWINDOW, 32,32, 288,300, NULL, NULL, hInstance, NULL); 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=(int)(i/2); lpRGB[i].rgbGreen=64+(int)(i/2); lpRGB[i].rgbBlue=128+(int)(i/2); } for (i=0;i<256;i++) /* ビットマップを初期化 */ for (j=0;j<256;j++) lpBMP[j+i*256]=rand() % 256; ShowWindow (hwnd,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hwnd); /* 再描画 */ tm=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; if (GetTickCount()>tm+16) tm=GetTickCount(); else /* 前回の処理から16ms 以上経ってなければ戻る */ return; MoveMemory(lpBMP,lpBMP+256,256*255); /* 一ピクセル下に移動 */ for (i=0;i<256;i++) /* 一番上の列のピクセルを描画 */ lpBMP[i+255*256]=rand() % 255; InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow (hwnd); /* 再描画 */ } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (iMsg) { case WM_DESTROY : GlobalFree(lpBuf); /* メモリを解放 */ GlobalFree(lpBMP); PostQuitMessage(0); 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 を画面に描画 */ EndPaint(hwnd,&ps); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }