C++ Builder XE4 > 画像処理 > 4つのファイル画像をN個合成して、表示枠を超える画像を作成する + クリップボードへ送る > ペイントブラシで画像を端から端まで貼付けできるか?

```txt:動作環境
C++ Builder XE4
```

### 前回

- [C++ Builder XE4 > 画像処理 > 4つのファイル画像を合成してTImageとして表示](https://qiita.com/7of9/items/f5513720860db98b7b00)


### 今回の処理

- 画面に表示しきれないサイズの画像を用意する
- クリップボードへ送る
- ペイントブラシでctrl+vした時に画像がすべて貼付けできるか

### 必要となるファイル

[「前回」の記事](https://qiita.com/7of9/items/f5513720860db98b7b00)に記載しているように４つの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);
}
//---------------------------------------------------------------------------
```

### 動作例

1. ソフトを実行して、Button1を押下する
    - => 合成画像がImage1に表示される
    - => ペイントブラシが起動される
2. ctrl + vで画像を貼付ける
    - => 画像を端から端まで貼付けできる


フォーム上の表示 (一部隠れている)
![2018-12-25_17h42_58.png](https://qiita-image-store.s3.amazonaws.com/0/32870/020154e7-d442-fac6-ce0b-e61d83e85f1b.png)

ペイントブラシへの貼付け後
![2018-12-25_17h42_43.png](https://qiita-image-store.s3.amazonaws.com/0/32870/32129487-e692-6283-96fe-aa5da3e3191b.png)


### 備考

何故こういうことを試したか。

FastReportへ画像を送ろうとした時、画像の一部しか送ることができなかった。
画像の端から端まで送る方法を検討中に上記を実施した。