/* 周辺ピクセルとの成分差と輪郭 2000/11/17 宍戸 輝光 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); BOOL readBMP(LPCTSTR); void dif(); HINSTANCE hInst; HWND hwMain; DWORD dwWidth,dwHeight,dwLength; LPBYTE lpDIB,lpBMP; LPBITMAPINFO lpInfo; 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); hwMain = CreateWindow ("CWindow","周辺ピクセルとの成分差と輪郭", 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) { char lpszFn[280]; HDROP hDrop; HDC hdc; PAINTSTRUCT ps; static HWND hwBt; switch (iMsg) { case WM_CREATE: hwBt=CreateWindow("Button","処理",WS_CHILD | WS_VISIBLE, 8,4,64,32,hwnd,(HMENU)0,hInst,NULL); return 0; case WM_DROPFILES: /* ファイルがドロップされた時の処理 */ hDrop=(HDROP)wParam; /* HDROPを取得 */ DragQueryFile(hDrop,0,lpszFn,256); /* ファイル名を取得 */ readBMP(lpszFn); DragFinish(hDrop); /* 終了処理 */ InvalidateRgn(hwMain,NULL,TRUE); UpdateWindow (hwMain); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 0: /* 処理ボタン */ dif(); InvalidateRgn(hwMain,NULL,TRUE); UpdateWindow (hwMain); break; } return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); if (lpDIB!=NULL) /* ビットマップが読み込まれていれば */ StretchDIBits(hdc,4,48,dwWidth,dwHeight, 0,0,dwWidth,dwHeight,lpBMP,lpInfo, DIB_RGB_COLORS,SRCCOPY); /* DIBを画面に描画 */ EndPaint(hwnd,&ps); return 0; case WM_DESTROY : GlobalFree(lpDIB); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } BOOL readBMP(LPCTSTR fn) { /* ビットマップ読み込み */ DWORD offset,dummy; HANDLE fh; GlobalFree(lpDIB); fh=CreateFile(fn,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ lpDIB=(LPBYTE)GlobalAlloc (GPTR,GetFileSize(fh,NULL)); /* バッファ確保 */ ReadFile(fh,lpDIB,GetFileSize(fh,NULL),&dummy,NULL); lpInfo=(LPBITMAPINFO)(lpDIB+sizeof(BITMAPFILEHEADER)); offset=*(LPDWORD)(lpDIB+10); lpBMP=lpDIB+offset; /* ビットマップバッファの先頭アドレス */ CloseHandle(fh); /* 24ビットフルカラービットマップでなければ無効 */ if (lpDIB[0]!='B' || lpInfo->bmiHeader.biBitCount!=24) { GlobalFree(lpDIB); SetWindowText(hwMain,"Error!!"); return FALSE; } /* ビットマップの大きさ保存 */ dwWidth=lpInfo->bmiHeader.biWidth; dwHeight=lpInfo->bmiHeader.biHeight; if (dwWidth % 4==0) /* バッファの1ラインの長さを計算 */ dwLength=dwWidth*3; else dwLength=dwWidth*3+(4-(dwWidth*3) % 4); return TRUE; } void dif() { LPBYTE lpWrk=GlobalAlloc(GPTR,dwLength*dwHeight); DWORD i,j,d; int k; CopyMemory(lpWrk,lpBMP,dwLength*dwHeight); for (i=1;i255) d=255; FillMemory(lpWrk+j*3+i*dwLength,3,(BYTE)d); } CopyMemory(lpBMP,lpWrk,dwLength*dwHeight); GlobalFree(lpWrk); }