WEB开发网
开发学院软件开发VC 禁用屏幕拷贝(Print Screen),调用派生的析构函数... 阅读

禁用屏幕拷贝(Print Screen),调用派生的析构函数及其它......

 2007-03-15 21:56:11 来源:WEB开发网   
核心提示: 你也许会想到用 CS_OWNDC 式样来注册窗口类以防止屏幕拷贝(它导致 Windows 为窗口类分配一个私有设备上下文),但那样做行不通,禁用屏幕拷贝(Print Screen),调用派生的析构函数及其它......(3),Windows 还是会把私有 DC 中的 像素位复制到屏幕 DC

你也许会想到用 CS_OWNDC 式样来注册窗口类以防止屏幕拷贝(它导致 Windows 为窗口类分配一个私有设备上下文),但那样做行不通。Windows 还是会把私有 DC 中的 像素位复制到屏幕 DC 中,这样一来,任何存取屏幕 DC 的程序都能看到你的像素。

在 2004 年 11 月的专栏中,你谈到了在托管和非托管代码中调用虚拟函数的问题,参见“调用虚拟函数,持续化视图状态,POD 类型概念”。在 C++ 里,如果我想让派生类的析构函数在释放内存时被调用,我得在基类中将其声明为虚拟函数。那么在 Visual Studio 2005 中,对于某个派生类来说,即使它在基类中未被声明为虚拟的,其析构也会被调用吗?

如果你说的是托管类,那么它是成立的。如果该类是本地类,则标准 C++ 规则适用;如果它是托管类,则析构函数隐含为虚拟。理解析构函数行为最简单的方法是写点代码看看编译器对它做了些什么。Figure 2 示范了一个简单的托管控制台程序,该程序声明了两个托管类,CBase 和 CDerived。构造函数和析构函数用 printf 显示被调用时的诊断信息。如果用 /clr 编译此程序,你会在控制台窗口看到如下的信息:

ctor: CBase
ctor: CDerived
dtor: CDerived
dtor: CBase

这个信息说明了即使派生类和基类都不把析构函数声明为虚拟,派生类的析构都会被调用。构造函数和析构函数按期望的顺序被调用,先调用基类构造函数,最后是析构函数。

为什么要将托管析构函数声明为虚拟的呢?回想一下每一个托管类要么必须显式地从另一个托管类派生,要么隐式地从根基类 Object 派生。还要记住的是 C++ 编译器将托管析构转换为 Finalize 方法,该方法在 Object 类中是虚拟的。为了明白这一点,你只要用 ILDASM 反汇编器察看一下所编译的代码既可。

上一页  1 2 3 4 5 6  下一页

Tags:禁用 屏幕 拷贝

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接