クリップボードからテキストを取得します。 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 );
}
