わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

クリップボードからビットマップを取得する

クリップボードからテキストを取得します。 IsClipboardFormatAvailable()関数で、データが存在するかを問い合わせて、 GetClipboardData()関数で取得します。サンプルプログラムでは、表示され たウインドウを左クリックする毎に、クリップボードの内容を取得して、 ウインドウに描画します。

#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <windows.h>
#include <wingdi.h>



/*
	ビットマップのコピー
*/
HBITMAP CopyBitmap
(
	HBITMAP hSrcBitmap
)
{
	BITMAP tBitmap;

	// ビットマップ情報の取得
	::GetObject( hSrcBitmap , sizeof( tBitmap ) , &tBitmap );

	HDC hDC = ::GetDC( NULL );

	// ビットマップの生成
	HBITMAP hDstBitmap = ::CreateCompatibleBitmap( hDC, tBitmap.bmWidth, tBitmap.bmHeight );

	// メモリデバイスコンテキストの取得
	HDC hSrcDC = ::CreateCompatibleDC( hDC );
	HDC hDstDC = ::CreateCompatibleDC( hDC );

	// 画像の選択
	::SelectObject( hSrcDC, hSrcBitmap );
	::SelectObject( hDstDC, hDstBitmap );

	// 画像のコピー
	::BitBlt( hDstDC, 0, 0, tBitmap.bmWidth, tBitmap.bmHeight, hSrcDC, 0, 0, SRCCOPY );

	// hDCの破棄
	::DeleteDC( hSrcDC );
	::DeleteDC( hDstDC );

	// hDCの解放
	::ReleaseDC( NULL, hDC );

	// コピーを返す
	return( hDstBitmap );
}


/*
	メインウインドウイベント処理
*/
LRESULT CALLBACK eMainWindowProc(
	  HWND   hwnd   // handle to window
	, UINT   uMsg   // message identifier
	, WPARAM wParam // first message parameter
	, LPARAM lParam // second message parameter
);



HBITMAP g_hBitmap = NULL;



int _tmain
(
	  int argc
	, _TCHAR* argv[]
)
{
	// 標準出力にユニコードを表示できるようにする
	setlocale( LC_ALL, "Japanese" );

	WNDCLASSEX tWndClass;
	HINSTANCE  hInstance;
	TCHAR*     cpClassName;
	TCHAR*     cpWindowName;
	TCHAR*     cpMenu;
	HWND       hWnd;
	MSG        tMsg;


	// アプリケーションインスタンス
	hInstance    = ::GetModuleHandle( NULL );

	// クラス名称
	cpClassName  = _T("MainWindowClass");

	// メニュー
	cpMenu       = MAKEINTRESOURCE( NULL );

	// ウインドウ名称
	cpWindowName = _T("クリップボードからビットマップを取得する");

	// ウインドウクラスパラメータセット
	tWndClass.cbSize        = sizeof( WNDCLASSEX );
	tWndClass.style         = CS_HREDRAW | CS_VREDRAW;
	tWndClass.lpfnWndProc   = eMainWindowProc;
	tWndClass.cbClsExtra    = 0;	// ::GetClassLong で取得可能なメモリ
	tWndClass.cbWndExtra    = 0;	// ::GetWindowLong で取得可能なメモリ
	tWndClass.hInstance     = hInstance; 
	tWndClass.hIcon         = ::LoadIcon( NULL, IDI_APPLICATION );
	tWndClass.hCursor       = ::LoadCursor( NULL, IDC_ARROW );
	tWndClass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
	tWndClass.lpszMenuName  = cpMenu;
	tWndClass.lpszClassName = cpClassName;
	tWndClass.hIconSm       = NULL;

	// ウインドウクラス生成
	if ( 0 == ::RegisterClassEx( &tWndClass ) ) {

		/* 失敗 */
		return( -1 );
	}

	// ウインドウを生成する
	hWnd = ::CreateWindowEx (
		  0                       // extended window style
		, tWndClass.lpszClassName // pointer to registered class name
		, cpWindowName            // pointer to window name
		, WS_OVERLAPPEDWINDOW     // window style
		, CW_USEDEFAULT           // horizontal position of window
		, CW_USEDEFAULT           // vertical position of window
		, 640                     // window width
		, 480                     // window height
		, NULL                    // handle to parent or owner window
		, NULL                    // handle to menu, or child-window identifier
		, hInstance               // handle to application instance
		, (VOID*)0x12345678       // pointer to window-creation data
	);


	/*
		メッセージループ
	*/
	while( 0 != ::GetMessage( &tMsg, NULL, 0, 0 ) ) {
		::TranslateMessage ( &tMsg );
		::DispatchMessage ( &tMsg );
	}

	// WM_QUITの終了コードを返却する
	return( tMsg.wParam );
}



