// // DIB(デバイス独立ビットマップ)テスト // // 1998/ 5/ 5 宍戸 輝光 // #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LPBYTE lpBuf,lpBit; LPBITMAPINFO lpInfo; LPRGBQUAD lpRGB; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ HWND hwnd; MSG msg; WNDCLASSEX wndclass ; int i,j,k; 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", "256DIB Test", WS_OVERLAPPEDWINDOW, 32,32, 256,256, NULL, NULL, hInstance, NULL); lpBuf=GlobalAlloc // 必要なメモリをまとめて確保 (GPTR,sizeof(BITMAPINFO)+255*sizeof(RGBQUAD)+128*128); lpInfo=(LPBITMAPINFO)lpBuf; // メモリを分配 lpRGB=(RGBQUAD*)(lpBuf+sizeof(BITMAPINFOHEADER)); 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; lpInfo->bmiColors[0]=lpRGB[0]; // カラーテーブルの先頭 for (i=0;i<256;i++) // カラーテーブル作成 lpRGB[i].rgbRed=lpRGB[i].rgbGreen=lpRGB[i].rgbBlue=i; 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; switch (iMsg) { case WM_DESTROY : GlobalFree(lpBuf); // バッファを解放 PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); StretchDIBits(hdc,0,0,128,128,0,0,128,128,lpBit,lpInfo, DIB_RGB_COLORS,SRCCOPY); EndPaint(hwnd,&ps); } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }