// //  16ビットDIBテスト // // 1998/ 5/11 宍戸 輝光 // #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LPBYTE lpBuf; LPWORD lpBMP; LPBITMAPINFO lpInfo; 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", "16BitDIB Test", WS_OVERLAPPEDWINDOW, 32,32, 256,256, NULL, NULL, hInstance, NULL); lpBuf=GlobalAlloc // 必要なメモリをまとめて確保 (GPTR,sizeof(BITMAPINFO)+128*128*2); lpInfo=(LPBITMAPINFO)lpBuf; // メモリを分配 lpBMP=(LPWORD)(lpBuf+sizeof(BITMAPINFO)); lpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); // BITMAPINFO構造体 lpInfo->bmiHeader.biWidth=128; lpInfo->bmiHeader.biHeight=128; lpInfo->bmiHeader.biPlanes=1; lpInfo->bmiHeader.biBitCount=16; 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<32;i++) // 各ピクセルに色を付ける for (j=0;j<4;j++) for (k=0;k<128;k++) lpBMP[k+(j+i*4)*128]=(i << 10)+(i << 5)+i; 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,lpBMP,lpInfo, DIB_RGB_COLORS,SRCCOPY); // DIBを画面に描画 EndPaint(hwnd,&ps); } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }