第95章 クリップボード その2


今回は、クリップボードからビットマップを読み込んで 表示するプログラムを考えます。

基本的にはGetClipboardData(CF_BITMAP);で読み込むことができます。 では、早速プログラムを見てみましょう。

// clip02.rcの一部 // 自分で作る人はwindows.hとシンボル定義のヘッダーファイルをインクルード ///////////////////////////////////////////////////////////////////////////// // // Menu // MYMENU MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "終了(&X)", IDM_END END MENUITEM "最新表示(&R)", IDM_REDRAW END

これは、単なるメニューのリソースです。

// clip02.cpp #define STRICT #include <windows.h> #include "resource.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); BOOL InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); char szClassName[] = "clip02"; //ウィンドウクラス int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }

いつもと同じです。

//ウィンドウ・クラスの登録 BOOL InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; //インスタンス wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "MYMENU"; //メニュー名 wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); return (RegisterClassEx(&wc)); }

これもいつもと同じです。

//ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, "猫でもわかるクリップボード",//タイトルバーにこの名前が表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL,//親ウィンドウのハンドル、親を作るときはNULL NULL,//メニューハンドル、クラスメニューを使うときはNULL hInst,//インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }

これも、いつもと全く同じです。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; HDC hdc, hdc_mem; PAINTSTRUCT ps; HBITMAP hBitmap; BITMAP bm; switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); if (IsClipboardFormatAvailable(CF_BITMAP)) { OpenClipboard(hWnd); hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP); hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem, hBitmap); GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm); BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdc_mem, 0, 0, SRCCOPY); DeleteDC(hdc_mem); CloseClipboard(); } EndPaint(hWnd, &ps); break; case WM_COMMAND: switch (LOWORD(wp)) { case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0L); break; case IDM_REDRAW: InvalidateRect(hWnd, NULL, TRUE); break; } break; case WM_CLOSE: id = MessageBox(hWnd, (LPCSTR)"終了してもよいですか", (LPCSTR)"終了確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0L; }

GetClipboardDataでhBitmapを取得したら、あとはいつものように ビットマップを表示すれば良いことになります。しかし、hBitmap を破棄してはいけません。(破棄するとどうなるかは実験すればわかります) また、このプログラムでは、クリップボードのビットマップが違うものに なっても関知することはできません。その場合はメニューから「最新表示」 を選択します。これによってクライアント領域が再描画され、最新の クリップボードのデータを取得できます。

[SDK Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Dec/24/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。