/* RGB成分の置換 1999/10/19 宍戸 輝光 */ #include #include #include #define R 0 #define G 1 #define B 2 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); BOOL readBMP(char fn[]); void chngRGB(int,int,int); HINSTANCE hInst; HWND hwnd; DWORD dwWidth,dwHeight,dwLength; BOOL loaded; LPVOID lpDIB; LPBYTE lpBMP1,lpBMP2; 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); hwnd = CreateWindow ("CWindow","RGB成分の置換", 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 char lpszFn[256]; static HWND hwB,hwRMenu,hwGMenu,hwBMenu; int r,g,b; HDROP hDrop; HDC hdc; PAINTSTRUCT ps; switch (iMsg) { case WM_CREATE: hwB=CreateWindow("Button","乱数", /* ボタン作成 */ WS_CHILD |WS_VISIBLE,352,8,96,32,hwnd, (HMENU)0,hInst,NULL); hwRMenu=CreateWindow("COMBOBOX","LIST", /* コンボボックス */ WS_CHILD | WS_VISIBLE | WS_BORDER |CBS_DROPDOWNLIST, 16,8,80,128,hwnd,(HMENU)1,hInst,NULL); /* コンボボックスに項目追加 */ SendMessage(hwRMenu,CB_ADDSTRING,0,(LPARAM)"R=R"); SendMessage(hwRMenu,CB_ADDSTRING,0,(LPARAM)"R=G"); SendMessage(hwRMenu,CB_ADDSTRING,0,(LPARAM)"R=B"); /* デフォルトの項目設定 */ SendMessage(hwRMenu,CB_SELECTSTRING,0,(LPARAM)"R=R"); hwGMenu=CreateWindow("COMBOBOX","LIST", /* コンボボックス */ WS_CHILD | WS_VISIBLE | WS_BORDER |CBS_DROPDOWNLIST, 128,8,80,128,hwnd,(HMENU)2,hInst,NULL); /* コンボボックスに項目追加 */ SendMessage(hwGMenu,CB_ADDSTRING,0,(LPARAM)"G=R"); SendMessage(hwGMenu,CB_ADDSTRING,0,(LPARAM)"G=G"); SendMessage(hwGMenu,CB_ADDSTRING,0,(LPARAM)"G=B"); /* デフォルトの項目設定 */ SendMessage(hwGMenu,CB_SELECTSTRING,0,(LPARAM)"G=G"); hwBMenu=CreateWindow("COMBOBOX","LIST", /* コンボボックス */ WS_CHILD | WS_VISIBLE | WS_BORDER |CBS_DROPDOWNLIST, 240,8,80,128,hwnd,(HMENU)3,hInst,NULL); /* コンボボックスに項目追加 */ SendMessage(hwBMenu,CB_ADDSTRING,0,(LPARAM)"B=R"); SendMessage(hwBMenu,CB_ADDSTRING,0,(LPARAM)"B=G"); SendMessage(hwBMenu,CB_ADDSTRING,0,(LPARAM)"B=B"); /* デフォルトの項目設定 */ SendMessage(hwBMenu,CB_SELECTSTRING,0,(LPARAM)"B=B"); loaded=FALSE; /* 読み込みフラグリセット */ DragAcceptFiles(hwnd,TRUE); /* ドラッグ&ドロップ受入 */ srand((unsigned)time(NULL)); break; case WM_COMMAND: switch (LOWORD(wParam)) { case 0: chngRGB(rand() % 3,rand() % 3,rand() % 3); break; default: /* RGB成分の置換指定を取得 */ r=SendMessage(hwRMenu,CB_GETCURSEL,0,0); g=SendMessage(hwGMenu,CB_GETCURSEL,0,0); b=SendMessage(hwBMenu,CB_GETCURSEL,0,0); chngRGB(r,g,b); } break; case WM_DROPFILES: /* ファイルがドロップされた時の処理 */ hDrop=(HDROP)wParam; /* HDROPを取得 */ DragQueryFile(hDrop,0,lpszFn,256); /* ファイル名を取得 */ readBMP(lpszFn); DragFinish(hDrop); /* 終了処理 */ break; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); if (loaded) /* ビットマップが読み込まれていれば */ StretchDIBits(hdc,4,48,dwWidth,dwHeight, 0,0,dwWidth,dwHeight,lpBMP2,lpInfo, DIB_RGB_COLORS,SRCCOPY); /* DIBを画面に描画 */ EndPaint(hwnd,&ps); break; case WM_DESTROY : if (loaded) { GlobalFree(lpDIB); GlobalFree(lpBMP2); } PostQuitMessage(0); break; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } BOOL readBMP(char fn[]) { /* ビットマップ読み込み */ DWORD offset,dummy; HANDLE fh; if (loaded) { /* 以前確保したバッファを解放 */ GlobalFree(lpDIB); GlobalFree(lpBMP2); } 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)((LPBYTE)lpDIB+sizeof(BITMAPFILEHEADER)); offset=*(LPDWORD)((LPBYTE)lpDIB+10); lpBMP1=(LPBYTE)lpDIB+offset; /* ビットマップバッファの先頭アドレス */ CloseHandle(fh); /* 24ビットフルカラービットマップでなければ無効 */ if (((LPBYTE)lpDIB)[0]!='B' || lpInfo->bmiHeader.biBitCount!=24) { GlobalFree(lpDIB); GlobalFree(lpBMP2); loaded=FALSE; 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); loaded=TRUE; /* 読み込みフラグセット */ lpBMP2=GlobalAlloc(GPTR,dwLength*dwHeight); CopyMemory(lpBMP2,lpBMP1,dwLength*dwHeight); InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow (hwnd); /* 再描画 */ return TRUE; } void chngRGB(int red,int green,int blue) { DWORD i,j; BYTE r,g,b; for (i=0;i