開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 プロジェクト
プロジェクト名 OlePicture
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode


OlePicture.cpp
#include <Windows.h>
#include <OleCtl.h>
#include "resource.h"
 
// 関数プロトタイプ宣言
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void OnPaint(HWND hWnd);
void OnEditPaste(HWND hWnd);
void HIMETRICtoDP(LPSIZEL lpSizel);
 
// 外部変数
TCHAR g_szClassName[] = TEXT("OlePicture");
TCHAR g_szWindowName[] = TEXT("OlePicture");
IPicture *g_pPicture = NULL;
 
//==============================================================================
int APIENTRY wWinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPTSTR lpCmdLine,
	int nCmdShow)
{
	WNDCLASSEX wcx;
	HWND hWnd;
	MSG msg;
	HACCEL hAccTable;
 
	// 初期処理
	OleInitialize(NULL);
 
	// ウィンドウクラスの登録
	wcx.cbSize		= sizeof (WNDCLASSEX);
	wcx.style		= CS_HREDRAW | CS_VREDRAW;
	wcx.lpfnWndProc		= WindowProc;
	wcx.cbClsExtra		= 0;
	wcx.cbWndExtra		= 0;
	wcx.hInstance		= hInstance;
	wcx.hIcon		= NULL;
	wcx.hCursor		= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
	wcx.hbrBackground	= (HBRUSH)(COLOR_WINDOW + 1);
	wcx.lpszMenuName	= MAKEINTRESOURCE(IDR_MAINFRAME);
	wcx.lpszClassName	= g_szClassName;
	wcx.hIconSm		= NULL;
	if (RegisterClassEx(&wcx) == 0) {
		return 0;
	}
 
	// ウィンドウの作成
	hWnd = CreateWindow(
		g_szClassName,
		g_szWindowName,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0,
		CW_USEDEFAULT, 0,
		NULL,
		NULL,
		hInstance,
		NULL);
	if (hWnd == NULL) {
		return 0;
	}
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
 
	// メッセージループ
	hAccTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));
	while (GetMessage(&msg, NULL, 0, 0)) {
		if (TranslateAccelerator(msg.hwnd, hAccTable, &msg) == 0) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
 
	// 終了処理
	if (g_pPicture) g_pPicture->Release();
	OleUninitialize();
	return msg.wParam;
}
 
//------------------------------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) {
	case WM_PAINT:
		OnPaint(hWnd);
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case ID_APP_EXIT:
			DestroyWindow(hWnd);
			break;
		case ID_EDIT_PASTE:
			OnEditPaste(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, uMsg, wParam, lParam);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
 
//------------------------------------------------------------------------------
void OnPaint(HWND hWnd)
{
	PAINTSTRUCT ps;
	HDC hdc;
	OLE_XSIZE_HIMETRIC cxSrc;
	OLE_YSIZE_HIMETRIC cySrc;
	SIZEL sizel;
 
	hdc = BeginPaint(hWnd, &ps);
	if (g_pPicture) {
		g_pPicture->get_Width(&cxSrc);
		g_pPicture->get_Height(&cySrc);
		sizel.cx = cxSrc;
		sizel.cy = cySrc;
		HIMETRICtoDP(&sizel);
		g_pPicture->Render(hdc, 0, 0, sizel.cx, sizel.cy,
			0, cySrc, cxSrc, -cySrc, NULL);
	}
	EndPaint(hWnd, &ps);
}
 
//------------------------------------------------------------------------------
void OnEditPaste(HWND hWnd)
{
	HANDLE hMem;
	LPOLESTR pszUrl;
	HRESULT hr;
 
	// 確保
	if (IsClipboardFormatAvailable(CF_UNICODETEXT) == FALSE) {
		return;
	}
	OpenClipboard(hWnd);
	hMem = GetClipboardData(CF_UNICODETEXT);
	pszUrl = (LPOLESTR)GlobalLock(hMem);
 
	// 画像ファイルの読み込み
	if (g_pPicture) {
		g_pPicture->Release();
		g_pPicture = NULL;
	}
	hr = OleLoadPicturePath(pszUrl, NULL, 0, 0, IID_PPV_ARGS(&g_pPicture));
 
	// 解放
	GlobalUnlock(hMem);
	CloseClipboard();
 
	// 再描画
	InvalidateRect(hWnd, NULL, TRUE);
}
 
//------------------------------------------------------------------------------
void HIMETRICtoDP(LPSIZEL lpSizel)
{
	HDC hdc;
	const int HIMETRIC_INCH = 2540;
 
	hdc = GetDC(NULL);
	lpSizel->cx = lpSizel->cx * GetDeviceCaps(hdc, LOGPIXELSX) / HIMETRIC_INCH;
	lpSizel->cy = lpSizel->cy * GetDeviceCaps(hdc, LOGPIXELSY) / HIMETRIC_INCH;
	ReleaseDC(NULL, hdc);
}
 

resource.h
#define IDR_MAINFRAME	128
#define ID_APP_EXIT	129
#define ID_EDIT_PASTE	130
 

OlePicture.rc
// リソーススクリプト
 
#include "resource.h"
 
//------------------------------------------------------------------------------
// メニュー
IDR_MAINFRAME MENU
BEGIN
	POPUP "ファイル(&F)"
	BEGIN
		MENUITEM "アプリケーションの終了(&X)", ID_APP_EXIT
	END
	POPUP "編集(&E)"
	BEGIN
		MENUITEM "貼り付け(&P)\tCtrl+V", ID_EDIT_PASTE
	END
END
 
//------------------------------------------------------------------------------
// アクセラレータ
IDR_MAINFRAME ACCELERATORS
BEGIN
	"V",	ID_EDIT_PASTE,		VIRTKEY,CONTROL
END
 
最終更新:2012年09月09日 17:18