使用PreSubclassWindow

其中一个是PreSubclassWindow lesser-understood处理程序 处理程序。事实证明这是一个很好的处理程序用于特定的效果 对话框。 有几个问题接口MFC对话框。我经常 表示,MFC是一个蛮力战胜了常识。我的意思是说 这是c++对象模型是完全不同的对象 Windows,这两个模型几乎是不相容的。尽管如此,一些非常 聪明的编程使几乎无缝的集成。但有一个 几乎“无缝”和“实质性的区别 无缝”又是; 在窗口正常处理,你会有一个OnCreate处理程序 调用创建的窗口。在正常的MFC窗口处理 有PreCreateWindow CREATESTRUCT虚方法可以让你改变 价值观、风格等参数。 这些都不是可以在对话框。原因是你的成员 子类只能调用映射到MFC窗口时,它的 处理程序改变了AfxWnd处理程序。但对话框控制 早在创建子类化,发生在第一个DoDataExchange 处理程序,它发生在OnInitDialog处理。这是远 太迟了。 我发现PreSubclassWindow是一个理想的地方 某些修改,如改变风格。这只适用于那些 样式窗口创建后产生影响(许多风格 不能改变一旦创建窗口。你可以改变风格,但是 窗口本身就是无视这些变化)。这是非常有用的,当风格 你想改变不属于提供的样式对话框编辑器。 我用它的另一个地方是当我想设置一个字体。例如,在这个 特定类,我需要设置的字体的高度的80% 窗口。代码如下所示。这将创建一个字体是一个成员变量 我的类使用的字体在OnPaint将被设置 处理程序。我想使用相同的字体为父窗口,但是80%的大小 当前窗口。 隐藏,复制Code

void CMyControl::PreSubclassWindow()
   {
    CRect r;                          
    GetClientRect(&r); 
                                      
    LOGFONT lf;                       
    CFont * f = GetParent()->GetFont();
    f->GetLogFont(&lf);                
    lf.lfHeight = -(int)((double)r.Height() * 0.8);
    font.CreateFontIndirect(&lf);     

    CMySuperclass::PreSubclassWindow();
   } 

有些事情你不能做PreSubclassWindow处理程序; 例如,我发现做一个显示窗口会导致NT 4.0 SP6 立即蓝屏。我没有试过在Win2K实验。 然而,PreSubclassWindow受到忽视的方法,有小 文档显示其效用。在写这篇文章,我发现精确 一个有用的参考MSDN,保罗DiLascia所写的一篇文章 微软系统杂志》在1999年12月,他实际上说的差不多 同样的事情。但在写这篇文章,我不妨把它给我 网站。 一些人指出,“在PreSubclassWindow你不做任何事情 不能在OnInitDialog完成。他们完全是正确的。的 区别是封装之一。如果你强迫用户(你的类 往往是自己)在OnInitDialog做初始化,你必须吗 记得来初始化,即使是独立的对话框。如果你 初始化需要做什么改变,每个人使用的类 (在每一个地方,他们使用类),必须添加或修改初始化 在OnInitDialog。把它放在PreSubclassWindow, 初始化”遵循“您所作的改变,和客户的 类不需要担心这个。这是很好的 模块化。 你可能也想看看我的文章自动记录式 窗户,另一个有用的技术,知道如果你是做定制 控制,想把它们放在一个对话框。 本文转载于:http://www.diyabc.com/frontweb/news4954.html

原文地址:https://www.cnblogs.com/Dincat/p/13462061.html