動作環境
C++ Builder XE4
前回
今回の処理
- 画面に表示しきれないサイズの画像を用意する
- クリップボードへ送る
- ペイントブラシでctrl+vした時に画像がすべて貼付けできるか
必要となるファイル
「前回」の記事に記載しているように4つのpngファイルが必要
実装
Unit1.hpp
//---------------------------------------------------------------------------
#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 で管理されるコンポーネント
TImage *Image1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // ユーザー宣言
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <pngimage.hpp>
#include <ClipBrd.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
static const int kWidth_eachImage = 100; // 個々のファイルの幅[ピクセル]
static const int kHeight_eachImage = 100; // 個々のファイルの高さ[ピクセル]
static const int kNum_images = 4; // 使用するkFilenames[]の要素数
static const String kFilenames[] = {
L"red.png",
L"green.png",
L"blue.png",
L"orange.png",
};
static const int kNum_loop = 9; // 水平、垂直の繰返し数(奇数にすることで市松模様に)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 1. Image1のサイズを設定
Image1->Width = kWidth_eachImage * kNum_loop;
Image1->Height = kHeight_eachImage * kNum_loop;
// 2. 画像を読込んで並べる
TBitmap *bmpptr = new TBitmap();
TPngImage *pngptr = new TPngImage();
//
// 個々の画像サイズのN倍 (市松模様に並べる)
bmpptr->SetSize( kWidth_eachImage * kNum_loop, kHeight_eachImage * kNum_loop );
//
int idx = 0; // ファイル名のインデックス用
for(int ri = 0; ri < kNum_loop; ri++) { // ri: row index
for(int ci = 0; ci < kNum_loop; ci++) { // ci: column index
pngptr->LoadFromFile(kFilenames[idx % kNum_images]);
bmpptr->Canvas->Draw(kWidth_eachImage * ri, kHeight_eachImage * ci, pngptr);
idx++;
}
}
Image1->Picture->Assign(bmpptr);
//
delete pngptr;
// 3. クリップボードへ
Clipboard()->Assign(bmpptr);
// 4, 手仕舞い
delete bmpptr;
// 5. ペイントブラシ起動 (ctrl + vでの動作確認用)
ShellExecute(NULL, NULL, L"pbrush.exe", L"", NULL, SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------
動作例
- ソフトを実行して、Button1を押下する
- => 合成画像がImage1に表示される
- => ペイントブラシが起動される
- ctrl + vで画像を貼付ける
- => 画像を端から端まで貼付けできる
備考
何故こういうことを試したか。
FastReportへ画像を送ろうとした時、画像の一部しか送ることができなかった。
画像の端から端まで送る方法を検討中に上記を実施した。