|
魔界の仮面弁士 様
ご丁寧にありがとうございます。
> checkBoxAll.DrawToBitmap(bmp, New Rectangle(pt1.X, pt1.Y, bmp.Width \ 2, bmp.Height)) > としてみれば、状況が分かるかと思います。
やってみました。わかりました!
> 現在は、CheckBox をどこに配置しているのでしょうか?
宣言しているだけで、どこにも配置していません。
> (案1) AutoSize を使わずに、かつ、背景部が必要ないようなサイズで配置しておく
checkBoxAll.AutoSize=False checkBoxAll.Width=14 checkBoxAll.Height=14
としてみましたところ、バッチリでした!
なるほど、AutoSizeがいたずらしていたというわけですね・・・
後半のサンプルコードも試させていただきました。 これだとクリックしてもそのままでは反応がないのですね・・・。
先の方法でうまくいきそうですので、こちらで何とかやってみます!
ありがとうございました!!!
■No76535 (魔界の仮面弁士 さん) に返信 > ■No76533 (やんまー さん) に返信 >>どうも(1)のclearが全く効いていないような気がします。 >>(2)はBlueとすると周りが青くなるので効いていると思います。 > > 透過という意味で有効なのは、むしろ(1)の方だと思いますよ。 > > > 今回の場合、(1)で透明なキャンバスを用意した後で、 >>checkBoxAll.DrawToBitmap(bmp, New Rectangle(pt1.X, pt1.Y, bmp.Width, bmp.Height)) > によって、その透明部分をすべて塗りつぶすようにチェックボックスを描画したため、 > 元の透明部分は失われています。試しに、キャンバスの半分だけ描画させるために、 > g.Clear(Color.Red) > checkBoxAll.DrawToBitmap(bmp, New Rectangle(pt1.X, pt1.Y, bmp.Width \ 2, bmp.Height)) > としてみれば、状況が分かるかと思います。 > > > 一方(2)の方ですが、コントロールの BackColor プロパティに設定する透明度というのは、 > コントロールの背景を透過させるという意味ではありません。 > 「親コントロールの背景」を引き継いで描画するという意味です。 > > > たとえば、Me.PictureBox1.Controls.Add(checkBoxAll) されていれば、 > checkBoxAll.BackColor = Color.Transparent の時に DrawToBitmap した背景は、 > PictureBox に設定されている背景色・背景画像がそのまま描画されることになりますし、 > checkBoxAll.BackColor = Color.FromArgb(128, Color.Blue) であれば、 > DrawToBitmap された結果は、そこに半透明の青を重ね塗った色となります。 > > > 現在は、CheckBox をどこに配置しているのでしょうか? > もし、どこにも配置していないのだとしたら、既定の色(SystemColors.Control かな?)で > 描画されることになると思います。また、Controls.Add していない場合には、念のため、 > フォーム終了時にその CheckBox を Dispose しておいた方が良いかもしれません。 > > >>どうしたら、参考サイトのように綺麗にチェックボックスを描画できるでしょうか? > 元記事の投稿者である mecha_dog さんがどうしていたのかは分かりませんが、 > たとえば checkBoxAll のチェックボックスに対して、 > (案1) AutoSize を使わずに、かつ、背景部が必要ないようなサイズで配置しておく > (案2) 親コントロールの背景に、実際のヘッダー部に相当する背景をセットしておく > などでは無いでしょうか。 > > > あるいは描画に拘らないなら、CheckBox を DataGridView の座標に重ねて配置するという手もあります。 > この場合、CheckBox そのものが配置されるため、マウスホバー時の状態や > クリック時の表現も維持されるという利点があります。 > > とはいえ、列幅変更や水平スクロールが必要となると、そのための位置調整が必要なので、 > その場合はむしろ、描画の方が都合が良いかもしれません。 > 描画の際の余白部分が問題になるようであれば、描画用のダミー CheckBox に対して > DrawToBitmap を呼び出すのではなく、CheckBoxRenderer.DrawCheckBox または > VisualStyleRenderer.DrawBackground を使って描画してみては如何でしょうか。 > > http://dobon.net/vb/dotnet/graphics/drawvisualcontrol.html > > > > '先頭列のヘッダー部に対して描画処理 > If e.ColumnIndex = 0 AndAlso e.RowIndex = -1 Then > '実際には、マウス位置やチェック状態に応じて state 値を変更する > Dim state As VisualStyles.CheckBoxState = VisualStyles.CheckBoxState.UncheckedNormal > > '左上では都合が悪ければ、適宜調整を > Dim pos = e.CellBounds.Location > > '標準の描画処理 > e.Paint(e.ClipBounds, e.PaintParts) > > 'その上にチェックボックスを重ね描き > CheckBoxRenderer.DrawCheckBox(e.Graphics, pos, state) > > e.Handled = True > End If
|