動作環境
C++ Builder XE4
Windows 7 pro (32bit)
処理概要
- TPanel上の画像を拡大してビットマップに
- 4倍拡大にて72dpiの画像を300dpi相当にする
- StretchBlt()を使う
- 参考: MSDN StretchBlt
- 参考: MSDN SetStretchBltMode
- [HALFTONE]や[BLACKONWHITE]などの説明
- StretchBlt()を使う
- 4倍拡大にて72dpiの画像を300dpi相当にする
- クリップボードへ送る
- ペイントブラシを起動する
- 参考: c++ builder XE4, 10.2 Tokyo > htmlファイルを作ってInternetExplorer / Chrome で表示する
- ペイントブラシを起動するのが面倒なので
備考 > Clipboard()
#include <ClipBrd.hpp>
がClipboard()のために必要。
フォームデザイン
- TPanel(Panel1)上にTShapeで適当な模様を作成
- TPanel上の画像をキャプチャする例として
実装例
Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE で管理されるコンポーネント
TPanel *Panel1;
TShape *Shape1;
TShape *Shape2;
TShape *Shape3;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // ユーザー宣言
void __fastcall TForm1::copyToClipboard(TPanel *panelPtr);
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <ClipBrd.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::copyToClipboard(TPanel *panelPtr)
{
if (panelPtr == NULL) {
return; // error
}
TBitmap *lBmp = new TBitmap();
try {
int dstWidth = panelPtr->ClientWidth * 4; // 72dpi -> 約300dpi
int dstHeight = panelPtr->ClientHeight * 4; // 72dpi -> 約300dpi
lBmp->SetSize(dstWidth, dstHeight);
SetStretchBltMode(lBmp->Canvas->Handle, HALFTONE);
HDC dc = GetDC(panelPtr->Handle);
::StretchBlt(lBmp->Canvas->Handle, 0, 0, dstWidth, dstHeight, dc, 0, 0, panelPtr->ClientWidth, panelPtr->ClientHeight, SRCCOPY);
Clipboard()->Assign(lBmp);
} catch (...) {
}
delete lBmp;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
copyToClipboard(Panel1);
// ペイントブラシ起動
ShellExecute(NULL, NULL, L"pbrush.exe", L"", NULL, SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------
動作例
- ソフトを実行する
- => ペイントブラシが起動する
- Ctrl+Vする
- => 画像が貼付けされる