C++ > CLI:オーナードロー

「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&amp;act=open&amp;pageid=282&amp;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-&gt;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> /// &lt;summary&gt;<br />  /// MyForm の概要<br />  /// &lt;/summary&gt;<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-&gt;DrawMode = DrawMode::OwnerDrawFixed;<br />    listBox1-&gt;DrawItem += gcnew DrawItemEventHandler( this, &amp;MyForm::listBox_DrawItem);<br />   }</p> <p> protected:<br />   /// &lt;summary&gt;<br />   /// 使用中のリソースをすべてクリーンアップします。<br />   /// &lt;/summary&gt;<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 />   /// &lt;summary&gt;<br />   /// 必要なデザイナー変数です。<br />   /// &lt;/summary&gt;<br />   System::ComponentModel::Container ^components;</p> <p>#pragma region Windows Form Designer generated code<br />   /// &lt;summary&gt;<br />   /// デザイナー サポートに必要なメソッドです。このメソッドの内容を<br />   /// コード エディターで変更しないでください。<br />   /// &lt;/summary&gt;<br />   void InitializeComponent(void)<br />   {<br />    this-&gt;listBox1 = (gcnew System::Windows::Forms::ListBox());<br />    this-&gt;SuspendLayout();<br />    //<br />    // listBox1<br />    //<br />    this-&gt;listBox1-&gt;FormattingEnabled = true;<br />    this-&gt;listBox1-&gt;ItemHeight = 12;<br />    this-&gt;listBox1-&gt;Items-&gt;AddRange(gcnew cli::array&lt; System::Object^  &gt;(10) {L"一番目", L"二番目", L"三番目", L"四番目", L"五番目", L"六番目",<br />     L"七番目", L"八番目", L"九番目", L"十番目"});<br />    this-&gt;listBox1-&gt;Location = System::Drawing::Point(12, 12);<br />    this-&gt;listBox1-&gt;Name = L"listBox1";<br />    this-&gt;listBox1-&gt;Size = System::Drawing::Size(260, 232);<br />    this-&gt;listBox1-&gt;TabIndex = 0;<br />    //<br />    // MyForm<br />    //<br />    this-&gt;AutoScaleDimensions = System::Drawing::SizeF(6, 12);<br />    this-&gt;AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;<br />    this-&gt;ClientSize = System::Drawing::Size(284, 261);<br />    this-&gt;Controls-&gt;Add(this-&gt;listBox1);<br />    this-&gt;Name = L"MyForm";<br />    this-&gt;Text = L"Hello C++/CLI World !!";<br />    this-&gt;ResumeLayout(false);</p> <p>  }<br /> #pragma endregion<br />   // オーナードローの本体部分<br />   void listBox_DrawItem(System::Object^ sender, DrawItemEventArgs^ e)<br />     {<br />         // 既定の色で背景を塗り潰す<br />         e-&gt;DrawBackground();</p> <p>  Brush^ brush = nullptr;<br />         // 偶数番目 (プログラム的には奇数番目) の項目であれば<br />         if (e-&gt;Index % 2 == 1)<br />         {<br />             //偶数なら色を変える<br />    brush = Brushes::AliceBlue;<br />   }else{<br />    brush = Brushes::White;<br />   }<br />   //選択中の項目はハイライトに<br />   if ((e-&gt;State &amp; DrawItemState::Selected) == DrawItemState::Selected)brush = SystemBrushes::Highlight;<br />   // 用意したブラシで塗り潰す<br />   e-&gt;Graphics-&gt;FillRectangle(brush, e-&gt;Bounds);</p> <p>        // 描画中の項目のテキストを取得<br />   String^ text = safe_cast&lt;ListBox^&gt;(sender)-&gt;Items[e-&gt;Index]-&gt;ToString();</p> <p>        Brush^ foreBrush = gcnew SolidBrush(e-&gt;ForeColor);</p> <p>        // テキストを描画<br />   e-&gt;Graphics-&gt;DrawString(text, e-&gt;Font, foreBrush, e-&gt;Bounds);</p> <p><br />         // フォーカスを示す四角形を描画<br />         e-&gt;DrawFocusRectangle();<br />     }</p> <p> };<br /> }</p> </td> </tr></tbody></table><p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p>

表示オプション

横に並べて表示:
変化行の前後のみ表示: