は
PropertyGridのプロセスを必要とする2つのコントロールを持っている私のプロジェクトからのコードです。
+ doccommentはドキュメントヘルプです。
+ gridViewプロパティ値を表示します。
これらのコントロールは、ControlDarkの色で境界矩形を描画します。
鮮明な表示を行うには、HelpBackColorとLineColorで矩形を再描画する必要があります。
namespace Bravo.Bravo7.UI
{
public class MyPropertyGrid : PropertyGrid
{
public class SnappableControl : NativeWindow
{
private Control _parent;
private MyPropertyGrid _ownerGrid;
public SnappableControl(Control parent, MyPropertyGrid ownerGrid)
{
_parent = parent;
_parent.HandleCreated += _parent_HandleCreated;
_parent.HandleDestroyed += _owner_HandleDestroyed;
_ownerGrid = ownerGrid;
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case (int)NativeMethods.WM_NCPAINT:
case (int)NativeMethods.WM_PAINT:
using (var g = _parent.CreateGraphics())
{
using (var pen = new Pen(_ownerGrid.HelpBackColor))
{
var clientRectangle = _parent.ClientRectangle;
clientRectangle.Width--;
clientRectangle.Height--;
g.DrawRectangle(pen, clientRectangle);
}
}
break;
}
}
void _owner_HandleDestroyed(object sender, EventArgs e)
{
ReleaseHandle();
}
void _parent_HandleCreated(object sender, EventArgs e)
{
AssignHandle(_parent.Handle);
}
}
public class PropertyGridView : NativeWindow
{
private Control _parent;
private MyPropertyGrid _ownerGrid;
public PropertyGridView(Control parent, MyPropertyGrid ownerGrid)
{
_parent = parent;
_parent.HandleCreated += _owner_HandleCreated;
_parent.HandleDestroyed += _owner_HandleDestroyed;
_ownerGrid = ownerGrid;
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case (int)NativeMethods.WM_NCPAINT:
case (int)NativeMethods.WM_PAINT:
using (var g = _parent.CreateGraphics())
{
using (var pen = new Pen(_ownerGrid.LineColor))
{
g.DrawRectangle(pen, 0, 0, _parent.Width - 1, _parent.Height - 1);
}
}
break;
}
}
void _owner_HandleDestroyed(object sender, EventArgs e)
{
ReleaseHandle();
}
void _owner_HandleCreated(object sender, EventArgs e)
{
AssignHandle(_parent.Handle);
}
}
public class MyToolStripRenderer : ToolStripSystemRenderer
{
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
//base.OnRenderToolStripBorder(e);
}
}
public MyPropertyGrid()
{
base.LineColor = SystemColors.Control;
base.ViewBackColor = Color.FromArgb(246, 246, 246);
base.DrawFlatToolbar = true;
base.ToolStripRenderer = new MyToolStripRenderer();
var docDocument = typeof(PropertyGrid)
.GetField("doccomment", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(this) as Control;
new SnappableControl(docDocument, this);
var gridView = typeof(PropertyGrid)
.GetField("gridView", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(this) as Control;
new PropertyGridView(gridView, this);
}
}
}
Hehe、私はすでにそれを過去に試みたが、失敗した。私はもう一度それを試してみます。私が何か間違ったことがあった場合に備えて。 –
@Jamieあなたの提案に感謝しました。私はあなたの答えで私の質問を更新します。 –
自動フォームスケーリングのためにウィンドウのサイズが変更されたときに、この値はバイトになることがあるので注意してください。 PropertyGridがどこにあるべきか常に確認するために、パネルのResizeイベントハンドラにコードを記述してください。 –