分类:
2008-10-13 17:07:34
C++ Q&A 专栏...
原著:
翻译:
原文出处:
原代码下载: (185KB)
我试图使用C++/MFC自定义文件打开对话框。是否有一种办法能在打开/保存对话框启动时改变列表视图的类型?启动时默认的是列表视图,
这个视图没什么用。我希望程序启动对话框时采用详细资料视图,或最好是用户最后一次使用的视图。您能推荐一种方法吗?
BOOL CMyOpenDlg::OnInitDialog() { CFileDialog::OnInitDialog(); PostMessage(MYWM_POSTINIT,0,0); return TRUE; }
CWnd* pshellwnd = dlg->GetDlgItem(lst2); pshellwnd->SendMessage(WM_COMMAND, ODM_VIEW_DETAIL); // 0x702c经历了所有的惊愕以及重重艰难险阻,最终的解决方案很简单。你可以用 Spy++ 来检验每个视图模式的命令代码。我是个大好人,为你做了这些。结果参见 。我在 Windows XP 中对它们进行了调用;Windows 的其它版本有一或两个别的代码。Figure 2 是 CMyOpenDlg 的源码,它以详细资料视图模式调用文件打开对话框。 至于如何保存不同用户会话的列表模式,我将它作为一个练习由你自己解决;实现细节很简单。如通常一样,你可以从本文顶部的链接处下载完整的测试程序源代码。
using System.Runtime.InteropServices; public class MyClass { [DllImport("user32.dll")] public static extern void SetForegroundWindow(IntPtr hwnd); }在你的代码中使用此托管申明,并且假设你已经拥有了你希望激活的窗口的句柄,你要做的是调用 SetForegroundWindow:
IntPtr hwnd = // get HWND SetForegroundWindow(hwnd);你怎样获得窗口句柄呢?根据你的程序的工作方式,有许多方法可以做到,但最通用的一种方法是调用 FindWindow,你可以用这个 API 函数由窗口的标题或类名获得窗口句柄,在此你又要在 C# 中用到托管:
public class MyClass { [DllImport("user32.dll")] public static extern IntPtr FindWindow(String classname, String title); }classname 是 Window 注册的窗口类的名字,title 是窗口标题。这些参数只能有一个为 NULL,不能全为 NULL。
class MyClass { };如果有人试图像这样申明一个类
class Derived : public MyClass { };我希望此时编译器抛出一个错误,可以实现吗?
sealed class MyClass { ... }意思是说没有人能从 MyClass 派生出别的类。在.NET Framework中许多(一些人说太多)类自身是密封的。
class MyClass { private: MyClass() { ... } MyClass(int arg) { ... } };这样便没有办法从 MyClass 派生新类。因为没法实例化它。等一等——如果没法实例化你的类。那别人如何使用它呢?问得好。答案是你必须添加静态函数 来创建类的实例。
class MyClass { public: static MyClass* CreateInstance() { return new MyClass(); } private: MyClass() { } };现在任何人可以调用 MyClass::CreateInstance 来创建你的类的实例,但没有人能从它派生。这种方法在大多情况下工作得很好,可它有一个 缺点:你很难在堆栈中创建 MyClass 实例。要解决这个问题,你需要一个稍微复杂的解决方案:
class MakeSealed { private: MakeSealed () { } friend class MyClass; }; class MyClass : virtual MakeSealed { };现在除了 MakeSealed 的友元类 MyClass 以外,无人能创建 MakeSealed 实例。你能在堆栈中创建 MyClass 的实例 ,但你不能从MyClass 派生。你可以使用 MakeSealed 来使其它成为密封类,但同时必须添加它们为友元。MyClass 以 MakeSealed 为虚拟基类 ,以便于你在使用多重继承时不会出现问题。相当聪明,不是们吗?编程快乐!