/*  GDIビットマップオブジェクトとDIB      1998/ 9/21 宍戸 輝光 */ #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LPBYTE lpBuf,lpBMP; LPBITMAPINFO lpDIB; LPRGBQUAD lpRGB; HWND hwMain; HDC hdcWin,hdcMem; HBITMAP hBMP; HINSTANCE hInst; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass; BYTE lpStr[11]; SIZE s; int i,x,y; hInst=hInstance; 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]; /* カラーテーブルの先頭 */ for (i=0;i<256;i++) { /* グレースケールのカラーテーブル作成 */ lpRGB[i].rgbRed=i; lpRGB[i].rgbGreen=i; lpRGB[i].rgbBlue=i; } for (i=0;i<256*256;i++) /* ビットマップを作成 */ lpBMP[i]=(rand() % 64)+192; 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); hwMain = CreateWindow ("Test Window",NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, 300,300, NULL, NULL, hInstance, NULL); hdcWin=GetDC(hwMain); /* ウインドウのDC を取得 */ /* DIB とウインドウのDC からビットマップを作成 */ hBMP=CreateDIBitmap(hdcWin,(LPBITMAPINFOHEADER)lpDIB, CBM_INIT,lpBMP,lpDIB,DIB_RGB_COLORS); hdcMem=CreateCompatibleDC(hdcWin); /* メモリDC を作成 */ SelectObject(hdcMem,hBMP); /* メモリDC にビットマップを選択 */ lstrcpy(lpStr,"DDB TEST!!"); GetTextExtentPoint32(hdcMem,lpStr,lstrlen(lpStr),&s); x=(256-s.cx)/2; /* 文字列の描画位置計算 */ y=(256-s.cy)/2; SetTextColor(hdcMem,RGB(255,0,0)); SetBkMode(hdcMem,TRANSPARENT); TextOut(hdcMem,x,y,lpStr,lstrlen(lpStr)); ShowWindow (hwMain,iCmdShow); /* ウインドウ表示 */ UpdateWindow (hwMain); 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; RECT r; int x,y; switch (iMsg) { case WM_PAINT: GetClientRect(hwnd,&r); /* クライアント領域取得 */ x=(r.right-256)/2; /* ビットマップの表示位置計算 */ y=(r.bottom-256)/2; hdc=BeginPaint(hwnd,&ps); BitBlt(hdc,x,y,256,256,hdcMem,0,0,SRCCOPY); EndPaint(hwnd,&ps); return 0; case WM_SIZE: InvalidateRect(hwnd,NULL,FALSE); UpdateWindow (hwnd); // 再描画 return 0; case WM_DESTROY : GlobalFree(lpBuf); /* メモリを解放 */ ReleaseDC(hwMain,hdcWin); /* デバイスコンテキスト開放 */ DeleteDC(hdcMem); DeleteObject(hBMP); /* ビットマップ開放 */ PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }