開発環境 |
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