┏第47号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ──<メニュー>─────────────────────── ■.NET質問箱 ・通常使うプリンタの取得と設定 ・プリンタのポート、状態の取得 ・エクスプローラへファイルをドラッグ&ドロップする ・ツールバーに画像が表示されない ─────────────────────────────── ─────────────────────────────── ■.NET質問箱 ─────────────────────────────── 「.NET質問箱」では、「どぼん!のプログラミング掲示板」に書き込 まれた.NETプログラミングに関する投稿を基に、さらに考察を加え、 Q&A形式にまとめて紹介します。 [URL]どぼん!のプログラミング掲示板 http://dobon.net/vb/bbs.html ─────────────────────────────── ●通常使うプリンタの取得と設定 【質問】 「通常使うプリンタ」に指定されているプリンタ名はどのように取得 できますか?また、「通常使うプリンタ」を設定するにはどのように すればいいですか? 【回答】 「通常使うプリンタ」に指定されているプリンタ名は、新しく PrintDocumentオブジェクトを作成し、そのPrinterSettings. PrinterNameプロパティを調べれば分かります。次のような感じです。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 'PrintDocumentの作成 Dim pd As New System.Drawing.Printing.PrintDocument 'プリンタ名の取得 Dim defaultPrinterName As String = pd.PrinterSettings.PrinterName '結果を表示 Console.WriteLine("通常使用するプリンタは " + defaultPrinterName + " です。") ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //PrintDocumentの作成 System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument(); //プリンタ名の取得 string defaultPrinterName = pd.PrinterSettings.PrinterName; //結果を表示 Console.WriteLine( "通常使用するプリンタは " + defaultPrinterName + " です。"); ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ また、WMIを使用してプリンタを列挙し、デフォルトのプリンタを調 べることもできます。これは次のようなコードになります。(参照に "System.Management"が追加する必要があります。) [URL]Win32_Printer http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_printer.asp ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Dim mos As New System.Management.ManagementObjectSearcher( _ "Select * from Win32_Printer") Dim moc As System.Management.ManagementObjectCollection = _ mos.Get() 'プリンタを列挙する Dim mo As System.Management.ManagementObject For Each mo In moc 'デフォルトのプリンタか調べる 'mo("Default")はWindows NT 4.0, 2000で使用できません Dim attr As Long = Convert.ToInt64(mo("Attributes")) If (attr And 4) = 4 Then Console.WriteLine(("通常使用するプリンタは " + _ mo("Name").ToString() + " です。")) Exit For End If Next mo ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ System.Management.ManagementObjectSearcher mos = new System.Management.ManagementObjectSearcher( "Select * from Win32_Printer"); System.Management.ManagementObjectCollection moc = mos.Get(); //プリンタを列挙する foreach(System.Management.ManagementObject mo in moc) { //デフォルトのプリンタか調べる //mo["Default"]はWindows NT 4.0, 2000で使用できません if ((((uint) mo["Attributes"]) & 4) == 4) { Console.WriteLine( "通常使用するプリンタは " + mo["Name"] + " です。"); break; } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 次に「通常使うプリンタ」を設定する方法を紹介します。 まず、WMIを使用した方法を紹介します。ただしこの方法はWindows XP以上でしか使用できません。先ほどの例と同様、参照に"System. Management"を追加する必要があります。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ '/ '/ 「通常使用するプリンタ」に設定する '/ '/ プリンタ名 Public Sub SetDefaultPrinter(ByVal printerName As String) Dim mos As New System.Management.ManagementObjectSearcher( _ "Select * from Win32_Printer") Dim moc As System.Management.ManagementObjectCollection = _ mos.Get() 'プリンタを列挙する Dim mo As System.Management.ManagementObject For Each mo In moc If CStr(mo("Name")) = printerName Then '名前を見つけたとき、デフォルトプリンタに設定する Dim mbo As System.Management.ManagementBaseObject = _ mo.InvokeMethod("SetDefaultPrinter", Nothing, Nothing) Dim ret As Long = Convert.ToInt64(mbo("returnValue")) If ret <> 0 Then Throw New Exception("失敗しました。") End If End If Next mo End Sub ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ /// /// 「通常使用するプリンタ」に設定する /// /// プリンタ名 public void SetDefaultPrinter(string printerName) { System.Management.ManagementObjectSearcher mos = new System.Management.ManagementObjectSearcher( "Select * from Win32_Printer"); System.Management.ManagementObjectCollection moc = mos.Get(); //プリンタを列挙する foreach(System.Management.ManagementObject mo in moc) { if (((string) mo["Name"]) == printerName) { //名前を見つけたとき、デフォルトプリンタに設定する System.Management.ManagementBaseObject mbo = mo.InvokeMethod("SetDefaultPrinter", null, null); if (((uint) mbo["returnValue"]) != 0) throw new Exception("失敗しました。"); } } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ また、Windows Scripting HostのWshNetworkオブジェクトの SetDefaultPrinterメソッドを使う方法もあります。WshNetworkオブ ジェクトのSetDefaultPrinterメソッドを呼び出すには、次のように します。 [URL]SetDefaultPrinter メソッド http://www.microsoft.com/japan/msdn/library/ja/script56/html/wsmthsetdefaultprinter.asp ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ '/ '/ 「通常使用するプリンタ」に設定する '/ '/ プリンタ名 Public Sub SetDefaultPrinter(ByVal printerName As String) 'WshNetworkオブジェクトを作成する Dim t As Type = Type.GetTypeFromProgID("WScript.Network") Dim wshNetwork As Object = Activator.CreateInstance(t) 'SetDefaultPrinterメソッドを呼び出す t.InvokeMember("SetDefaultPrinter", _ System.Reflection.BindingFlags.InvokeMethod, _ Nothing, wshNetwork, New Object() {printerName}) End Sub ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ /// /// 「通常使用するプリンタ」に設定する /// /// プリンタ名 public void SetDefaultPrinter(string printerName) { //WshNetworkオブジェクトを作成する Type t = Type.GetTypeFromProgID("WScript.Network"); object wshNetwork = Activator.CreateInstance(t); //SetDefaultPrinterメソッドを呼び出す t.InvokeMember("SetDefaultPrinter", System.Reflection.BindingFlags.InvokeMethod, null, wshNetwork, new object[] {printerName}); } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 上記で紹介した方法以外に通常使うプリンタを取得するために GetDefaultPrinter、GetProfileString、GetPrinter関数を、通常使 うプリンタを設定するためにSetDefaultPrinter、 WriteProfileString、SetPrinter関数をP/Invokeにより呼び出すとい う方法もあります。これらの関数に関しては、次のリンク先をご覧く ださい。 [URL][HOWTO] Windows の通常使うプリンタを取得および設定する方 法 http://support.microsoft.com/kb/246772/ja GetPrinter関数に関しては、次の紹介する「プリンタのポートと状態 の取得」でその使用法を紹介しています(ただしこの方法で通常使う プリンタが取得できるのは、Windows95、98、Meのみです)。 ○この記事の基になった掲示板のスレッド [題名] 通常使うプリンタについて質問 [投稿者(敬称略)] PASA, 管理人 [URL] http://dobon.net/vb/bbs/log3-4/1950.html [題名] 通常使うプリンタの取得 [投稿者(敬称略)] tab, 管理人 [URL] http://dobon.net/vb/bbs/log3-4/1992.html ─────────────────────────────── ●プリンタのポート、状態の取得 【質問】 プリンタのポートや現在の状態に関する情報を取得したいのですが、 どうすればいいの? 【回答】 「通常使うプリンタの取得と設定」と同じように、WMIの Win32_Printerを使ってこれらの情報を取得できます。ポートは PortNameプロパティ、状態はPrinterStatusプロパティで取得できま す。 また、P/InvokeでGetPrinter関数を呼び出すことにより、プリンタの 情報を取得することもできます。ここではこの方法を紹介します。 下にプリンタの情報をPRINTER_INFO_2構造体で取得するためのメソッ ド(GetPrinterInfoメソッド)のサンプルを示します。 [URL]PRINTER_INFO_2 http://msdn.microsoft.com/library/en-us/gdi/prntspol_9otu.asp なおこのコードを書くために次の記事を参考にしました。 [URL]Newsgroups:microsoft.public.dotnet.framework.interop Subject:Solution: Printer Port and Driver Information (PRINTER_INFO_2) http://groups.google.co.jp/groups?hl=ja&lr=&inlang=ja&selm=8FE95F7B-C55D-4AB2-8E6D-3A3FE1E1812C%40microsoft.com [URL]The Code Project - Changing printer settings using C# http://www.codeproject.com/dotnet/NET_Printer_Library.asp ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Private Shared Function OpenPrinter( _ ByVal pPrinterName As String, ByRef hPrinter As IntPtr, _ ByVal pDefault As IntPtr) As Boolean End Function _ Private Shared Function ClosePrinter( _ ByVal hPrinter As IntPtr) As Boolean End Function _ Private Shared Function GetPrinter( _ ByVal hPrinter As IntPtr, ByVal dwLevel As Integer, _ ByVal pPrinter As IntPtr, ByVal cbBuf As Integer, _ ByRef pcbNeeded As Integer) As Boolean End Function _ Public Structure PRINTER_INFO_2 Public pServerName As String Public pPrinterName As String Public pShareName As String Public pPortName As String Public pDriverName As String Public pComment As String Public pLocation As String Public pDevMode As IntPtr Public pSepFile As String Public pPrintProcessor As String Public pDatatype As String Public pParameters As String Public pSecurityDescriptor As IntPtr Public Attributes As System.UInt32 Public Priority As System.UInt32 Public DefaultPriority As System.UInt32 Public StartTime As System.UInt32 Public UntilTime As System.UInt32 Public Status As System.UInt32 Public cJobs As System.UInt32 Public AveragePPM As System.UInt32 End Structure '/ '/ プリンタの情報をPRINTER_INFO_2で取得する '/ '/ プリンタ名 '/ プリンタの情報 Public Shared Function GetPrinterInfo( _ ByVal printerName As String) As PRINTER_INFO_2 'プリンタのハンドルを取得する Dim hPrinter As IntPtr If Not OpenPrinter(printerName, hPrinter, IntPtr.Zero) Then Throw New Win32Exception(Marshal.GetLastWin32Error()) End If Dim pPrinterInfo As IntPtr = IntPtr.Zero Try '必要なバイト数を取得する Dim needed As Integer GetPrinter(hPrinter, 2, IntPtr.Zero, 0, needed) If needed <= 0 Then Throw New Exception("失敗しました。") End If 'メモリを割り当てる pPrinterInfo = Marshal.AllocHGlobal(needed) 'プリンタ情報を取得する Dim temp As Integer If Not GetPrinter(hPrinter, 2, pPrinterInfo, needed, temp) Then Throw New Win32Exception(Marshal.GetLastWin32Error()) End If 'PRINTER_INFO_2型にマーシャリングする Dim printerInfo As PRINTER_INFO_2 = _ CType(Marshal.PtrToStructure( _ pPrinterInfo, GetType(PRINTER_INFO_2)), PRINTER_INFO_2) '結果を返す Return printerInfo Finally '後始末をする ClosePrinter(hPrinter) Marshal.FreeHGlobal(pPrinterInfo) End Try End Function ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [DllImport("winspool.drv", EntryPoint="OpenPrinterW", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)] private static extern bool OpenPrinter(string pPrinterName, out IntPtr hPrinter, IntPtr pDefault); [DllImport("winspool.drv", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)] private static extern bool ClosePrinter(IntPtr hPrinter); [DllImport("winspool.drv", EntryPoint="GetPrinterW", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)] private static extern bool GetPrinter(IntPtr hPrinter, int dwLevel, IntPtr pPrinter, int cbBuf, out int pcbNeeded); [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] public struct PRINTER_INFO_2 { public string pServerName; public string pPrinterName; public string pShareName; public string pPortName; public string pDriverName; public string pComment; public string pLocation; public IntPtr pDevMode; public string pSepFile; public string pPrintProcessor; public string pDatatype; public string pParameters; public IntPtr pSecurityDescriptor; public uint Attributes; public uint Priority; public uint DefaultPriority; public uint StartTime; public uint UntilTime; public uint Status; public uint cJobs; public uint AveragePPM; } /// /// プリンタの情報をPRINTER_INFO_2で取得する /// /// プリンタ名 /// プリンタの情報 public static PRINTER_INFO_2 GetPrinterInfo(string printerName) { //プリンタのハンドルを取得する IntPtr hPrinter; if (!OpenPrinter(printerName, out hPrinter, IntPtr.Zero)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } IntPtr pPrinterInfo = IntPtr.Zero; try { //必要なバイト数を取得する int needed; GetPrinter(hPrinter, 2, IntPtr.Zero, 0, out needed); if (needed <= 0) throw new Exception("失敗しました。"); //メモリを割り当てる pPrinterInfo = Marshal.AllocHGlobal(needed); //プリンタ情報を取得する int temp; if (!GetPrinter(hPrinter, 2, pPrinterInfo, needed, out temp)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } //PRINTER_INFO_2型にマーシャリングする PRINTER_INFO_2 printerInfo = (PRINTER_INFO_2) Marshal.PtrToStructure(pPrinterInfo, typeof(PRINTER_INFO_2)); //結果を返す return printerInfo; } finally { //後始末をする ClosePrinter(hPrinter); Marshal.FreeHGlobal(pPrinterInfo); } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ GetPrinterInfoメソッドを使ってプリンタのポートと状態を取得する 例を以下に示します。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 'プリンタ名 Dim printerName As String = "PRINTER NAME" 'プリンタ情報を取得する Dim pinfo As PRINTER_INFO_2 = GetPrinterInfo(printerName) 'ポートを表示する Console.WriteLine(("Port:" + pinfo.pPortName)) '状態を表示する Console.WriteLine(("Status:" + pinfo.Status.ToString())) ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //プリンタ名 string printerName = "PRINTER NAME"; //プリンタ情報を取得する PRINTER_INFO_2 pinfo = GetPrinterInfo(printerName); //ポートを表示する Console.WriteLine("Port:" + pinfo.pPortName); //状態を表示する Console.WriteLine("Status:" + pinfo.Status.ToString()); ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ○この記事の基になった掲示板のスレッド [題名] プリンターポートの取得方法について [投稿者(敬称略)] パオ, 管理人 [URL] http://dobon.net/vb/bbs/log3-4/2062.html ─────────────────────────────── ●エクスプローラへファイルをドラッグ&ドロップする 【質問】 ListBoxコントロールのリストにファイル名を追加し、リストからエ クスプローラにドラッグ&ドロップすることによりファイルをコピー できるようにしたいのですが、どうすればできますか? 【回答】 エクスプローラへのドラッグ&ドロップも通常のドラッグ&ドロップ同 様、Control.DoDragDropメソッドで可能です。(通常のドラッグ&ド ロップの方法に関しては、下記リンク先をご覧ください。) [URL]DOBON.NET .NET Tips - ドラッグ&ドロップを行う http://dobon.net/vb/dotnet/control/draganddrop.html ただしDoDragDropメソッドを呼び出す時、データ形式にDataFormats. FileDropを、データにドロップ&ドラッグしたいファイルのフルパス のString型配列(ただのString型ではないことに注意してください) を指定して作成したDataObjectオブジェクトを使用します。 以下にリストボックスからエクスプローラへのファイルのドラッグ& ドロップを可能にするサンプルを示します。このサンプルでは、フォー ム(Form1)にリストボックス(ListBox1)が配置されている必要があり ます。フォームのLoadイベントハンドラでリストボックスにファイル 名を表示し、リストボックスのMouseDownイベントハンドラでドラッ グを開始するようにしています。ここでは一つのファイルしかドラッ グ&ドロップできませんが、String型配列に複数のファイルのパスを 指定すれば、複数のファイルのドラッグ&ドロップが可能です。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load 'MouseDownイベントハンドラを追加 AddHandler ListBox1.MouseDown, AddressOf ListBox1_MouseDown 'ListBox1に"C:\"にあるファイルを表示する ListBox1.Items.AddRange( _ System.IO.Directory.GetFiles("C:\", "*.*")) End Sub 'ListBox1のMouseDownイベントハンドラ Private Sub ListBox1_MouseDown(ByVal sender As Object, _ ByVal e As MouseEventArgs) Dim lbx As ListBox = CType(sender, ListBox) 'ドラッグするファイル名を取得する Dim itemIndex As Integer = lbx.IndexFromPoint(e.X, e.Y) If itemIndex < 0 Then Return End If Dim files As String() = {CStr(lbx.Items(itemIndex))} 'DataObjectを作成する Dim dataObj As New DataObject(DataFormats.FileDrop, files) 'ドラッグを開始する Dim dde As DragDropEffects = _ lbx.DoDragDrop(dataObj, DragDropEffects.Copy) End Sub ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //フォームのLoadイベントハンドラ private void Form1_Load(object sender, System.EventArgs e) { //MouseDownイベントハンドラを追加 ListBox1.MouseDown += new MouseEventHandler(ListBox1_MouseDown); //ListBox1に"C:\"にあるファイルを表示する ListBox1.Items.AddRange( System.IO.Directory.GetFiles("C:\\", "*.*")); } //ListBox1のMouseDownイベントハンドラ private void ListBox1_MouseDown(object sender, MouseEventArgs e) { ListBox lbx = (ListBox) sender; //ドラッグするファイル名を取得する int itemIndex = lbx.IndexFromPoint(e.X, e.Y); if (itemIndex < 0) return; string[] files = {(string) lbx.Items[itemIndex]}; //DataObjectを作成する DataObject dataObj = new DataObject(DataFormats.FileDrop, files); //ドラッグを開始する DragDropEffects dde = lbx.DoDragDrop(dataObj, DragDropEffects.Copy); } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ なお、ファイルを移動するためにDoDragDropメソッドで DragDropEffects.Moveを使用した場合、DoDragDropメソッドが返す DragDropEffectsの値はNoneになるようです。ファイルを移動したか を調べるには、DoDragDropメソッドが終了してからFile.Existsメソ ッドを使ってドラッグしたファイルが削除されたか調べるなどの方法 が考えられます。(詳しくは、下の「エクスプローラへのドラッグ& ドロップで移動された場合の判定について」のリンク先をご覧くださ い。) ○この記事の基になった掲示板のスレッド [題名] VB.Netで作成したアプリからエクスプローラへのドラッグ& ドロップの方法 [投稿者(敬称略)] L, 管理人 [URL] http://dobon.net/vb/bbs/log3-4/2064.html [題名] listBoxでエクスプローラーのドラッグ&ドロップの実現方法 [投稿者(敬称略)] brn, りょう, Sugi@ぱぱんぶぃびぃ, 管理人 [URL] http://dobon.net/vb/bbs/log3-6/3108.html [題名] エクスプローラへのドラッグ&ドロップで移動された場合の 判定について [投稿者(敬称略)] Mike3, 深山 [URL] http://dobon.net/vb/bbs/log3-5/2450.html ─────────────────────────────── ●ツールバーに画像が表示されない 【質問】 Visual Studio .NETのフォームデザイナでImageListを使ってツール バーのボタンに画像を表示しているのですが、画像が表示されません。 一体どうなっているのでしょうか? 【回答】 Application.EnableVisualStylesメソッドを使用している時は、これ が原因でしょう。この場合は、EnableVisualStylesメソッドのすぐ後 でApplication.DoEventsメソッドを呼び出すか、EnableVisualStyles メソッドを使わずにマニフェストファイルを使用することにより解決 できます。これらの方法に関しては、次のリンク先をご覧ください。 [URL]DOBON.NET .NET Tips - コントロールの外観をXPスタイルにす る http://dobon.net/vb/dotnet/control/xpstyle.html さらに、EnableVisualStylesメソッドを使用していなくてもツールバー に画像が表示されないというバグもあるようで、これに関しては次の ページで紹介されています。 [URL]Newsgroups:microsoft.public.dotnet.languages.csharp Subject:RE: C# toolbar image visible at design time, but vanishes at runtime. http://groups.google.co.jp/groups?hl=ja&lr=&selm=kV%24mXFjOCHA.1716%40cpmsftngxa07 この記事によるとこの問題の解決法は、コードエディタで該当するフ ォームクラスのInitializeComponentメソッド内にあるToolBar. Buttons.Addrangeメソッドを呼び出している箇所を、ツールバーのボ タンの設定の後ろに移動させるということのようです。しかしデザイ ナで変更を加えるたびにコードが書き換わってしまうため、そのたび にAddrangeを移動させなければならないということです。 ツールバーに画像が表示されなくて困っている方は一度おためしを。 ○この記事の基になった掲示板のスレッド [題名] ツールバーのアイコンが表示されない [投稿者(敬称略)] MoMoMo, Sugi@ぱぱんぶぃびぃ, 管理人 [URL] http://dobon.net/vb/bbs/log3-4/2064.html =============================== ■ここで示したコードの多くはまずC#で書き、それを「C# to VB.NET Translator」でVB.NETのコードに変換し、修正を加えたものです。 [URL]C# to VB.NET Translator http://authors.aspalliance.com/aldotnet/examples/translate.aspx ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  (Microsoft MVP for Visual Basic, Oct 2004-Oct 2005)  http://dobon.net  dobon_info@yahoo.co.jp ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/vb/bbs.html ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 - 2004 DOBON! All rights reserved. ===============================