当前位置:C++技术网 > 精选软件 > Windows零基础入门:2.19 窗口类结构体之窗口类风格CS_DBLCLKS

Windows零基础入门:2.19 窗口类结构体之窗口类风格CS_DBLCLKS

更新时间:2015-09-13 19:18:39浏览次数:1+次

    上节课《Windows零基础入门:2.18 窗口类结构体之窗口类风格-水平重绘和垂直重绘》我们详细讲解了窗口绘制的一些背景知识,也知道了窗口重绘的窗口类风格是怎么回事。本节课继续来分析其他几个窗口类风格。
    对于完整代码,请看《Windows零基础入门:2.14 (1)窗口类使用完整代码演示和详细注释》。上节课演示了水平重绘和垂直重绘的效果。下面我来看看第三个风格,就是双击风格CS_DBLCLKS。

     鼠标双击

2.双击风格CS_DBLCLKS
    对于使用过Windows系统的人来说,对于双击单击这些名词来讲,都很熟悉了。双击就是鼠标左键快速的连续单击。有过经验的人就知道,单击窗口的标题栏,可以让窗口最大化,再双击可以恢复正常大小。如果这个都不清楚,那赶紧试试吧。因为Windows中,绝大多数窗口都是这种风格,可以支持这样操作。但是一些窗口固定了大小,就不接收这种了。
    当然,以上只是一个使用的常识而已。下面就说说这个双击风格CS_DBLCLKS到底是怎么回事吧。窗口分为几个部分,标题栏、菜单栏、工具栏、客户区、状态栏和边框。这些是计算机使用常识了,接触过Windows的应该都知道了。这个不必多讲了吧。而客户区,就是我们可以看到的中间的一大块区域。客户区是用来显示内容的,也可以用来交互的。程序的核心逻辑就在客户区体现出来。
    默认的情况下,注册的窗口类都是对客户区的双击不做响应,不仅如此,客户区双击根本就不接收这个双击的消息,这个消息就是WM_LBUTTONDBLCLK。这个会在后面讲到。不接收这个消息是什么意思呢?我们鼠标在窗口上的动作,都是在窗口类中向系统注册了的。这就是注册窗口类完成的。窗口类的类风格里指定的参数也就告诉系统,这一类窗口想做什么,不想做什么。
    你指定了一种窗口类风格,就是告诉系统,当这种情况发生时,可以通知我。比如窗口的水平重绘风格就会告诉系统,当水平方向上客户区调整大小或者位置改变时,请将窗口重绘消息WM_PAINT发给我。如果在窗口类风格中没有指定这个风格,也就是告诉系统,他们改变时不关我事,不要发消息告诉我。
    那么双击风格,同样如此。默认的很多窗口都没有添加这个风格,所以,你会发现,在窗口的客户区中双击,没有效果。当你的窗口类风格中没有双击风格时,在窗口过程中,你是接受不到双击消息WM_LBUTTONDBLCLK的。因为注册的时候,系统知道你拒绝了这个消息,所以,即使你双击把屏幕击破了,系统也不会告诉你,光标在窗口的客户区双击了。
    但是当你在窗口类风格中添加双击风格CS_DBLCLKS之后,系统才会通知你。但是你想看到双击后有效果,你还要来处理消息。比如说,在窗口过程中的消息处理中加入以下代码:

switch(message)
{
    ...
    case WM_LBUTTONDBLCLK:// - 客户区双击消息
        MessageBox(NULL, _T("双击了窗口"), _T(""), 0);
        return 0;
    ...
}
return DefWindowProc(hwnd, message, wParam, lParam);

     这样,当你再双击窗口的客户区时,发现就会弹出一个消息框了。这个就是你对这个消息处理的结果。而双击风格CS_DBLCLKS的作用就在于,它告诉了系统,当你双击了客户区就会收到系统给窗口发送的这个客户区双击消息。否则就收不到消息。
    有的软件,为了方便用户操作,当双击窗口客户区的时候,就可以最大化窗口,比如视频播放器,再双击的话,就恢复正常大小。这个应该很熟悉的一个场景了。我们就可以在此实现。

视频播放器
    如果你不知道还有双击风格这回事,那么这个场景,你就很难做到。因为你压根就接不到双击消息哦。就没有后文了。
    那么我们来实现一下这个场景,这个不需要你有多少的技术,这就是入门的水平,但是很多人学完Windows都不会做。我们在WM_LBUTTONDBLCLK消息下使用如下代码实现:

case WM_LBUTTONDBLCLK:
    if(IsZoomed(hwnd))//-判断窗口是不是最大化了
        ShowWindow(hwnd, SW_SHOWNORMAL);// - 显示正常大小的窗口
    else
        ShowWindow(hwnd, SW_SHOWMAXIMIZED);// - 最大化窗口
    return 0;
     IsZoomed这个函数是API函数,用于判断窗口是不是最大化状态,返回0则表示不是最大化,如果返回非零就是最大化状态。非零即真,零即假。返回真表示是最大化。这样我们在双击客户区的时候,就判断一下当前窗口的状态,如果是最大化,就显示正常大小。否则就最大化窗口。这个代码每次都会判断,因此就可以自动切换,就实现了视频播放器软件的这个效果。是不是很简单。是的,就这么简单。
    而IsZoomed这个函数,你一开始肯定不知道,我也不知道,我就百度。你查询“判断窗口是不是最大化”关键词,然后就会找到有些文章说了这个函数,你知道有这个函数就可以了,然后就用。不清楚,可以输入到MSDN里查询,看看参数如何使用。
    这个函数只有一个参数,就是窗口句柄,而窗口句柄又是由窗口过程函数传进来的,所以直接用就好。至于窗口的显示这两个函数,就是设置两个标志,就可以了。第一个参数就是窗口句柄,第二个参数就是标志,SW_SHOWNORMAL表示显示正常大小,SW_SHOWMAXIMIZED表示最大化显示窗口。显示窗口的,我们再后面还会细讲,这里知道是这么回事就好。
    为了完整性,我们可能会判断窗口是不是最小化,这个函数就是IsIconic,如果返回真就已经最小化了,否则就是没有最小化。如果你想判断是否是正常的大小,那么就判断最大化和最小化,如果都不是,就是正常大小窗口。
    这是结合开发经验,不仅让你零基础就可以理解的很深刻,在开发经验上也会有不少的积累哦。很多事情,想起来很复杂,其实很简单就实现了,就看你的基础够不够。


    如果觉得讲的不错,记得分享哦。