// // カラーテーブルで色を変える // // 1998/ 7/14 宍戸 輝光 // #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HINSTANCE hInst; HWND hwnd; LPBYTE lpBuf,lpBit; LPBITMAPINFO lpInfo; LPRGBQUAD lpRGB; RGBQUAD grayPal[256],redPal[256],greenPal[256],bluePal[256]; int WINAPI WinMain (HINSTANCE hIst, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; int i,j,k; hInst=hIst; wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInst; 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, 256,200, NULL, NULL, hIst, NULL); lpBuf=GlobalAlloc // DIB用メモリをまとめて確保 (GPTR,sizeof(BITMAPINFO)+256*sizeof(RGBQUAD)+128*128); lpInfo=(LPBITMAPINFO)lpBuf; // メモリを分配 lpRGB=&lpInfo->bmiColors[0]; // カラーテーブル先頭アドレス lpBit=(BYTE*)(lpBuf+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)); lpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); // BITMAPINFO構造体 lpInfo->bmiHeader.biWidth=128; lpInfo->bmiHeader.biHeight=128; lpInfo->bmiHeader.biPlanes=1; lpInfo->bmiHeader.biBitCount=8; lpInfo->bmiHeader.biCompression=BI_RGB; lpInfo->bmiHeader.biSizeImage=0; lpInfo->bmiHeader.biXPelsPerMeter=0; lpInfo->bmiHeader.biYPelsPerMeter=0; lpInfo->bmiHeader.biClrUsed=0; lpInfo->bmiHeader.biClrImportant=0; for (i=0;i<256;i++) { // パレット作成 grayPal[i].rgbRed=i; // グレースケールパレット作成 grayPal[i].rgbGreen=i; grayPal[i].rgbBlue=i; redPal[i].rgbRed=i; // 赤スケールパレット作成 redPal[i].rgbGreen=0; redPal[i].rgbBlue=0; greenPal[i].rgbRed=0; // 緑スケールパレット作成 greenPal[i].rgbGreen=i; greenPal[i].rgbBlue=0; bluePal[i].rgbRed=0; // 青スケールパレット作成 bluePal[i].rgbGreen=0; bluePal[i].rgbBlue=i; } // カラーテーブルにグレースケールパレットを転送 CopyMemory(lpRGB,grayPal,sizeof(RGBQUAD)*256); for (i=0;i<16;i++) // 各ピクセルにパレットのインデックス設定 for (j=0;j<16;j++) for (k=0;k<8;k++) FillMemory(lpBit+((i*8+k)*128+j*8),8,i*16+j); ShowWindow (hwnd,iCmdShow); // ウインドウを表示 UpdateWindow (hwnd); // 再描画 while (GetMessage (&msg,NULL,0,0)) { // メッセージ処理 TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static HWND hwGrayB,hwRedB,hwGreenB,hwBlueB; switch (iMsg) { case WM_CREATE: hwGreenB=CreateWindow("Button","Gray", // Grayボタン作成 WS_CHILD | WS_VISIBLE,160,8,64,32,hwnd, (HMENU)0,hInst,NULL); hwRedB=CreateWindow("Button","Red", // Redボタン作成 WS_CHILD | WS_VISIBLE,160,48,64,32,hwnd, (HMENU)1,hInst,NULL); hwGreenB=CreateWindow("Button","Green", // Greenボタン作成 WS_CHILD | WS_VISIBLE,160,88,64,32,hwnd, (HMENU)2,hInst,NULL); hwBlueB=CreateWindow("Button","Blue", // Blueボタン作成 WS_CHILD | WS_VISIBLE,160,128,64,32,hwnd, (HMENU)3,hInst,NULL); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 0: // Grayボタン CopyMemory(lpRGB,grayPal,sizeof(RGBQUAD)*256); break; case 1: // Redボタン CopyMemory(lpRGB,redPal,sizeof(RGBQUAD)*256); break; case 2: // Greenボタン CopyMemory(lpRGB,greenPal,sizeof(RGBQUAD)*256); break; case 3: // Blueボタン CopyMemory(lpRGB,bluePal,sizeof(RGBQUAD)*256); break; } InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow (hwnd); // 再描画 return 0; case WM_DESTROY : GlobalFree(lpBuf); // バッファを解放 PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); StretchDIBits(hdc,8,8,128,128,0,0,128,128,lpBit,lpInfo, DIB_RGB_COLORS,SRCCOPY); // DIB描画 EndPaint(hwnd,&ps); } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }