/* 8ビットBMPの読み込み 2001/ 3/ 4 宍戸 輝光 */ #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); BOOL readBMP(LPCTSTR); HINSTANCE hInst; HWND hwMain; LPBYTE lpDIB=NULL; LPDWORD lpPixel; LPBITMAPINFO lpbiInfo; int iWidth,iHeight; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASS wndclass ; hInst=hInstance; /* プロセスのハンドルを保存 */ 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 = "CWindow"; RegisterClass(&wndclass); hwMain=CreateWindow ("CWindow","8ビットBMP読込",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,560,480, NULL,NULL,hInstance,NULL); DragAcceptFiles(hwMain,TRUE); /* ドラッグ&ドロップ受入 */ 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) { HDROP hDrop; HDC hdc; PAINTSTRUCT ps; TCHAR lpszFn[MAX_PATH+1]; switch (iMsg) { case WM_DROPFILES: /* ファイルがドロップされた時の処理 */ hDrop=(HDROP)wParam; /* HDROPを取得 */ DragQueryFile(hDrop,0,lpszFn,256); /* ファイル名を取得 */ readBMP(lpszFn); DragFinish(hDrop); /* 終了処理 */ InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow (hwnd); /* 再描画 */ break; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); if (lpDIB!=NULL) /* ビットマップが読み込まれていれば */ StretchDIBits(hdc,4,4,iWidth,iHeight, 0,0,iWidth,iHeight,lpPixel,lpbiInfo, DIB_RGB_COLORS,SRCCOPY); /* DIBを画面に描画 */ EndPaint(hwnd,&ps); return 0; case WM_DESTROY : if (lpDIB!=NULL) /* DIBと作業用メモリ解放 */ GlobalFree(lpDIB); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } BOOL readBMP(LPCTSTR lpszFn) { /* ビットマップ読み込み */ LPBYTE lpBuf,lpBMP; LPBITMAPINFO lpbiHead; DWORD offset,dummy,*dwColors; int i,j,iLength; HANDLE fh; if (lpDIB!=NULL) /* 以前確保したバッファを解放 */ GlobalFree(lpDIB); fh=CreateFile(lpszFn,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ lpBuf=(LPBYTE)GlobalAlloc (GPTR,GetFileSize(fh,NULL)); /* バッファ確保 */ ReadFile(fh,lpBuf,GetFileSize(fh,NULL),&dummy,NULL); lpbiHead=(LPBITMAPINFO)(lpBuf+sizeof(BITMAPFILEHEADER)); offset=*(LPDWORD)(lpBuf+10); lpBMP=lpBuf+offset; /* ビットマップバッファの先頭アドレス */ CloseHandle(fh); /* 8ビットBMPでなければ無効 */ if (lpBuf[0]!='B' || lpbiHead->bmiHeader.biBitCount!=8) { GlobalFree(lpBuf); return FALSE; } /* ビットマップの大きさ保存 */ iWidth=lpbiHead->bmiHeader.biWidth; iHeight=lpbiHead->bmiHeader.biHeight; /* 32ビットDIB用バッファ確保 */ lpDIB=(LPBYTE)GlobalAlloc(GPTR,(sizeof(BITMAPINFO)+iWidth*iHeight*4)); lpbiInfo=(LPBITMAPINFO)lpDIB; lpPixel=(LPDWORD)(lpDIB+sizeof(BITMAPINFO)); /* BITMAPINFO構造体設定 */ lpbiInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); lpbiInfo->bmiHeader.biWidth=iWidth; lpbiInfo->bmiHeader.biHeight=iHeight; lpbiInfo->bmiHeader.biPlanes=1; lpbiInfo->bmiHeader.biBitCount=32; /* カラーテーブル設定 */ dwColors=(LPDWORD)lpbiHead->bmiColors; if ((iWidth) % 4==0) /* バッファの1ラインの長さを計算 */ iLength=iWidth; else iLength=iWidth+(4-(iWidth) % 4); /* カラーテーブルを参照して各ピクセルのRGBを設定 */ for (i=0;i