/* フェードイン・フェードアウト  1998/ 9/ 2 宍戸 輝光 */ #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void draw(void); LRESULT CALLBACK PalProc (HWND, UINT, WPARAM, LPARAM); LPBYTE lpBuf,lpBMP; LPBITMAPINFO lpDIB; LPRGBQUAD lpRGB; RGBQUAD Palette[512][256]; RECT invRect; HWND hWind; DWORD tm; 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); for (i=-255;i<1;i++) /* カラーテーブル配列作成 */ for (j=0;j<256;j++) if (i+j>=0) { Palette[i+255][j].rgbRed=i+j; Palette[i+255][j].rgbGreen=i+j; Palette[i+255][j].rgbBlue=i+j; } else { Palette[i+255][j].rgbRed=0; Palette[i+255][j].rgbGreen=0; Palette[i+255][j].rgbBlue=0; } for (i=256;i<512;i++) for (j=0;j<256;j++) if ((i-256)+j<256) { Palette[i][j].rgbRed=i-256+j; Palette[i][j].rgbGreen=i-256+j; Palette[i][j].rgbBlue=i-256+j; } else { Palette[i][j].rgbRed=255; Palette[i][j].rgbGreen=255; Palette[i][j].rgbBlue=255; } 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]; /* カラーテーブルの先頭 */ cl=256; /* カラーテーブルの初期設定 */ CopyMemory(lpRGB,&Palette[cl],sizeof(RGBQUAD)*256); 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=256; ShowWindow (hWind,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hWind); /* 再描画 */ 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) { if (GetTickCount()>tm+20) tm=GetTickCount(); else /* 前回の処理から20ms 以上経ってなければ戻る */ return; if (cl>510) dcl=-1; else if (cl<1) dcl=1; cl+=dcl; /* カラーテーブル変更 */ CopyMemory(lpRGB,&Palette[cl],sizeof(RGBQUAD)*256); InvalidateRect(hWind,&invRect,FALSE); UpdateWindow (hWind); // 再描画 } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static HWND hwBut; 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=256; 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 を画面に描画 */ EndPaint(hwnd,&ps); return 0; case WM_DESTROY : GlobalFree(lpBuf); /* メモリを解放 */ PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }