「C++/CLI:オーナードロー」の編集履歴(バックアップ)一覧はこちら
「C++/CLI:オーナードロー」(2013/10/10 (木) 21:29:54) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p><strong>オーナードローとは、項目の描画をプログラムで変更する事を<br />
言います。<br />
今回はリストボックスの項目を偶数行と奇数行で背景色を<br />
変えてみました。</strong></p>
<p><strong>オーナードローとは、項目の描画をプログラムで変更する事を<br />
言います。<br />
今回はリストボックスの項目を偶数行と奇数行で背景色を<br />
変えてみました。</strong></p>
<p><strong><img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=282&file=owner.png" /></strong></p>
<p>MyForm.cpp</p>
<table cellspacing="1" cellpadding="1" width="600" border="1"><tbody><tr><td>
<p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br />
#include "MyForm.h"</p>
<p>using namespace Project1;</p>
<p>[STAThreadAttribute]<br />
int main(){<br />
MyForm ^form1 = gcnew MyForm;<br />
form1->ShowDialog();<br />
return 0;<br />
}</p>
</td>
</tr></tbody></table><p>MyForm.h</p>
<table cellspacing="1" cellpadding="1" width="600" border="1"><tbody><tr><td>
<p>#pragma once</p>
<p>namespace Project1 {</p>
<p> using namespace System;<br />
using namespace System::ComponentModel;<br />
using namespace System::Collections;<br />
using namespace System::Windows::Forms;<br />
using namespace System::Data;<br />
using namespace System::Drawing;</p>
<p> /// <summary><br />
/// MyForm の概要<br />
/// </summary><br />
public ref class MyForm : public System::Windows::Forms::Form<br />
{<br />
public:<br />
MyForm(void)<br />
{<br />
InitializeComponent();<br />
//<br />
//TODO: ここにコンストラクター コードを追加します<br />
//<br />
listBox1->DrawMode = DrawMode::OwnerDrawFixed;<br />
listBox1->DrawItem += gcnew DrawItemEventHandler( this,
&MyForm::listBox_DrawItem);<br />
}</p>
<p> protected:<br />
/// <summary><br />
/// 使用中のリソースをすべてクリーンアップします。<br />
/// </summary><br />
~MyForm()<br />
{<br />
if (components)<br />
{<br />
delete components;<br />
}<br />
}<br />
private: System::Windows::Forms::ListBox^ listBox1;<br />
protected:</p>
<p><br />
protected:</p>
<p> private:<br />
/// <summary><br />
/// 必要なデザイナー変数です。<br />
/// </summary><br />
System::ComponentModel::Container ^components;</p>
<p>#pragma region Windows Form Designer generated code<br />
/// <summary><br />
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を<br />
/// コード エディターで変更しないでください。<br />
/// </summary><br />
void InitializeComponent(void)<br />
{<br />
this->listBox1 = (gcnew System::Windows::Forms::ListBox());<br />
this->SuspendLayout();<br />
//<br />
// listBox1<br />
//<br />
this->listBox1->FormattingEnabled = true;<br />
this->listBox1->ItemHeight = 12;<br />
this->listBox1->Items->AddRange(gcnew cli::array<
System::Object^ >(10) {L"一番目", L"二番目", L"三番目", L"四番目", L"五番目", L"六番目",<br />
L"七番目", L"八番目", L"九番目", L"十番目"});<br />
this->listBox1->Location = System::Drawing::Point(12, 12);<br />
this->listBox1->Name = L"listBox1";<br />
this->listBox1->Size = System::Drawing::Size(260, 232);<br />
this->listBox1->TabIndex = 0;<br />
//<br />
// MyForm<br />
//<br />
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);<br />
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;<br />
this->ClientSize = System::Drawing::Size(284, 261);<br />
this->Controls->Add(this->listBox1);<br />
this->Name = L"MyForm";<br />
this->Text = L"Hello C++/CLI World !!";<br />
this->ResumeLayout(false);</p>
<p> }<br />
#pragma endregion<br />
// オーナードローの本体部分<br />
void listBox_DrawItem(System::Object^ sender, DrawItemEventArgs^ e)<br />
{<br />
// 既定の色で背景を塗り潰す<br />
e->DrawBackground();</p>
<p> Brush^ brush = nullptr;<br />
// 偶数番目 (プログラム的には奇数番目) の項目であれば<br />
if (e->Index % 2 == 1)<br />
{<br />
//偶数なら色を変える<br />
brush = Brushes::AliceBlue;<br />
}else{<br />
brush = Brushes::White;<br />
}<br />
//選択中の項目はハイライトに<br />
if ((e->State & DrawItemState::Selected) ==
DrawItemState::Selected)brush = SystemBrushes::Highlight;<br />
// 用意したブラシで塗り潰す<br />
e->Graphics->FillRectangle(brush, e->Bounds);</p>
<p> // 描画中の項目のテキストを取得<br />
String^ text =
safe_cast<ListBox^>(sender)->Items[e->Index]->ToString();</p>
<p> Brush^ foreBrush = gcnew SolidBrush(e->ForeColor);</p>
<p> // テキストを描画<br />
e->Graphics->DrawString(text, e->Font, foreBrush, e->Bounds);</p>
<p><br />
// フォーカスを示す四角形を描画<br />
e->DrawFocusRectangle();<br />
}</p>
<p> };<br />
}</p>
</td>
</tr></tbody></table><p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>