|
ブラシを使った描画1
今回はGDIオブジェクトのブラシを使った描画方法です。ブラシは面を塗りつぶすのに使います。ブラシにはいくつか種類があります。
・ソリッドブラシ
・ハッチブラシ
・システムカラーブラシ
・パターンブラシ
・DIBパターンブラシ
ソリッドブラシは、単色の塗りつぶしに使います。ハッチブラシは、格子やボーダー、ストライプなどの模様で塗りつぶします。システムカラーブラシは、ウィンドウの各パーツなどで使われているシステム色を指定したソリッドブラシです。パターンブラシ、DIBパターンブラシは、ビットマップを使って自由な塗りつぶしパターンを作ることのできるブラシです。
では、さっそくダイアログベースでプロジェクトを作成し、次のようなダイアログを作ります。

ブラシの種類(ソリッドブラシ、ハッチブラシ、システムカラーブラシ、パターンブラシ)、ハッチブラシのハッチスタイル、システムカラーブラシのカラーをコンボボックスで指定します。"色選択"ボタンが押されたら色選択ダイアログを表示します。選択された設定でブラシを作成し、面を描画するようにします。
まずは、パターンブラシに使用するビットマップを作成しましょう。「リソースの追加」から「Bitmap」を選択し、新規作成します。

パターンブラシに使うビットマップは、8x8の大きさにします。これ以上大きなビットマップにしても、左上の8x8ドットしか使われません。

各コンボボックスにはあらかじめデータを入れておきましょう。コンボボックスのプロパティの「Data」に次のように値を入れておきます。
種類:SOLID;HATCH;SYSCOLOR;PATTERN;
ハッチスタイル:BDIAGONAL;CROSS;DIAGCROSS;FDIAGONAL;HORIZONTAL;VERTICAL;
システムカラー:ACTIVECAPTION;WINDOW;WINDOWTEXT;

システムカラーはこれ以外にも多数ありますが、ここではサンプルなので3つだけにしています。
次は、変数を順次追加していきましょう。コンボボックスにはDDX変数を追加します。CString型のValue変数をそれぞれのコンボボックスに追加します。



現在のブラシ色を保持するために、ダイアログクラスに変数を追加します。色情報はCOLORREF型にします。

現在のブラシを保持するために、ダイアログクラスにCBrush型の変数を追加します。

次は、ブラシの設定が変化したときにリアルタイムに描画しなおすために、イベントハンドラを追加しておきます。コンボボックスにそれぞれCBN_SELCHANGEのイベントハンドラを追加します。

では、コードの方を実装していきましょう。OnInitDialog()でそれぞれの変数を初期化しておきます。
BOOL CDC4Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
// TODO: 初期化をここに追加します。
{
CClientDC cdc(this);
m_color = (cdc.GetDCBrushColor() != CLR_INVALID)
? cdc.GetDCBrushColor() : RGB(0, 0, 0); // ブラシの色
m_xvComboKind = _T("SOLID"); // ブラシの種類
m_xvComboHatch = _T("BDIAGONAL"); // ハッチブラシのスタイル
m_xvComboSysColor = _T("ACTIVECAPTION"); // システムカラーブラシの色
UpdateData(FALSE);
}
return TRUE;
}
|
まずは、CClientDCクラスのオブジェクトを作ります。現在のブラシの色はCDC::GetDCBrushColor()関数で取得できます。
| COLORREF CDC::GetDCBrushColor( ) const; |
| 説明: |
現在のブラシの色を取得 |
| 引数: |
なし |
| 戻り値: |
現在のブラシの色。取得できなかった場合はCLR_INVALID |
次は色選択ボタンのイベントハンドラです。現在のブラシの色を変更します。これについては、詳しくは「色選択ダイアログ」を見てください。
// "色選択"ボタン押下
void CDC4Dlg::OnBnClickedBtnColorsel()
{
CColorDialog CColorDialog(m_color);
int err = 0;
// 色選択ダイアログ表示
if (CColorDialog.DoModal() == IDOK)
{
m_color = CColorDialog.GetColor();
Invalidate(FALSE);
}
return;
}
|
次はコンボボックス選択変更時のイベントハンドラです。ここではCWnd::Invalidate()関数を使って再描画しているだけです。
// "種類"コンボ選択変更
void CDC4Dlg::OnCbnSelchangeComboKind()
{
Invalidate(FALSE);
}
// "ハッチスタイル"コンボ選択変更
void CDC4Dlg::OnCbnSelchangeComboHatch()
{
Invalidate(FALSE);
}
// "システムカラー"コンボ選択変更
void CDC4Dlg::OnCbnSelchangeComboSyscolor()
{
Invalidate(FALSE);
}
|
今回は長いのでここで一区切りにしておきます。次回はOnPaint()関数でブラシを使った描画処理を実装していきます。
|