|
分類:[C#]
■No174に返信(C#に首ったけさんの記事) > そこで、さっそく、FileDialogを継承したクラスを作成しようとしたところ、 > 以下のコンパイルエラーが発生してしまい、いきなりつまずいてしまいました。 > > 「error CS0534: 'WindowsApplication1.test' は継承抽象メンバ 'System.Windows.Forms.FileDialog.RunFileDialog(System.Windows.Forms.NativeMethods.OPENFILENAME_I)' を実装しません。」 > > RunFileDialogを実装しようとしても、OPENFILENAME_Iがアクセス出来ない > 保護レベルとなっているようです。
重ね重ねすみません。 抽象メンバ RunFileDialog が System.Windows.Forms.NativeMethods を引数としているので、 ユーザーが FileDialog を継承することは出来ないですね。 もう一つ上の CommonDialog からだったら継承できることは確認できましたが、 結構作りこみが必要になりそうです。以下 Win2K 以降のみで有効な概要
using System; using System.Runtime.InteropServices;
public class MyOpenFileDialog : System.Windows.Forms.CommonDialog { public override void Reset() { }
protected override bool RunDialog(System.IntPtr hwndOwner) { bool ret = false; OPENFILENAME_I ofn = new OPENFILENAME_I(); int size = 0x2000; string fn = new string( '\0', size ); ofn.lpstrFile = Marshal.StringToBSTR( fn ); try { ofn.nMaxFile = size; ofn.Flags = 0x00000200 | 0x00080000;
ret = GetOpenFileName( ofn ); if ( ret ) { fn = Marshal.PtrToStringBSTR( ofn.lpstrFile ); string [] fns = fn.Split( new char[] { '\0' } ); // ToDo: FileNames 等を設定する。 } } finally { // Marshal.StringToBSTR で割り当てられた アンマネージ メモリ を開放する。 Marshal.FreeBSTR( ofn.lpstrFile ); } return ret; }
[DllImport("comdlg32.dll", CharSet=CharSet.Auto)] private static extern bool GetOpenFileName([In, Out] OPENFILENAME_I ofn);
private delegate IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto, Pack=1)] private class OPENFILENAME_I { public int lStructSize; public IntPtr hwndOwner; public IntPtr hInstance; public string lpstrFilter; public IntPtr lpstrCustomFilter; public int nMaxCustFilter; public int nFilterIndex; public IntPtr lpstrFile; public int nMaxFile; public IntPtr lpstrFileTitle; public int nMaxFileTitle; public string lpstrInitialDir; public string lpstrTitle; public int Flags; public short nFileOffset; public short nFileExtension; public string lpstrDefExt; public IntPtr lCustData; public WndProc lpfnHook; public string lpTemplateName; public IntPtr pvReserved; // Win2K 以降 public int dwReserved; // Win2K 以降 public int FlagsEx; // Win2K 以降 public OPENFILENAME_I() { this.lStructSize = 0x58; // Win2K 以降 } } }
(続く)
|