/*
	メインウインドウイベント処理
*/
LRESULT CALLBACK eMainWindowProc
(
	  HWND   hWnd   // handle to window
	, UINT   uMsg   // message identifier
	, WPARAM wParam // first message parameter
	, LPARAM lParam // second message parameter
)
{
	switch( uMsg ) {
	case WM_CREATE:
	//--------------------------------------------
	// WM_CREATE
	//--------------------------------------------
		{
			CREATESTRUCT* tpCreateSt = (CREATESTRUCT*)lParam;

			// ウインドウを表示する
			::ShowWindow( hWnd, SW_SHOW );
		}
		break;


	case WM_DESTROY:
	//--------------------------------------------
	// WM_DESTROY
	//--------------------------------------------
		{
			if ( NULL != g_hBitmap ) {
				::DeleteObject( g_hBitmap );
			}

			// 終了する( 引数はそのまま終了コードとなります )
			::PostQuitMessage( 0 );
		}
		break;


	case WM_LBUTTONDOWN:
	//--------------------------------------------
	// WM_LBUTTONDOWN
	//--------------------------------------------
		{
			// 指定した形式のデータがあるかを問い合わせる
			BOOL bRet = ::IsClipboardFormatAvailable( CF_BITMAP );
			if ( 0 == bRet ) {
				wprintf( L"データがありません" );
				break;
			}

			// クリップボードのオープン
			bRet = ::OpenClipboard( hWnd );
			if ( 0 == bRet ) {
				wprintf( L"クリップボードのオープン失敗" );
				break;
			}

			// クリップボードデータの取得
			HBITMAP hBitmap = (HBITMAP)::GetClipboardData( CF_BITMAP );
			if ( NULL != hBitmap ) {

				// コピー済みのデータがあれば破棄
				if ( NULL != g_hBitmap ) {
					::DeleteObject( g_hBitmap );
					g_hBitmap = NULL;
				}

				// ビットマップのコピー
				g_hBitmap = ::CopyBitmap( hBitmap );

				// 再描画
				::InvalidateRect( hWnd, NULL, TRUE );
			}

			// クリップボードのクローズ
			::CloseClipboard();
		}
		break;



	case WM_PAINT:
	//--------------------------------------------
	// WM_PAINT
	//--------------------------------------------
		{
			PAINTSTRUCT tPaintStruct;

			// 描画開始
			HDC hDC = ::BeginPaint( hWnd, &tPaintStruct );
			if ( NULL != g_hBitmap ) {
				RECT tClientRect;

				// クライアント矩形の取得
				::GetClientRect( hWnd, &tClientRect );

				BITMAP tBitmap;

				// ビットマップ情報の取得
				::GetObject( g_hBitmap , sizeof( tBitmap ) , &tBitmap );

				// メモリデバイスコンテキストの取得
				HDC hSrcDC = ::CreateCompatibleDC( hDC );

				// ビットマップの選択
				::SelectObject( hSrcDC, g_hBitmap );

				// ビットマップの描画
				::StretchBlt(
						  hDC
						, 0
						, 0
						, tClientRect.right
						, tClientRect.bottom
						, hSrcDC
						, 0
						, 0
						, tBitmap.bmWidth
						, tBitmap.bmHeight
						, SRCCOPY
					);

				// hDCの破棄
				::DeleteDC( hSrcDC );
			}
			// 描画終了
			::EndPaint( hWnd, &tPaintStruct );
		}
		return( FALSE );
	}

	// デフォルト処理呼び出し
	return ::DefWindowProc( hWnd, uMsg, wParam, lParam );
}

実行結果






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。