#include #define WIDTH 197 #define HEIGHT 100 #define BITCOUNT 16 //8ビットを5ビットに近似する //本質:bit8/(255.0/31.0) #define TO85(bit8) ((BYTE)(bit8*31.0/255.0+0.5)) //5ビットを8ビットに変換する #define TO58(bit5) ((BYTE)(bit5*255.0/31.0+0.5)) LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static LPWORD lpPixel; static BITMAPINFO bmpInfo; int x,y,r,g,b,rgb; static int length; switch(uMsg) { case WM_CREATE: //4の倍数に補正 if(WIDTH*(BITCOUNT/8)%4) length=WIDTH*(BITCOUNT/8)+(4-WIDTH*(BITCOUNT/8)%4); else length=WIDTH*(BITCOUNT/8); lpPixel=(LPWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,length*HEIGHT); //DIBの情報を設定する bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth=WIDTH; bmpInfo.bmiHeader.biHeight=HEIGHT; bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=BITCOUNT; bmpInfo.bmiHeader.biCompression=BI_RGB; //描画 r=TO85(255); g=TO85(128); b=0; rgb=(r<<10)+(g<<5)+b; for(y=25;y<=50;y++){ for(x=25;x<=50;x++){ CopyMemory((LPBYTE)lpPixel+x*2+y*length,&rgb,2); } //(255,128,0)8 → (31,16,0)5 → (255,132,0)8 } return 0; case WM_DESTROY: HeapFree(GetProcessHeap(),0,lpPixel); PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); //表画面へ転送 StretchDIBits(hdc,0,0,WIDTH,HEIGHT, 0,0,WIDTH,HEIGHT,lpPixel,&bmpInfo,DIB_RGB_COLORS,SRCCOPY); EndPaint(hWnd,&ps); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__,"16ビットDIBを作る", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } return (int)msg.wParam; }