/* DIB(デバイス独立ビットマップ)の作成 2005/ 1/ 2 宍戸 輝光 */ #include HINSTANCE g_hInstance; HWND g_hwMain; /* DIB用変数 */ BITMAPINFO g_biDIB; LPDWORD g_lppxDIB; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; WNDCLASS wndclass; g_hInstance = hInstance; /* DIB用BITMAPINFOをクリア */ ZeroMemory(&g_biDIB, sizeof(g_biDIB)); /* DIB用BITMAPINFO設定 */ g_biDIB.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); g_biDIB.bmiHeader.biWidth = 256; g_biDIB.bmiHeader.biHeight = 256; g_biDIB.bmiHeader.biPlanes = 1; g_biDIB.bmiHeader.biBitCount = 32; g_biDIB.bmiHeader.biCompression = BI_RGB; /* DIB用ピクセル列確保 */ g_lppxDIB = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 256 * 256 * 4); /* (16, 31)に赤い点(0x00ff0000)を打つ */ g_lppxDIB[16 + 31 * 256] = 0x00ff0000; /* (16, 32)に赤い点(0x00ff0000)を打つ */ g_lppxDIB[16 + 32 * 256] = 0x00ff0000; /* ウインドウクラス設定 */ 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 = "DIBFIRST"; RegisterClass(&wndclass); /* ウインドウ作成 */ g_hwMain = CreateWindow("DIBFIRST", "DIBの作成", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, 320, 320, NULL, NULL, hInstance, NULL); /* ウインドウを表示 */ ShowWindow(g_hwMain, iCmdShow); /* メインループ */ do { /* メッセージ処理 */ if (GetMessage(&msg,NULL,0,0) == 0) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } while (TRUE); /* DIB用ピクセル列解放 */ HeapFree(GetProcessHeap(), 0, g_lppxDIB); return (int)msg.wParam; } /* ウインドウプロシージャー */ LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (iMsg) { case WM_PAINT: /* 描画処理 */ hdc = BeginPaint(hwnd, &ps); /* DIB描画 */ StretchDIBits(hdc, 0, 0, 256, 256, 0, 0, 256, 256, g_lppxDIB, &g_biDIB, DIB_RGB_COLORS, SRCCOPY); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: /* 終了処理 */ PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam); }