/*   ビットマップの拡大・縮小関数   1999/ 9/ 9 宍戸 輝光 */ #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); BOOL readBMP(char fn[]); void resizeBMP(DWORD,DWORD,DWORD,DWORD,LPVOID*); HINSTANCE hInst; HWND hwnd,hwWidth,hwHeight; DWORD dwWidth,dwHeight,dwLength; BOOL loaded; LPVOID lpBMP; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; 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); DragAcceptFiles(hwnd,TRUE); /* ドラッグ&ドロップ受入 */ 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 hwResize; static char lpszFn[MAX_PATH+1],lpszStr[16]; HDROP hDrop; HDC hdc; PAINTSTRUCT ps; DWORD w,h; static RECT rec; switch (iMsg) { case WM_CREATE: hwResize=CreateWindow("Button","サイズ変更", /* ボタン作成 */ WS_CHILD | WS_VISIBLE,16,8,96,32,hwnd, (HMENU)0,hInst,NULL); hwWidth=CreateWindow("Edit",NULL,WS_CHILD | WS_VISIBLE |WS_BORDER | ES_NUMBER, 128,8,64,26,hwnd,(HMENU)1,hInst,NULL); hwHeight=CreateWindow("Edit",NULL,WS_CHILD | WS_VISIBLE |WS_BORDER | ES_NUMBER, 200,8,64,26,hwnd,(HMENU)2,hInst,NULL); loaded=FALSE; /* 読み込みフラグリセット */ return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 0: /* サイズ変更ボタン */ if (GetWindowText(hwWidth,lpszStr,16)>0) { w=atoi(lpszStr); if (w<1) w=dwWidth; } else w=dwWidth; if (GetWindowText(hwHeight,lpszStr,16)>0) { h=atoi(lpszStr); if (h<1) h=dwHeight; } else h=dwHeight; resizeBMP(dwWidth,dwHeight,w,h,&lpBMP); /* 拡大・縮小 */ dwWidth=w; /* ビットマップの大きさ再設定 */ dwHeight=h; if ((dwWidth*3) % 4==0) dwLength=dwWidth*3; else dwLength=dwWidth*3+(4-(dwWidth*3) % 4); wsprintf(lpszStr,"%d",dwWidth); SetWindowText(hwWidth,lpszStr); wsprintf(lpszStr,"%d",dwHeight); SetWindowText(hwHeight,lpszStr); InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow (hwnd); /* 再描画 */ break; } break; case WM_DROPFILES: /* ファイルがドロップされた時の処理 */ hDrop=(HDROP)wParam; /* HDROPを取得 */ DragQueryFile(hDrop,0,lpszFn,256); /* ファイル名を取得 */ EnableWindow(hwResize,readBMP(lpszFn)); DragFinish(hDrop); /* 終了処理 */ return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); GetClientRect(hwnd,&rec); FillRect(hdc,&rec,GetStockObject(WHITE_BRUSH)); if (loaded) /* ビットマップが読み込まれていれば */ StretchDIBits(hdc,4,48,dwWidth,dwHeight, 0,0,dwWidth,dwHeight,(LPBYTE)((LPBYTE)lpBMP+sizeof(BITMAPINFO)), (LPBITMAPINFO)lpBMP,DIB_RGB_COLORS,SRCCOPY); /* DIBを画面に描画 */ EndPaint(hwnd,&ps); return 0; case WM_DESTROY : if (loaded) { /* DIB解放 */ GlobalFree(lpBMP); } PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } BOOL readBMP(char fn[]) { /* ビットマップ読み込み */ char lpStr[280]; DWORD dwOffset,dummy; LPBITMAPINFO lpInfo; LPVOID lpWork; HANDLE fh; fh=CreateFile(fn,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ lpWork=GlobalAlloc(GPTR,GetFileSize(fh,NULL)); /* バッファ確保 */ ReadFile(fh,lpWork,GetFileSize(fh,NULL),&dummy,NULL); CloseHandle(fh); lpInfo=(LPBITMAPINFO)((LPBYTE)lpWork+sizeof(BITMAPFILEHEADER)); /* 24ビットフルカラービットマップでなければ無効 */ if (*(LPBYTE)lpWork!='B' || lpInfo->bmiHeader.biBitCount!=24) { GlobalFree(lpWork); loaded=FALSE; SetWindowText(hwnd,"Error!!"); return FALSE; } /* ビットマップの大きさ保存 */ dwWidth=lpInfo->bmiHeader.biWidth; dwHeight=lpInfo->bmiHeader.biHeight; if ((dwWidth*3) % 4==0) /* バッファの1ラインの長さを計算 */ dwLength=dwWidth*3; else dwLength=dwWidth*3+(4-(dwWidth*3) % 4); lpBMP=GlobalAlloc(GPTR,dwLength*dwHeight+sizeof(BITMAPINFO)); CopyMemory(lpBMP,lpInfo,sizeof(BITMAPINFO)); dwOffset=*(LPDWORD)((LPBYTE)lpWork+10); CopyMemory((LPBYTE)lpBMP+sizeof(BITMAPINFO),(LPBYTE)lpWork+dwOffset,dwLength*dwHeight); GlobalFree(lpWork); loaded=TRUE; /* 読み込みフラグセット */ wsprintf(lpStr,"%d",dwWidth); SetWindowText(hwWidth,lpStr); wsprintf(lpStr,"%d",dwHeight); SetWindowText(hwHeight,lpStr); InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow (hwnd); /* 再描画 */ return TRUE; } /* ビットマップの拡大・縮小処理 */ void resizeBMP(DWORD sw,DWORD sh,DWORD width,DWORD height,LPVOID *lpSRC) { LPBITMAPINFO lpInfo; LPVOID lpWork; LPBYTE lpPixel,lpSPixel; DWORD i,j,x,y,dwSLength,dwWidth,dwHeight,dwLength; if ((sw*3) % 4==0) /* 元画像の1ラインの長さを計算 */ dwSLength=sw*3; else dwSLength=sw*3+(4-(sw*3) % 4); if ((width*3) % 4==0) /* ビットマップの1ラインの長さを計算 */ dwLength=width*3; else dwLength=width*3+(4-(width*3) % 4); /* 作業用バッファを確保し元画像をコピー */ lpWork=GlobalAlloc(GPTR,GlobalSize(*lpSRC)); CopyMemory(lpWork,*lpSRC,GlobalSize(*lpSRC)); dwWidth=width; dwHeight=height; /* ビットマップのメモリ再確保 */ GlobalFree(*lpSRC); *lpSRC=GlobalAlloc(GPTR,sizeof(BITMAPINFO)+dwLength*dwHeight); /* ビットマップのBITMAPINFO構造体をコピー */ CopyMemory(*lpSRC,lpWork,sizeof(BITMAPINFO)); /* ビットマップの大きさ設定 */ lpInfo=*lpSRC; lpInfo->bmiHeader.biWidth=dwWidth; lpInfo->bmiHeader.biHeight=dwHeight; /* ビットマップと元画像のビットマップバッファ取得 */ lpPixel=(LPBYTE)((LPBYTE)*lpSRC+sizeof(BITMAPINFO)); lpSPixel=(LPBYTE)((LPBYTE)lpWork+sizeof(BITMAPINFO)); for (i=0;i