DoboWiki
Top
> .NETプログラミング研究/35 をテンプレートにして作成
.NETプログラミング研究/35 をテンプレートにして作成
開始行:
#title(.NETプログラミング研究 第35号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第35号 [#hc9f4c5d]
**.NET質問箱 [#s5affb60]
「.NET質問箱」では、「どぼん!のプログラミング掲示板」に...
-[[どぼん!のプログラミング掲示板>https://dobon.net/vb/bb...
***ComboBoxで上下矢印キーで項目を変更できないようにするに...
#column(注意){{
この記事の最新版は「[[ComboBoxが上下矢印キーで項目を変更...
}}
''【質問】''
WindowsアプリケーションのComboBoxコントロールで、マウスだ...
''【回答】''
簡単な方法としては、ComboBoxのKeyDownイベントハンドラで上...
#code(vbnet){{
'ComboBox1のKeyDownイベントハンドラ
Private Sub ComboBox1_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles ComboBox1.KeyDown
If e.KeyCode = Keys.Down Or e.KeyCode = Keys.Up Then
e.Handled = True
End If
End Sub
}}
#code(csharp){{
//ComboBox1のKeyDownイベントハンドラ
private void ComboBox1_KeyDown(
object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up)
e.Handled = true;
}
}}
しかし残念ながらこの方法は、.NET Framework 1.0では正常に...
次にPreProcessMessageメソッドをオーバーライドすることによ...
#code(vbnet){{
''' <summary>
''' 上下矢印キーで項目を変更できないComboBox
''' </summary>
Public Class MyComboBox
Inherits System.Windows.Forms.ComboBox
Private WM_KEYDOWN As Integer = &H100
Public Overrides Function PreProcessMessage( _
ByRef msg As Message) As Boolean
If msg.Msg = WM_KEYDOWN Then
'上下矢印キー操作を無効にする
Dim keyCode As Keys = _
CType(msg.WParam.ToInt32(), Keys) And Key...
If keyCode = Keys.Up Or keyCode = Keys.Down T...
Return True
End If
End If
Return MyBase.PreProcessMessage(msg)
End Function
End Class
}}
#code(csharp){{
/// <summary>
/// 上下矢印キーで項目を変更できないComboBox
/// </summary>
public class MyComboBox : System.Windows.Forms.ComboBox
{
private const int WM_KEYDOWN = 0x100;
public override bool PreProcessMessage(ref Message msg)
{
if (msg.Msg == WM_KEYDOWN)
{
//上下矢印キー操作を無効にする
Keys keyCode = (Keys)(int)msg.WParam & Keys.KeyCode;
if (keyCode == Keys.Up || keyCode == Keys.Down)
return true;
}
return base.PreProcessMessage(ref msg);
}
}
}}
○この記事の基になった掲示板のスレッド
-[[ComboBoxのItemの選択について: 投稿者(敬称略) tab, 管理...
***PageSetupDialogのMarginsが正常に機能しない [#w9db0ba7]
#column(注意){{
この記事の最新版は「[[ページ設定ダイアログのMarginsが正常...
}}
''【質問】''
PageSetupDialogを使ってページ設定ダイアログを表示したとき...
#code(vbnet){{
Dim PageSetupDialog1 As New PageSetupDialog
PageSetupDialog1.Document = New System.Drawing.Printing.P...
'マージンを指定する
PageSetupDialog1.PageSettings.Margins = _
New System.Drawing.Printing.Margins(100, 100, 100, 100)
'ページ設定ダイアログを表示する
If PageSetupDialog1.ShowDialog() = DialogResult.OK Then
Console.WriteLine(PageSetupDialog1.PageSettings.Margi...
End If
}}
#code(csharp){{
PageSetupDialog PageSetupDialog1 = new PageSetupDialog();
PageSetupDialog1.Document =
new System.Drawing.Printing.PrintDocument();
//マージンを指定する
PageSetupDialog1.PageSettings.Margins =
new System.Drawing.Printing.Margins(100, 100, 100, 100);
//ページ設定ダイアログを表示する
if (PageSetupDialog1.ShowDialog() == DialogResult.OK)
//指定されたマージンを表示する
Console.WriteLine(PageSetupDialog1.PageSettings.Margins);
}}
''【回答】''
これは.NET Frameworkのバグです。マイクロソフトサポート技...
-[[マイクロソフト サポート技術情報 - 814355: BUG: PageSet...
マイクロソフトサポート技術情報では回避法はコントロールパ...
今後もこのバグが修正されないという前提のもとでは、回避法...
-[[ニュースグループ microsoft.public.dotnet.framework.dra...
この方法を使って問題を回避したコードの例を示します。ただ...
#code(vbnet){{
Dim PageSetupDialog1 As New PageSetupDialog
PageSetupDialog1.Document = New System.Drawing.Printing.P...
'マージンを指定する
PageSetupDialog1.PageSettings.Margins = _
New System.Drawing.Printing.Margins(100, 100, 100, 100)
'メートル法を使っている時は、メートルに直す
If System.Globalization.RegionInfo.CurrentRegion.IsMetric...
PageSetupDialog1.PageSettings.Margins.Top *= 2.54
PageSetupDialog1.PageSettings.Margins.Bottom *= 2.54
PageSetupDialog1.PageSettings.Margins.Left *= 2.54
PageSetupDialog1.PageSettings.Margins.Right *= 2.54
End If
'ページ設定ダイアログを表示する
If PageSetupDialog1.ShowDialog() = DialogResult.OK Then
Console.WriteLine(PageSetupDialog1.PageSettings.Margi...
ElseIf System.Globalization.RegionInfo.CurrentRegion.IsMe...
'また元に戻す
PageSetupDialog1.PageSettings.Margins.Top /= 2.54
PageSetupDialog1.PageSettings.Margins.Bottom /= 2.54
PageSetupDialog1.PageSettings.Margins.Left /= 2.54
PageSetupDialog1.PageSettings.Margins.Right /= 2.54
End If
}}
#code(csharp){{
PageSetupDialog PageSetupDialog1 = new PageSetupDialog();
PageSetupDialog1.Document =
new System.Drawing.Printing.PrintDocument();
//マージンを指定する
PageSetupDialog1.PageSettings.Margins =
new System.Drawing.Printing.Margins(100, 100, 100, 100);
//メートル法を使っている時は、メートルに直す
if (System.Globalization.RegionInfo.CurrentRegion.IsMetric)
{
PageSetupDialog1.PageSettings.Margins.Top =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Top * 2.54);
PageSetupDialog1.PageSettings.Margins.Bottom =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Bottom * 2.54);
PageSetupDialog1.PageSettings.Margins.Left =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Left * 2.54);
PageSetupDialog1.PageSettings.Margins.Right =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Right * 2.54);
}
//ページ設定ダイアログを表示する
if (PageSetupDialog1.ShowDialog() == DialogResult.OK)
//指定されたマージンを表示する
Console.WriteLine(PageSetupDialog1.PageSettings.Margins);
else if (System.Globalization.RegionInfo.CurrentRegion.Is...
{
//また元に戻す
PageSetupDialog1.PageSettings.Margins.Top =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Top / 2.54);
PageSetupDialog1.PageSettings.Margins.Bottom =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Bottom / 2.54);
PageSetupDialog1.PageSettings.Margins.Left =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Left / 2.54);
PageSetupDialog1.PageSettings.Margins.Right =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Right / 2.54);
}
}}
-[[PageSetupDialogのマージン: 投稿者(敬称略) DEG, 管理人>...
***TreeViewのNodeの右に色の違う文字列を描画するには? [#v...
''【質問】''
Outlook ExpressのTreeViewでは、未読のメール数がノードの右...
''【回答】''
これを実現させる方法がC# Helpで紹介されています。
-[[C# Help - Outlook Style Tree View>http://www.csharphel...
この記事ではC#のコードしか紹介されていませんが、これをVB....
これらのコードを以下に紹介させていただきます(一部変更し...
#code(vbnet){{
'Imports System.Runtime.InteropServices
'が宣言されているものとする
Public Structure NMHDR
Public hwndFrom As IntPtr
Public idFrom As Integer
Public code As UInt32
End Structure
Public Structure NMCUSTOMDRAW
Public hdr As NMHDR
Public dwDrawStage As Integer
Public hdc As Integer
Public x1 As Integer
Public y1 As Integer
Public x2 As Integer
Public y2 As Integer
Public dwItemSpec As Integer
Public uItemState As Integer
Public lItemlParam As Integer
End Structure
Private Const WM_NOTIFY As Integer = &H4E
Private ReadOnly NM_CUSTOMDRAW As UInt32 = _
Convert.ToUInt32(4294967284)
Private Const CDDS_ITEMPREPAINT As Integer = 65537
Private Const CDRF_NOTIFYSUBITEMDRAW As Integer = 32
Protected Overrides Sub WndProc(ByRef m As Message)
Dim lp2 As NMCUSTOMDRAW
Dim lp As NMHDR
If (m.Msg = WM_NOTIFY) Then
lp = Marshal.PtrToStructure(m.LParam, lp.GetType())
If (lp.code.CompareTo(NM_CUSTOMDRAW) = 0) Then
lp2 = Marshal.PtrToStructure(m.LParam, lp2.Ge...
If (lp2.dwDrawStage = CDDS_ITEMPREPAINT) Then
MyBase.WndProc(m)
TreeViewPaint(m)
m.Result = IntPtr.Zero
Return
Else
m.Result = New IntPtr(CDRF_NOTIFYSUBITEMD...
End If
End If
End If
MyBase.WndProc(m)
End Sub
Public Sub TreeViewPaint(ByRef m As Message)
Dim lp2 As NMCUSTOMDRAW
Dim g As Graphics
Dim node As TreeNode
Dim strText As String
Dim x1, y1 As Long
lp2 = Marshal.PtrToStructure(m.LParam, lp2.GetType())
g = System.Drawing.Graphics.FromHwnd(Me.TreeView1.Han...
node = TreeView1.GetNodeAt(lp2.x1 + 1, lp2.y1 + 1)
x1 = lp2.x1 + node.Bounds.X + node.Bounds.Width + 5
y1 = lp2.y1
strText = "( " + node.Nodes.Count.ToString() + " )"
'Nodeの子ノード数をNodeの後ろに青で表示する
g.DrawString(strText, TreeView1.Font, _
System.Drawing.Brushes.Blue, x1, y1, _
System.Drawing.StringFormat.GenericTypographic)
End Sub
}}
#code(csharp){{
private unsafe struct NMHDR
{
public uint hwndFrom;
public uint idFrom;
public uint code;
}
private unsafe struct NMCUSTOMDRAW
{
public NMHDR hdr;
public uint dwDrawStage;
public uint hdc;
public uint x1;
public uint y1;
public uint x2;
public uint y2;
public uint dwItemSpec;
public uint uItemState;
public uint lItemlParam;
}
private const uint WM_NOTIFY = 0x4E;
private const uint NM_CUSTOMDRAW = 4294967284;
private const uint CDDS_ITEMPREPAINT = 65537;
private const uint CDRF_NOTIFYSUBITEMDRAW = 32;
protected unsafe override void WndProc(ref Message m)
{
NMCUSTOMDRAW *lp2;
NMHDR *lp;
if (m.Msg == WM_NOTIFY)
{
lp = (NMHDR*) m.LParam.ToPointer();
if (lp->code == NM_CUSTOMDRAW)
{
lp2 = (NMCUSTOMDRAW*)m.LParam.ToPointer();
if (lp2->dwDrawStage == CDDS_ITEMPREPAINT)
{
base.WndProc(ref m);
TreeViewPaint(ref m);
m.Result =(IntPtr)0;
return;
}
else
{
m.Result =(IntPtr)CDRF_NOTIFYSUBITEMDRAW;
}
}
}
base.WndProc(ref m);
}
private unsafe void TreeViewPaint(ref Message m)
{
NMCUSTOMDRAW *lp2;
System.Drawing.Graphics g;
System.Windows.Forms.TreeNode node;
string strText;
long x1, y1;
lp2 = (NMCUSTOMDRAW*)m.LParam.ToPointer();
g = System.Drawing.Graphics.FromHwnd(TreeView1.Handle);
node = TreeView1.GetNodeAt((int)lp2->x1 + 1, (int)lp2->y...
x1 = lp2->x1 + node.Bounds.X + node.Bounds.Width + 5;
y1 = lp2->y1;
strText = "( " + node.Nodes.Count.ToString() + " )";
//Nodeの子ノード数をNodeの後ろに青で表示する
g.DrawString(strText, TreeView1.Font,
System.Drawing.Brushes.Blue,
x1, y1,
System.Drawing.StringFormat.GenericTypographic);
}
}}
ただしこの方法では、ノードの末尾に文字列を描画しているだ...
○この記事の基になった掲示板のスレッド
-[[TreeViewのテキスト表示部分の右: 投稿者(敬称略) edacho,...
**コンピュータ雑学 [#m20d01e9]
最近巷では「トリビアの泉」や「うんちく王」の影響でか、雑...
***「C言語」の「C」の意味は? [#z4b1c0b1]
C言語は、1973年頃AT&Tベル研究所でデニス・リッチー氏らによ...
-[[The Development of the C Language>http://cm.bell-labs....
それではB言語の前にA言語があったのかというと、そうではあ...
そうなると次は「D」ですが、「D言語」は現在開発中で、そこ...
-[[D Programming Language>http://www.digitalmars.com/d/in...
さらに調べてみたところ、E、F、G(National Instruments Lab...
-[[The E Language>http://www.erights.org/elang/index.html]]
-[[F Programming Language Homepage>http://www.fortran.com...
-[[National Instruments>http://www.ni.com/]]
-[[The H - Language. A small functional programming Langu...
**コメント [#hdccd065]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2004-06-16 (水) 06:00:00,DOB...
終了行:
#title(.NETプログラミング研究 第35号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第35号 [#hc9f4c5d]
**.NET質問箱 [#s5affb60]
「.NET質問箱」では、「どぼん!のプログラミング掲示板」に...
-[[どぼん!のプログラミング掲示板>https://dobon.net/vb/bb...
***ComboBoxで上下矢印キーで項目を変更できないようにするに...
#column(注意){{
この記事の最新版は「[[ComboBoxが上下矢印キーで項目を変更...
}}
''【質問】''
WindowsアプリケーションのComboBoxコントロールで、マウスだ...
''【回答】''
簡単な方法としては、ComboBoxのKeyDownイベントハンドラで上...
#code(vbnet){{
'ComboBox1のKeyDownイベントハンドラ
Private Sub ComboBox1_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles ComboBox1.KeyDown
If e.KeyCode = Keys.Down Or e.KeyCode = Keys.Up Then
e.Handled = True
End If
End Sub
}}
#code(csharp){{
//ComboBox1のKeyDownイベントハンドラ
private void ComboBox1_KeyDown(
object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up)
e.Handled = true;
}
}}
しかし残念ながらこの方法は、.NET Framework 1.0では正常に...
次にPreProcessMessageメソッドをオーバーライドすることによ...
#code(vbnet){{
''' <summary>
''' 上下矢印キーで項目を変更できないComboBox
''' </summary>
Public Class MyComboBox
Inherits System.Windows.Forms.ComboBox
Private WM_KEYDOWN As Integer = &H100
Public Overrides Function PreProcessMessage( _
ByRef msg As Message) As Boolean
If msg.Msg = WM_KEYDOWN Then
'上下矢印キー操作を無効にする
Dim keyCode As Keys = _
CType(msg.WParam.ToInt32(), Keys) And Key...
If keyCode = Keys.Up Or keyCode = Keys.Down T...
Return True
End If
End If
Return MyBase.PreProcessMessage(msg)
End Function
End Class
}}
#code(csharp){{
/// <summary>
/// 上下矢印キーで項目を変更できないComboBox
/// </summary>
public class MyComboBox : System.Windows.Forms.ComboBox
{
private const int WM_KEYDOWN = 0x100;
public override bool PreProcessMessage(ref Message msg)
{
if (msg.Msg == WM_KEYDOWN)
{
//上下矢印キー操作を無効にする
Keys keyCode = (Keys)(int)msg.WParam & Keys.KeyCode;
if (keyCode == Keys.Up || keyCode == Keys.Down)
return true;
}
return base.PreProcessMessage(ref msg);
}
}
}}
○この記事の基になった掲示板のスレッド
-[[ComboBoxのItemの選択について: 投稿者(敬称略) tab, 管理...
***PageSetupDialogのMarginsが正常に機能しない [#w9db0ba7]
#column(注意){{
この記事の最新版は「[[ページ設定ダイアログのMarginsが正常...
}}
''【質問】''
PageSetupDialogを使ってページ設定ダイアログを表示したとき...
#code(vbnet){{
Dim PageSetupDialog1 As New PageSetupDialog
PageSetupDialog1.Document = New System.Drawing.Printing.P...
'マージンを指定する
PageSetupDialog1.PageSettings.Margins = _
New System.Drawing.Printing.Margins(100, 100, 100, 100)
'ページ設定ダイアログを表示する
If PageSetupDialog1.ShowDialog() = DialogResult.OK Then
Console.WriteLine(PageSetupDialog1.PageSettings.Margi...
End If
}}
#code(csharp){{
PageSetupDialog PageSetupDialog1 = new PageSetupDialog();
PageSetupDialog1.Document =
new System.Drawing.Printing.PrintDocument();
//マージンを指定する
PageSetupDialog1.PageSettings.Margins =
new System.Drawing.Printing.Margins(100, 100, 100, 100);
//ページ設定ダイアログを表示する
if (PageSetupDialog1.ShowDialog() == DialogResult.OK)
//指定されたマージンを表示する
Console.WriteLine(PageSetupDialog1.PageSettings.Margins);
}}
''【回答】''
これは.NET Frameworkのバグです。マイクロソフトサポート技...
-[[マイクロソフト サポート技術情報 - 814355: BUG: PageSet...
マイクロソフトサポート技術情報では回避法はコントロールパ...
今後もこのバグが修正されないという前提のもとでは、回避法...
-[[ニュースグループ microsoft.public.dotnet.framework.dra...
この方法を使って問題を回避したコードの例を示します。ただ...
#code(vbnet){{
Dim PageSetupDialog1 As New PageSetupDialog
PageSetupDialog1.Document = New System.Drawing.Printing.P...
'マージンを指定する
PageSetupDialog1.PageSettings.Margins = _
New System.Drawing.Printing.Margins(100, 100, 100, 100)
'メートル法を使っている時は、メートルに直す
If System.Globalization.RegionInfo.CurrentRegion.IsMetric...
PageSetupDialog1.PageSettings.Margins.Top *= 2.54
PageSetupDialog1.PageSettings.Margins.Bottom *= 2.54
PageSetupDialog1.PageSettings.Margins.Left *= 2.54
PageSetupDialog1.PageSettings.Margins.Right *= 2.54
End If
'ページ設定ダイアログを表示する
If PageSetupDialog1.ShowDialog() = DialogResult.OK Then
Console.WriteLine(PageSetupDialog1.PageSettings.Margi...
ElseIf System.Globalization.RegionInfo.CurrentRegion.IsMe...
'また元に戻す
PageSetupDialog1.PageSettings.Margins.Top /= 2.54
PageSetupDialog1.PageSettings.Margins.Bottom /= 2.54
PageSetupDialog1.PageSettings.Margins.Left /= 2.54
PageSetupDialog1.PageSettings.Margins.Right /= 2.54
End If
}}
#code(csharp){{
PageSetupDialog PageSetupDialog1 = new PageSetupDialog();
PageSetupDialog1.Document =
new System.Drawing.Printing.PrintDocument();
//マージンを指定する
PageSetupDialog1.PageSettings.Margins =
new System.Drawing.Printing.Margins(100, 100, 100, 100);
//メートル法を使っている時は、メートルに直す
if (System.Globalization.RegionInfo.CurrentRegion.IsMetric)
{
PageSetupDialog1.PageSettings.Margins.Top =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Top * 2.54);
PageSetupDialog1.PageSettings.Margins.Bottom =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Bottom * 2.54);
PageSetupDialog1.PageSettings.Margins.Left =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Left * 2.54);
PageSetupDialog1.PageSettings.Margins.Right =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Right * 2.54);
}
//ページ設定ダイアログを表示する
if (PageSetupDialog1.ShowDialog() == DialogResult.OK)
//指定されたマージンを表示する
Console.WriteLine(PageSetupDialog1.PageSettings.Margins);
else if (System.Globalization.RegionInfo.CurrentRegion.Is...
{
//また元に戻す
PageSetupDialog1.PageSettings.Margins.Top =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Top / 2.54);
PageSetupDialog1.PageSettings.Margins.Bottom =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Bottom / 2.54);
PageSetupDialog1.PageSettings.Margins.Left =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Left / 2.54);
PageSetupDialog1.PageSettings.Margins.Right =
(int)Math.Round(
PageSetupDialog1.PageSettings.Margins.Right / 2.54);
}
}}
-[[PageSetupDialogのマージン: 投稿者(敬称略) DEG, 管理人>...
***TreeViewのNodeの右に色の違う文字列を描画するには? [#v...
''【質問】''
Outlook ExpressのTreeViewでは、未読のメール数がノードの右...
''【回答】''
これを実現させる方法がC# Helpで紹介されています。
-[[C# Help - Outlook Style Tree View>http://www.csharphel...
この記事ではC#のコードしか紹介されていませんが、これをVB....
これらのコードを以下に紹介させていただきます(一部変更し...
#code(vbnet){{
'Imports System.Runtime.InteropServices
'が宣言されているものとする
Public Structure NMHDR
Public hwndFrom As IntPtr
Public idFrom As Integer
Public code As UInt32
End Structure
Public Structure NMCUSTOMDRAW
Public hdr As NMHDR
Public dwDrawStage As Integer
Public hdc As Integer
Public x1 As Integer
Public y1 As Integer
Public x2 As Integer
Public y2 As Integer
Public dwItemSpec As Integer
Public uItemState As Integer
Public lItemlParam As Integer
End Structure
Private Const WM_NOTIFY As Integer = &H4E
Private ReadOnly NM_CUSTOMDRAW As UInt32 = _
Convert.ToUInt32(4294967284)
Private Const CDDS_ITEMPREPAINT As Integer = 65537
Private Const CDRF_NOTIFYSUBITEMDRAW As Integer = 32
Protected Overrides Sub WndProc(ByRef m As Message)
Dim lp2 As NMCUSTOMDRAW
Dim lp As NMHDR
If (m.Msg = WM_NOTIFY) Then
lp = Marshal.PtrToStructure(m.LParam, lp.GetType())
If (lp.code.CompareTo(NM_CUSTOMDRAW) = 0) Then
lp2 = Marshal.PtrToStructure(m.LParam, lp2.Ge...
If (lp2.dwDrawStage = CDDS_ITEMPREPAINT) Then
MyBase.WndProc(m)
TreeViewPaint(m)
m.Result = IntPtr.Zero
Return
Else
m.Result = New IntPtr(CDRF_NOTIFYSUBITEMD...
End If
End If
End If
MyBase.WndProc(m)
End Sub
Public Sub TreeViewPaint(ByRef m As Message)
Dim lp2 As NMCUSTOMDRAW
Dim g As Graphics
Dim node As TreeNode
Dim strText As String
Dim x1, y1 As Long
lp2 = Marshal.PtrToStructure(m.LParam, lp2.GetType())
g = System.Drawing.Graphics.FromHwnd(Me.TreeView1.Han...
node = TreeView1.GetNodeAt(lp2.x1 + 1, lp2.y1 + 1)
x1 = lp2.x1 + node.Bounds.X + node.Bounds.Width + 5
y1 = lp2.y1
strText = "( " + node.Nodes.Count.ToString() + " )"
'Nodeの子ノード数をNodeの後ろに青で表示する
g.DrawString(strText, TreeView1.Font, _
System.Drawing.Brushes.Blue, x1, y1, _
System.Drawing.StringFormat.GenericTypographic)
End Sub
}}
#code(csharp){{
private unsafe struct NMHDR
{
public uint hwndFrom;
public uint idFrom;
public uint code;
}
private unsafe struct NMCUSTOMDRAW
{
public NMHDR hdr;
public uint dwDrawStage;
public uint hdc;
public uint x1;
public uint y1;
public uint x2;
public uint y2;
public uint dwItemSpec;
public uint uItemState;
public uint lItemlParam;
}
private const uint WM_NOTIFY = 0x4E;
private const uint NM_CUSTOMDRAW = 4294967284;
private const uint CDDS_ITEMPREPAINT = 65537;
private const uint CDRF_NOTIFYSUBITEMDRAW = 32;
protected unsafe override void WndProc(ref Message m)
{
NMCUSTOMDRAW *lp2;
NMHDR *lp;
if (m.Msg == WM_NOTIFY)
{
lp = (NMHDR*) m.LParam.ToPointer();
if (lp->code == NM_CUSTOMDRAW)
{
lp2 = (NMCUSTOMDRAW*)m.LParam.ToPointer();
if (lp2->dwDrawStage == CDDS_ITEMPREPAINT)
{
base.WndProc(ref m);
TreeViewPaint(ref m);
m.Result =(IntPtr)0;
return;
}
else
{
m.Result =(IntPtr)CDRF_NOTIFYSUBITEMDRAW;
}
}
}
base.WndProc(ref m);
}
private unsafe void TreeViewPaint(ref Message m)
{
NMCUSTOMDRAW *lp2;
System.Drawing.Graphics g;
System.Windows.Forms.TreeNode node;
string strText;
long x1, y1;
lp2 = (NMCUSTOMDRAW*)m.LParam.ToPointer();
g = System.Drawing.Graphics.FromHwnd(TreeView1.Handle);
node = TreeView1.GetNodeAt((int)lp2->x1 + 1, (int)lp2->y...
x1 = lp2->x1 + node.Bounds.X + node.Bounds.Width + 5;
y1 = lp2->y1;
strText = "( " + node.Nodes.Count.ToString() + " )";
//Nodeの子ノード数をNodeの後ろに青で表示する
g.DrawString(strText, TreeView1.Font,
System.Drawing.Brushes.Blue,
x1, y1,
System.Drawing.StringFormat.GenericTypographic);
}
}}
ただしこの方法では、ノードの末尾に文字列を描画しているだ...
○この記事の基になった掲示板のスレッド
-[[TreeViewのテキスト表示部分の右: 投稿者(敬称略) edacho,...
**コンピュータ雑学 [#m20d01e9]
最近巷では「トリビアの泉」や「うんちく王」の影響でか、雑...
***「C言語」の「C」の意味は? [#z4b1c0b1]
C言語は、1973年頃AT&Tベル研究所でデニス・リッチー氏らによ...
-[[The Development of the C Language>http://cm.bell-labs....
それではB言語の前にA言語があったのかというと、そうではあ...
そうなると次は「D」ですが、「D言語」は現在開発中で、そこ...
-[[D Programming Language>http://www.digitalmars.com/d/in...
さらに調べてみたところ、E、F、G(National Instruments Lab...
-[[The E Language>http://www.erights.org/elang/index.html]]
-[[F Programming Language Homepage>http://www.fortran.com...
-[[National Instruments>http://www.ni.com/]]
-[[The H - Language. A small functional programming Langu...
**コメント [#hdccd065]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2004-06-16 (水) 06:00:00,DOB...
ページ名:
▲
▼
[
トップ
] [
新規
|
子ページ作成
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]