/* ファイルマッピングによるファイル操作    1999/ 3/16 宍戸 輝光 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void toGray(void); HINSTANCE hInst; HWND hwnd; int iWidth,iHeight,iLength; LPBYTE lpBuf,lpBMP; LPBITMAPINFO lpInfo; HANDLE fh,hMap; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; DWORD offset; BYTE lpStr[256]; fh=CreateFile("test.bmp",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ /* ファイルマッピングオブジェクト作成 */ hMap=CreateFileMapping(fh,NULL,PAGE_READWRITE,0,0,NULL); if (hMap==NULL) { MessageBox(NULL,"ファイルをマップできません。",NULL,MB_OK); CloseHandle(fh); return 0; } /* ファイルをマップし、先頭アドレスをlpBufに取得 */ lpBuf=(LPBYTE)MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0); lpInfo=(LPBITMAPINFO)(lpBuf+sizeof(BITMAPFILEHEADER)); offset=*(LPDWORD)(lpBuf+10); lpBMP=lpBuf+offset; /* ビットマップバッファの先頭アドレス */ /* ビットマップの大きさ保存 */ iWidth=lpInfo->bmiHeader.biWidth; iHeight=lpInfo->bmiHeader.biHeight; if ((iWidth*3) % 4==0) /* バッファの1ラインの長さを計算 */ iLength=iWidth*3; else iLength=iWidth*3+(4-(iWidth*3) % 4); if (lpInfo->bmiHeader.biBitCount!=24 || GetFileSize(fh,NULL)bmiHeader.biBitCount); hInst=hInstance; /* プロセスのハンドルを保存 */ 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 = "CWindow"; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); RegisterClassEx (&wndclass); hwnd = CreateWindow ("CWindow","ファイルマッピング",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,560,480, NULL,NULL,hInstance,NULL); SetWindowText(hwnd,lpStr); /* ビットマップの情報表示 */ 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) { static HWND hwOpenB,hwS2B,hwS3B; HDC hdc; PAINTSTRUCT ps; switch (iMsg) { case WM_CREATE: hwOpenB=CreateWindow("Button","白黒化", /* ボタン作成 */ WS_CHILD | WS_VISIBLE,16,8,96,32,hwnd, (HMENU)0,hInst,NULL); return 0; case WM_COMMAND: toGray(); return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); StretchDIBits(hdc,4,48,iWidth,iHeight, 0,0,iWidth,iHeight,lpBMP,lpInfo, DIB_RGB_COLORS,SRCCOPY); /* DIBを画面に描画 */ EndPaint(hwnd,&ps); return 0; case WM_DESTROY : UnmapViewOfFile(lpBuf); CloseHandle(hMap); CloseHandle(fh); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } void toGray(void) { /* ビットマップファイルを白黒化して表示 */ int i,j; BYTE r,g,b,gray; for (i=0;i