怎样实现MFC的mfc 弹出对话框框摄像头漫游,基于Dlg,第一选什么控件显示,第二如何初始化,场景已建好,盼大虾指教。

扩展OpenFileDialog和SaveFileDialog最简单的方式_对话框和窗口_桌面_或代码
| 文章 >> 桌面 >> 对话框和窗口
扩展OpenFileDialog和SaveFileDialog最简单的方式
{A}目录表{A10}{A11} {S0}{A13}如果你使用的WinForms,机会是,在某些时候,你想延长OpenFileDialog或SaveFileDialog,但你放弃了,因为有没有简单的方法做到这一点,特别是如果你想添加一些新的图形元素。即使在MFC的日子里,这样的任务是不作为,因为它是艰巨的。NET的,因为这些类是密封的,露出只有16个属性,方法5和3,可用于自定义对话框的事件。 {A14}。虽然本文使用的唯一的C#代码片段,我已经包含在下载的zip文件的VB的人同等的VB.NET代码。{A15}为了使延长尽可能容易,我已经添加了一些额外的属性和事件的基本控制,以及一些设计特点。也许最欣赏的财产将被FileDlgType,将允许在设计时选择OpenFileDialog和SaveFileDialog之间。额外的属性和事件显示如下:属性活动{A16},这将是很好,有一些有关如何控制看起来像视觉线索。我不想掏太多{A17},所以我用一个简单的OnPaint覆盖画出一条红线或一个点的FileDialog触及扩展。请注意,它是仅在设计模式下画。protected override void OnPaint(PaintEventArgs e)
if (DesignMode)
Graphics gr = e.G
HatchBrush hb = null;
Pen p = null;
switch (this.FileDlgStartLocation)
case AddonWindowLocation.Right:
hb = new System.Drawing.Drawing2D.HatchBrush
(HatchStyle.NarrowHorizontal, Color.Black, Color.Red);
p = new Pen(hb, 5);
gr.DrawLine(p, 0, 0, 0, this.Height);
case AddonWindowLocation.Bottom:
hb = new System.Drawing.Drawing2D.HatchBrush
(HatchStyle.NarrowVertical, Color.Black, Color.Red);
p = new Pen(hb, 5);
gr.DrawLine(p, 0, 0, this.Width, 0);
case AddonWindowLocation.BottomRight:
hb = new System.Drawing.Drawing2D.HatchBrush
(HatchStyle.Sphere, Color.Black, Color.Red);
p = new Pen(hb, 5);
gr.DrawLine(p, 0, 0, 4, 4);
if (p != null)
p.Dispose();
if (hb != null)
hb.Dispose();
base.OnPaint(e);
}{A18} {A19}介绍了如何控制工程详细。我已经做了一些改进,但总体思路是相同的。您需要获得云模式对话框处理之前,所以可以"粘合在一起"与您自己的控制对话。下面是这种复合对话框初始化流:使用其构造函数创建的对话框。在这一点上,仍然没有UI,所以没有Windows消息赶上你想改变的属性设置在运行时的FileDialog和控制本身的Load事件中使用的虚拟OnPrepareMSDialog()使用返回的DialogResult和处置的控制这里是幕后发生的事情:你用正确的FileDialog作为一个泛型参数的类型创建的helper类DialogWrapper开始:{C}当你调用ShowDialog的公共方法,在你的控制,消息开始流动后,你叫。NET的打开(保存)FileDialog.ShowDialog()。你必须留意WM_ACTIVATE,因为应用程序过滤器将不会抓住它,你必须依靠父母的窗口的WndProc。而不是使用一个虚拟的形式,我发现了一个消息泵窗口将不只是罚款开销更少。我创建WholeDialogWrapper的构造函数调用AssignDummyWindow()内。private void AssignDummyWindow()
_hDummyWnd = NativeMethods.CreateWindowEx(0, "Message",
null, WS_VISIBLE, 0, 0, 0, 0,HWND_MESSAGE, NULL, NULL, NULL);
if (_hDummyWnd == NULL || !NativeMethods.IsWindow(_hDummyWnd))
throw new ApplicationException("Unable to create a dummy window");
AssignHandle(_hDummyWnd);
}既然我们有这个窗口,听其子女,我们将赶上WM_ACTIVATE如下:protected override void WndProc(ref Message m)
switch ((Msg)m.Msg)
case Msg.WM_ACTIVATE:
if (_WatchForActivate && !mIsClosing && m.Msg == (int)Msg.WM_ACTIVATE)
_WatchForActivate = false;
_FileDialogHandle = m.LP
ReleaseHandle();
AssignHandle(_FileDialogHandle);
NativeMethods.GetWindowRect(_FileDialogHandle,
ref _CustomControl._DialogWindowRect);
_CustomControl._FileDialogHandle = _FileDialogH
base.WndProc(ref m);
}一旦我们得到了真正的对话作为_FileDialogHandle处理,我们可以忘记的虚拟窗口,并开始听真正的问题。请注意我是如何发布的虚拟窗口处理和分配新。当相同的WndProc渔获 WM_SHOWWINDOW消息,我们终于可以安排我们的控制,并设置父:private void InitControls()
mInitializated = true;
NativeMethods.GetClientRect(new HandleRef(this,_hFileDialogHandle),
ref _DialogClientRect);
NativeMethods.GetWindowRect(new HandleRef(this,_hFileDialogHandle),
ref _DialogWindowRect);
PopulateWindowsHandlers();
switch (_CustomControl.FileDlgStartLocation)
case AddonWindowLocation.Right:
_CustomControl.Location = new Point((int)
(_DialogClientRect.Width - _CustomControl.Width), 0);
case AddonWindowLocation.Bottom:
_CustomControl.Location = new Point(0,
(int)(_DialogClientRect.Height - _CustomControl.Height));
case AddonWindowLocation.BottomRight:
_CustomControl.Location =
new Point((int)(_DialogClientRect.Width - _CustomControl.Width),
(int)(_DialogClientRect.Height - _CustomControl.Height));
NativeMethods.SetParent(new HandleRef(_CustomControl,_CustomControl.Handle),
new HandleRef(this,_hFileDialogHandle));
(IntPtr)ZOrderPos.HWND_BOTTOM, 0, 0, 0, 0, UFLAGSZORDER);
_CustomControl.MSDialog.Disposed += new EventHandler(DialogWrappper_Disposed);
}{A20}你可能会认为此代码可以使用的属性和事件有关的详尽。嗯... ...不大!我已经添加了几个属性和事件到原来的工作,但您可能仍然想添加更多的给它。就在上面的代码片断,你看如何从"打开(保存)FileDialog.Dispose事件挂钩,但是这是一件容易的。我将描述如何,您可以添加新的事件FileDialogControlBase基于一个,我添加了一个例子还有另一个helper类MSFileDialogWrapper监测通过的WndProc打开(保存)的FileDialog对象如下。protected override void WndProc(ref Message m)
switch ((Msg)m.Msg)
case Msg.WM_NOTIFY:
OFNOTIFY ofNotify = (OFNOTIFY)Marshal.PtrToStructure
(m.LParam, typeof(OFNOTIFY));
switch (ofNotify.hdr.code)
case (uint)DialogChangeStatus.CDN_TYPECHANGE:
OPENFILENAME ofn =
(OPENFILENAME)Marshal.PtrToStructure
(ofNotify.OpenFileName, typeof(OPENFILENAME));
int i = ofn.nFilterI
if (_CustomCtrl != null && _filterIndex != i)
_filterIndex =
_CustomCtrl.OnFilterChanged
(this as IWin32Window, i);
base.WndProc(ref m);
}一旦我们元帅的内部指针到正确的结构,我们称之为FileDialogControBase对象,这是在这种情况下_CustomCtrl OnFilterChanged方法。 ,如果我们挖出深入这个方法,我们发现的东西如下:internal void OnFilterChanged(IWin32Window sender, int index)
if (EventFilterChanged != null)
EventFilterChanged(sender, index);
}在EventFilterChanged定义一个快速浏览一下发现这是一个事件。public delegate void PathChangedEventHandler(IWin32Window sender,
string filePath);
public delegate void FilterChangedEventHandler(IWin32Window sender, int index);
public event PathChangedEventHandler EventFileNameC
public event PathChangedEventHandler EventFolderNameC
public event FilterChangedEventHandler EventFilterC
public event CancelEventHandler EventClosingD这使得它非常容易添加和删除他们以同样的方式与常规的WinForms事件处理。{A21}要设置"打开(保存)FileDialog对象的属性,你必须重写OnPrepareMSDialog(),如果设计时设置不正确。然而,改变的打开(保存)FileDialog的外观更详细的。作为一个例子,我将展示如何改变OK按钮的文字 - 保存或打开按钮。我们先从从FileDialogControlBase公开的属性,然后使用PInvoke设定如下的文字:[DefaultValue("&Open")]
public string FileDlgOkCaption
get { return _OKC }
set { _OKCaption = }
protected override void OnLoad(EventArgs e)
base.OnLoad(e);
if (!DesignMode)
if (MSDialog != null)
MSDialog.FileOk += new CancelEventHandler
(FileDialogControlBase_ClosingDialog);
MSDialog.Disposed += new EventHandler
(FileDialogControlBase_DialogDisposed);
MSDialog.HelpRequest += new EventHandler
(FileDialogControlBase_HelpRequest);
NativeMethods.SetWindowText(_dlgWrapper.Handle, _Caption);
NativeMethods.SetWindowText(_hOKButton, _OKCaption);
}正如你看到的在上面的代码中的注释,认识到我们处理的是一个黑盒子,有时我们无法知道正确的方式来更新。这是一种情况时,我们可以改变OpenFileDialog的,但不是在SaveFileDialog。如果你想知道我们如何得到_hOKButton或_dlgWrapper.Handle的,你会看FileDialogEnumWindowCallBack WM_SHOWWINDOW是在DialogWrapper的WndProc捕获时调用。private bool FileDialogEnumWindowCallBack(IntPtr hwnd, int lParam)
StringBuilder className = new StringBuilder(256);
NativeMethods.GetClassName(new HandleRef(this,hwnd), className, className.Capacity);
int controlID = NativeMethods.GetDlgCtrlID(hwnd);
WINDOWINFO windowI
NativeMethods.GetWindowInfo(new HandleRef(this,hwnd), out windowInfo);
if (className.ToString().StartsWith("#32770"))
_BaseDialogNative = new MSFileDialogWrapper(_CustomControl);
_BaseDialogNative.AssignHandle(hwnd);
return true;
switch ((ControlsId)controlID)
case ControlsId.ButtonOk:
_OKButton =
_OKButtonInfo = windowI
_CustomControl._hOKButton =
}{A22},直到NET 3.5介绍{A23}适用于基类FileDialog的。下面是静态类,它暴露了两个公共方法设置的地方和还原注册表。public static class FileDialogPlaces
private static readonly string TempKeyName =
"TempPredefKey_" + Guid.NewGuid().ToString();
private const string Key_PlacesBar =
@"Software\Microsoft\Windows\CurrentVersion\Policies\ComDlg32\PlacesBar";
private static RegistryKey _fakeK
private static IntPtr _overriddenK
private static object[] m_
public static void SetPlaces(this FileDialog fd, object[] places)
if (fd == null)
if (m_places == null)
m_places = new object[5];
m_places.Initialize();
if (places != null)
for (int i = 0; i & m_places.GetLength(0); i++)
m_places[i] = places[i];
if (_fakeKey != null)
ResetPlaces(fd);
SetupFakeRegistryTree();
if (fd != null)
fd.Disposed += (object sender, EventArgs e) =&
{ if (m_places != null && fd != null) ResetPlaces(fd); };
static public void ResetPlaces(this FileDialog fd)
if (_overriddenKey != IntPtr.Zero)
ResetRegistry(_overriddenKey);
_overriddenKey = IntPtr.Z
if (_fakeKey != null)
_fakeKey.Close();
_fakeKey = null;
Registry.CurrentUser.DeleteSubKeyTree(TempKeyName);
m_places = null;
private static void SetupFakeRegistryTree()
_fakeKey = Registry.CurrentUser.CreateSubKey(TempKeyName);
_overriddenKey = InitializeRegistry();
RegistryKey reg = Registry.CurrentUser.CreateSubKey(Key_PlacesBar);
for (int i = 0; i & m_places.GetLength(0); i++)
if (m_places[i] != null)
reg.SetValue("Place" + i.ToString(), m_places[i]);
static readonly UIntPtr HKEY_CURRENT_USER = new UIntPtr(0xu);
private static IntPtr InitializeRegistry()
IntPtr hkMyCU;
NativeMethods.RegCreateKeyW(HKEY_CURRENT_USER, TempKeyName, out hkMyCU);
NativeMethods.RegOverridePredefKey(HKEY_CURRENT_USER, hkMyCU);
return hkMyCU;
static void ResetRegistry(IntPtr hkMyCU)
NativeMethods.RegOverridePredefKey(HKEY_CURRENT_USER, IntPtr.Zero);
NativeMethods.RegCloseKey(hkMyCU);
} SetPlaces五个对象可以作为普通的文件夹的特殊文件夹或字符串的数字数组参数。的FileDialog的Disposed事件ResetPlaces恢复注册表的自动呼叫。 如果你是在Vista上运行您的应用程序或更高版本,请忽略这个类,并使用微软的FileDialogCustomPlacesCollection类,而不是,或更好,但使用一些逻辑来选择} {A24为基础的方法。{A25}现在,让我们把它的工作。开始使用它,你可以放置在您的项目的代码或只需添加一个FileDlgExtenders.dll大会或FileDlgExtenders项目的参考。如果你选择了后者,构建解决方案,然后再往前走,因为你需要在设计时的基类。要尽可能容易的事情,选择"添加用户控制"到您的项目,比挑"继承的用户控件",最后从列表中选择FileDialogControlBase。作为一个例子,我已经添加了所谓MySaveDialogControl控制,这只是图像转换到所需的尺寸,方向和文件格式的缩略图。接下来,你可能会在设计模式中设置的属性和事件。有2种方式来显示控制。{A26}设置FileDialog的在运行时的数据,在子类中重写的虚方法OnPrepareMSDialog()。你应该调用base.OnPrepareMSDialog()首先,让自己的更改不会被擦去。下面是我如何改变我的派生控件在运行时的FileDialog的属性的一个例子。protected override void OnPrepareMSDialog()
base.FileDlgInitialDirectory = Environment.GetFolderPath
(Environment.SpecialFolder.MyPictures);
if (Environment.OSVersion.Version.Major & 6)
MSDialog.SetPlaces( new object[] { @"c:\",
(int)Places.MyComputer, (int)Places.Favorites, (int)Places.Printers,
(int)Places.Fonts, });
base.OnPrepareMSDialog();
需要一个类似的预防措施是,如果您选择覆盖的OnLoad。一定要呼叫base.OnLoad,否则Load事件将不会被调用。作为小费,如果Visual Studio无法呈现新的控制,清洁的解决方案,并再次重建。如果仍然无法正常工作,您可能必须手动清除bin文件夹,并检查什么对象,你在设计时初始化。 最后,这里是来电显示:using (MySaveDialogControl saveDialog = new MySaveDialogControl(lblFilePath.Text, this))
if (saveDialog.ShowDialog(this) == DialogResult.OK)
lblFilePath.Text = saveDialog.MSDialog.FileN
}{A27}有些人可能更喜欢的语法糖的扩展方法的ShowDialog提供:public static class Extensions
public static DialogResult ShowDialog
(this FileDialog fdlg, FileDialogControlBase ctrl, IWin32Window owner)
ctrl.FileDlgType =(fdlg is SaveFileDialog)?
FileDialogType.SaveFileDlg: FileDialogType.OpenFileD
if (ctrl.ShowDialogExt(fdlg, owner) == DialogResult.OK)
return DialogResult.OK;
return DialogResult.I
}你会不会在意了压倒一切的OnPrepareMSDialog(),但你必须在运行时设置的FileDialog成员在调用者的代码编程。using (MyOpenFileDialogControl openDialogCtrl = new MyOpenFileDialogControl())
openDialogCtrl.FileDlgInitialDirectory =
Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
OpenFileDialog openDialog = new OpenFileDialog();
openDialog.InitialDirectory = Environment.GetFolderPath
(Environment.SpecialFolder.MyPictures);
openDialog.AddExtension = true;
openDialog.Filter = "Image Files(*.bmp)|*.bmp
|Image Files(*.JPG)|*.JPG|Image Files(*.jpeg)|*.jpeg
|Image Files(*.GIF)|*.GIF|Image Files(*.emf)|*emf.|
Image Files(*.ico)|*.ico|Image Files(*.png)|*.png|
Image Files(*.tif)|*.tif|Image Files(*.wmf)|*.wmf|Image Files(*.exif)|*.exif";
openDialog.FilterIndex = 2;
openDialog.CheckFileExists = true;
openDialog.DefaultExt = "jpg";
openDialog.FileName = "Select Picture";
openDialog.DereferenceLinks = true;
if (Environment.OSVersion.Version.Major & 6)
openDialog.SetPlaces(new object[] { @"c:\",
(int)Places.MyComputer, (int)Places.Favorites,
(int)Places.Printers, (int)Places.Fonts, });
if (openDialog.ShowDialog(openDialogCtrl, this) == DialogResult.OK)
lblFilePath.Text = openDialog.FileN
}{A28}这是1.0版,如果你不顾{A29}。对于我来说,它工作正常,在32位Windows XP SP3的。我希望你会喜欢它。1.1版修复与破坏的文件列表关联错误,并保持处理和视图模式最新。我已经添加了一个新的设计时间的属性,以启用/禁用所谓"FileDlgEnableOkBtn'OK按钮下面是一个转换结果的基础上,此属性可以使用的例子。private void MySaveDialogControl_FilterChanged
(IWin32Window sender, int index)
FileDlgEnableOkBtn = GetFormatFromIndex(index);
版本1.2增加了几个修复观众留下反馈这里是最重要的变化,我看到他们的建议。约翰Horigan:"AutoUpgradeEnabled'属性设置为Vista / 7的为falseLETRESTE布鲁诺:改善显示对话框时,将AutoSize该解决方案已被转换到Visual Studio 2008。 VS 2005中的旧的源代码是customFileDialog_old.zip如果您仍然使用VS 2005中,只需复制在旧的新的*. cs文件和开放的解决方案/项目。它应该工作。
我还使用了一个自动化的工具,创建一个VB版本相同的解决方案。VB源代码包含了,它似乎工作。1.3版已固定{A30}更多的问题,向观众致谢我也加入了针对Windows 2000和XP的新功能的地方栏的支持。在VS 2008(。NET 3.5中)和2010年VB和C#(。NET 4.0)的解决方案文件。以前的源代码是在嵌入式CustomFileDialog_src_old.zip归档。
关于作者:
中国我是一名编程爱好者,谢谢orcode.com为我们提供一个学习和分享的平台。有什么问题。可以就本内容回复,我看到时。会尽量回复的。
评论会员:
时间:广泛的工作片,解决一个共同的问题和困难的问题。不像有些人,我不指望你可,无限期,并在短时间内,解决任何问题,我可能会用它评论会员:
时间:感谢,{S3}
我的时间是有限的,我会更新C#和vb.net版本,我保持。添加像XP,VISTA,WIN 7 32位和64位varios环境下的测试,你就会明白为什么一个看似简单的修复需要这么多时间。我需要在所有这些环境中进行测试,以确保"包治百病"并不比"病"更糟评论会员:
时间:我运行Vista的32。我有同样的问题,mariusmeier报告(运行的是Windows 7):对话框的初始大小是非常大的看来,Vista的(大概是Windows 7中)发送WM_WINDOWPOSCHANGING SWP_NOSIZE取消设置的WholeDialogWrapper几次。不写代码是考虑到这种可能性,并添加自定义控件(宽度或高度),每次
解决这个问题我曾加入一个bool mResized标志WholeDialogWrapper(初始值假)。然后,我测试这个标志是假的(而不是bInitialized,这是唯一一次InitControls,),并设置它一旦窗口一直在WholeDialogWrapper.WndProc调整大小:
除了在Vista下,我还没有测试菲尔阿特金英国剑桥,
4天前修改评论会员:
时间:感谢您的报告
打错你的文字:"bResized"变化(二)"mResized"(M)。
我无法弄清楚如何运用你的代码。在的WndProc()类"NativeFileDialogWrapper"没有"_CustomControl"和开关的WndProc()类"DialogWrapper"不喜欢的枚举"Msg.WM_WINDOWPOSCHANGING"。
另外,我不知道如何添加更换"...".{ BR}当您编辑您的文章,并添加更多的细节,这将是很好评论会员:
时间:你是对bResized / mResized错字正确的:我已经纠正了这个修正后的代码是从WholeDialogWrapper.WndP我编辑,以澄清此。 我希望编辑是现在更容易申请。菲尔阿特金英国剑桥,评论会员:
时间:这是相当不错的代码,但缺乏问题的听证会后,立即更新你的愿望是烦人。
说:"我会revist与VS2012的代码出来的",是非常不能接受的。
这是唯一的原因,我给你的文章,而不是3 4或5 评论会员:
时间:我创建了一个控制和实施。当我比我的控制较小的形式,我的控制不会被调整,直到我点击窗体的边框。解决方法是:
文件:HelperTypes.cs 类别:WholeDialogWrapper 方法:WndProc的
case Msg.WM_SIZE:
NativeMethods.GetClientRect(new HandleRef(this,_hFileDialogHandle), ref currentSize);
switch (_CustomControl.FileDlgStartLocation)
case AddonWindowLocation.Bottom:
if (!mInitializated && FileDialogControlBase.OriginalDlgWidth == 0)
FileDialogControlBase.OriginalDlgWidth = currentSize.W
if (currentSize.Width != _CustomControl.Width)
_CustomControl.Width = (int)currentSize.W
break;".45核心 - 因为拍摄两次只是傻" - JSOP,2010 {BR }-----{ BR}您可以从来没有太多的弹药 - 除非你游泳,或着火。 - JSOP,2010 {BR }-----{ BR}"为什么你不配合你的脚踝周围煤油浸泡过的抹布,让蚂蚁不会爬上,吃你的糖果屁股。" - 山谷Earnhardt,1997年
评论会员:
时间:我的用户八方来与有关的FileDialogs问题。现在,他们希望有详细视图自动diaolg开始按日期排序。我发现如何更改为详细信息视图,但现在如何排序。这里是我的了。它为我工作。我只是要求在OnLoad覆盖这个funtion: public void SortByDate()
IntPtr hWndWin = NativeMethods.FindWindowEx(_dlgWrapper.Handle, IntPtr.Zero, "SHELLDLL_DefView", "");
if (hWndWin != IntPtr.Zero)
NativeMethods.SendMessage(new HandleRef(this, hWndWin), (int)Msg.WM_COMMAND, (IntPtr)(int)DefaultViewType.Details, IntPtr.Zero);
sort by date
int HDN_FIRST = (-300);
int HDN_ITEMCLICKW = (HDN_FIRST - 22);
IntPtr hWndLV = NativeMethods.FindWindowEx(hWndWin, IntPtr.Zero, "SysListView32", IntPtr.Zero);
IntPtr hWndColHd = NativeMethods.FindWindowEx(hWndLV, IntPtr.Zero, "SysHeader32", IntPtr.Zero);
NMHEADER NMH = new NMHEADER();
NMH.hdr.hwndFrom = hWndColHd;
NMH.hdr.code = HDN_ITEMCLICKW;
NMH.iItem = 3;
NMH.iButton = 0;
IntPtr ptrNMH = Marshal.AllocHGlobal(Marshal.SizeOf(NMH));
Marshal.StructureToPtr(NMH, ptrNMH, false);
NativeMethods.SendMessage(new HandleRef(this, hWndLV), (uint)Msg.WM_NOTIFY, IntPtr.Zero, ptrNMH);
NativeMethods.SendMessage(new HandleRef(this, hWndLV), (uint)Msg.WM_NOTIFY, IntPtr.Zero, ptrNMH);
Marshal.FreeHGlobal(ptrNMH);
#endregion
你还需要在这些结构: [StructLayout(LayoutKind.Sequential)]
public struct NMHDR
public IntPtr hwndF
public int idF
public int
[StructLayout(LayoutKind.Sequential)]
public struct NMHEADER
public NMHDR
public int iI
public int iB
public IntPtr pI
和我添加了以下功能的进口NativeMethods:
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);
internal static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, StringBuilder lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
也许笔者将在这篇文章中实施这一天! {S4}的
注:(VB6.0的{S5}):{A31}] 评论会员:
时间:感谢,很好的提示{S3} 我可能会更新的文章时,在Visual Studio 2012年出来评论会员:
时间:您好
我运行此代码。NET 2.0在Windows 7 32位。 我的主要问题是,对话框打开总是一个太大的对话框的大小(宽度和高度)。我没有任何选项,以控制这种方式。我试图在WndProc()方法控制的最大尺寸的GET_MINMAXINFO的实施,但是这不是解决方案,因为它不工作。我如何可以设置启动的宽度和启动整个对话框的高度呢?
问候评论会员:
时间:嗨,
我有同样的问题。
看起来像对话框的大小的计算是不正确下赢得的。
会进一步调查,
亲切的问候,
汤姆Staelens 评论会员:
时间:您好,
找到一个快速的黑客{七}
更改下面的代码:
internal static uint OriginalDlgWidth
get { return FileDialogControlBase._originalDlgW }
set { FileDialogControlBase._originalDlgWidth = }
internalstatic uint OriginalDlgHeight
get { return FileDialogControlBase._originalDlgH }
set { FileDialogControlBase._originalDlgHeight = }
public static uint OriginalDlgWidth
get { return FileDialogControlBase._originalDlgW }
set { FileDialogControlBase._originalDlgWidth = }
public static uint OriginalDlgHeight
get { return FileDialogControlBase._originalDlgH }
set { FileDialogControlBase._originalDlgHeight = }
然后,您可以从您自定义的OpenFileDialog访问这些变量:
public MyOpenFileDialogControl(int width)
base.Width =
InitializeComponent();
OriginalDlgWidth = 400;
OriginalDlgHeight = 1000;
目前,这些变量的声明"静态"只是改变了修饰符公共和有雅,工程... ...我
映入眼帘,
汤姆评论会员:
时间:两个特点,我想看到​​一个扩展的打开文件对话框的是:
1)FolderSelect选项 -
FolderSelect将允许用户打开/选择文件夹而不是文件,将不受开发人员不必使用"可怕FolderBrowser"对话框
A)一个有用的子功能将是一个"IncludeSubFolders"复选框
2)文件名过滤器 -
有时它是有用的包含/排除的文件出现在名称过滤器为基础的对话 - 除了扩展名过滤器。例如,假设我只想要显示的文件,开始与"filenamePrefix_"或想我要排除"_filenameSuffix"结尾的档案。这将是巨大的,可以过滤文件,基于模式匹配的模式后 - 最好的正则表达式评论会员:
时间: Win32Types.NMHDR结构。该项目的idFrom"应"的IntPtr"类型的,但不是"UINT"
由于此错误,没有任何事件时引发的用户选择对话框上的一个文件或文件夹的变化评论会员:
时间:感谢,{S3} 我会更新时,我将有机会评论会员:
时间:还FileDialogPlaces.SetPlaces引发IndexOutOfRangeException行66:m_places[i] = places[i];如果有4个或更少项目"的地方"的功能参数。 'for'循环迭代5项m_places,但"地方"只有4项评论会员:
时间: SetupFakeRegistryTree功能也有一个未处理的异常。注册处可能无法下Vista/Win7由于UAC的限制评论会员:
时间:这应该是凛"作为管理员",确保
| gisKing评论会员:
时间:。成功使用的库:|单向非常有用!感谢评论会员:
时间:??很不BR />评论会员:
时间:无论出于何种原因打开文件,文件名称的变化是不发射,从而预览窗口中什么也不做,并选择或确定按钮,当然什么也不做,以及
使用一个双赢7x64系统 NET 2008
它基本上归结重写基类没有做任何事情... ...这永远不会触发...
public virtual void OnFileNameChanged(IWin32Window sender, string fileName)
u.dp("on file name changed in control base");
if (EventFileNameChanged != null)
EventFileNameChanged(sender, fileName);
}修改日(星期日)下午05:42 评论会员:
时间:,我也越来越这种行为在Windows 7下,64位
它看起来像迷上WM_NOTIFY消息,但ofNotify结构是全零。
这将是巨大的,如果有人比我多一点理解,可能需要看这个问题。
&桌面&网页开发&移动开发&数据库&多媒体&编程语言&平台,框架和库&编程通用&图形/设计&开发周期&一般阅读&第三方产品&作者资源&其他
快速解答标签
价值作最多}

我要回帖

更多关于 mfc 弹出对话框 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信