/* カスタムフィルタで遊ぶ 2000/ 3/ 5 宍戸 輝光 */ #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); BOOL readBMP(LPCTSTR); void Filter(void); void toGray(void); HINSTANCE hInst; HWND hwMain,hwBt,hwBtg,hwEd[3][3],hwEdv,hwEdp,hwLv,hwLp; LPBYTE lpDIB,lpPixel; LPBITMAPINFO lpbiInfo; BOOL loaded; DWORD dwWidth,dwHeight,dwLength; double dFil[3][3]={{0,0,1},{0,0,0},{-1,0,0}},dDiv=1,dPls=128; 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(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; RegisterClass(&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) { HDROP hDrop; HDC hdc; PAINTSTRUCT ps; static TCHAR lpszFn[MAX_PATH+1],lpszBuf[64]; int i,j; switch (iMsg) { case WM_CREATE: hwBt=CreateWindow("Button","処理",WS_CHILD | WS_VISIBLE, 8,4,64,32,hwnd,(HMENU)0,hInst,NULL); hwBtg=CreateWindow("Button","白黒化",WS_CHILD | WS_VISIBLE, 80,4,72,32,hwnd,(HMENU)1,hInst,NULL); EnableWindow(hwBt,FALSE); EnableWindow(hwBtg,FALSE); for (i=0;i<3;i++) for (j=0;j<3;j++) hwEd[j][i]=CreateWindow("Edit",NULL,WS_CHILD | WS_VISIBLE |WS_BORDER, 168+j*56,4+(2-i)*24,48,22,hwnd,(HMENU)(j+i*3+2),hInst,NULL); hwLv=CreateWindow("STATIC","除算値",WS_CHILD | WS_VISIBLE|SS_CENTER, 340,30,56,22,hwnd,(HMENU)11,hInst,NULL); hwEdv=CreateWindow("Edit",NULL,WS_CHILD | WS_VISIBLE |WS_BORDER, 344,52,48,22,hwnd,(HMENU)12,hInst,NULL); hwLp=CreateWindow("STATIC","加算値",WS_CHILD | WS_VISIBLE|SS_CENTER, 404,30,56,22,hwnd,(HMENU)11,hInst,NULL); hwEdp=CreateWindow("Edit",NULL,WS_CHILD | WS_VISIBLE |WS_BORDER, 408,52,48,22,hwnd,(HMENU)14,hInst,NULL); for (i=0;i<3;i++) for (j=0;j<3;j++) { sprintf(lpszBuf,"%g",dFil[j][i]); SetWindowText(hwEd[j][i],lpszBuf); } sprintf(lpszBuf,"%g",dDiv); SetWindowText(hwEdv,lpszBuf); sprintf(lpszBuf,"%g",dPls); SetWindowText(hwEdp,lpszBuf); break; case WM_COMMAND: switch (LOWORD(wParam)) { case 0: /* 処理ボタン */ for (i=0;i<3;i++) /* フィルタの行列取得 */ for (j=0;j<3;j++) { GetWindowText(hwEd[j][i],lpszBuf,64); dFil[j][i]=atof(lpszBuf); sprintf(lpszBuf,"%g",dFil[j][i]); SetWindowText(hwEd[j][i],lpszBuf); } GetWindowText(hwEdv,lpszBuf,64); dDiv=atof(lpszBuf); if (dDiv==0) dDiv=1; sprintf(lpszBuf,"%g",dDiv); SetWindowText(hwEdv,lpszBuf); GetWindowText(hwEdp,lpszBuf,64); dPls=atof(lpszBuf); sprintf(lpszBuf,"%g",dPls); SetWindowText(hwEdp,lpszBuf); Filter(); /* フィルタ処理 */ InvalidateRgn(hwnd,NULL,TRUE); UpdateWindow (hwnd); /* 再描画 */ break; case 1: /* 白黒化ボタン */ toGray(); InvalidateRgn(hwnd,NULL,TRUE); UpdateWindow (hwnd); /* 再描画 */ break; } break; case WM_DROPFILES: /* ファイルがドロップされた時の処理 */ hDrop=(HDROP)wParam; /* HDROPを取得 */ DragQueryFile(hDrop,0,lpszFn,256); /* ファイル名を取得 */ if (lstrcmpi(lpszFn+lstrlen(lpszFn)-4,".bmp")==0) /* BMP */ loaded=readBMP(lpszFn); DragFinish(hDrop); /* 終了処理 */ InvalidateRgn(hwnd,NULL,TRUE); UpdateWindow (hwnd); /* 再描画 */ break; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); if (loaded) /* ビットマップが読み込まれていれば */ StretchDIBits(hdc,4,80,dwWidth,dwHeight, 0,0,dwWidth,dwHeight,lpPixel,lpbiInfo, DIB_RGB_COLORS,SRCCOPY); /* DIBを画面に描画 */ EndPaint(hwnd,&ps); break; case WM_DESTROY : if (loaded) /* DIBメモリ解放 */ GlobalFree(lpDIB); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } BOOL readBMP(LPCTSTR lpszFn) { /* ビットマップ読み込み */ DWORD offset,dummy; HANDLE fh; if (loaded) /* 以前確保したバッファを解放 */ GlobalFree(lpDIB); fh=CreateFile(lpszFn,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ lpDIB=(LPBYTE)GlobalAlloc (GPTR,GetFileSize(fh,NULL)); /* DIBバッファ確保 */ ReadFile(fh,lpDIB,GetFileSize(fh,NULL),&dummy,NULL); lpbiInfo=(LPBITMAPINFO)(lpDIB+sizeof(BITMAPFILEHEADER)); offset=*(LPDWORD)(lpDIB+10); lpPixel=lpDIB+offset; /* ビットマップバッファの先頭アドレス */ CloseHandle(fh); /* 24ビットフルカラービットマップでなければ無効 */ if (lpDIB[0]!='B' || lpbiInfo->bmiHeader.biBitCount!=24) { GlobalFree(lpDIB); loaded=FALSE; EnableWindow(hwBt,FALSE); EnableWindow(hwBtg,FALSE); return FALSE; } /* ビットマップの大きさ保存 */ dwWidth=lpbiInfo->bmiHeader.biWidth; dwHeight=lpbiInfo->bmiHeader.biHeight; if ((dwWidth*3) % 4==0) /* バッファの1ラインの長さを計算 */ dwLength=dwWidth*3; else dwLength=dwWidth*3+(4-(dwWidth*3) % 4); EnableWindow(hwBt,TRUE); EnableWindow(hwBtg,TRUE); return TRUE; } void Filter(void) { LPBYTE lpWrk; DWORD i,j,k,l; double dr,dg,db; lpWrk=(LPBYTE)GlobalAlloc(GPTR,dwLength*dwHeight); CopyMemory(lpWrk,lpPixel,dwLength*dwHeight); for (i=1;i255) dr=255; if (dg<0) dg=0; if (dg>255) dg=255; if (db<0) db=0; if (db>255) db=255; lpWrk[j*3+i*dwLength+2]=(BYTE)dr; lpWrk[j*3+i*dwLength+1]=(BYTE)dg; lpWrk[j*3+i*dwLength]=(BYTE)db; } CopyMemory(lpPixel,lpWrk,dwLength*dwHeight); GlobalFree(lpWrk); } void toGray() { DWORD i,j,gr; double r,g,b; for (i=0;i255) gr=255; FillMemory(lpPixel+j*3+i*dwLength,3,gr); } }