none
如何生成无标题的窗口?? RRS feed

  • 问题

  • 我新创建了一个WIN32应用程序,想生成一个没有标题栏的窗口。于是我将窗口风格设置为0。然后我将窗口风格提取出来,发现style为0x04c0000.二WS_CAPTION为0x00c00000,也就是说虽然在创建窗口时我没有指定WS_CAPTION风格,但是事实上我生成的窗口却有这个风格。事实上我生成的窗口的确有标题栏。请大侠帮忙解释一下,以及如何才能够生成一个没有标题栏的窗口?
    hWnd = CreateWindow(szWindowClass, szTitle, 0,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
       UINT style=GetWindowLong(hWnd,GWL_STYLE);
    2010年3月12日 12:08

答案

  • 哦,我试验了一下果然如此,看来Windows在设风格为0时使用了默认风格0x04c00000。应该是overlapper模式是必须有标题栏的,因为一般情况下我用来作无标题栏的窗口风格都是WS_POPUP.

    这是一个简单的无标题栏窗口的示例,你可以参考下:
    http://blog.csdn.net/Vonger/archive/2010/02/18/5311273.aspx

    还有一种办法,看起来比较怪,在你的CreateWindow完成后加入如下代码强制取消WS_CAPTION风格,但是这样可能会导致窗口工作不正常,所以还是用WS_POPUP风格最好
    ::SetWindowLong(hWnd, GWL_STYLE, ::GetWindowLong(hWnd, GWL_STYLE) & (~WS_CAPTION));


    0xBAADF00D
    2010年3月14日 5:11
    版主

全部回复

  • 风格什么都不填居然还能显示窗口,你这是Windows操作系统么?:)

    把窗口风格填成WS_POPUP|WS_VISIBLE这样就可以了

    只要没有WS_CAPTION风格是肯定没有标题的。但是有些风格他是一个组合,比如WS_OVERLAPPEDWINDOW,他的定义如下
    #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED     | \
                                 WS_CAPTION        | \
                                 WS_SYSMENU        | \
                                 WS_THICKFRAME     | \
                                 WS_MINIMIZEBOX    | \
                                 WS_MAXIMIZEBOX)
    里面藏着WS_CAPTION.

    如果你的风格里面没有WS_VISIBLE,别说显示标题,窗口都不会显示出来。检查代码其他地方的问题吧!看看是不是在WM_CREATE里面进行了操作?


    0xBAADF00D
    2010年3月12日 13:43
    版主
  • 风格什么都不填居然还能显示窗口,你这是Windows操作系统么?:)

    把窗口风格填成WS_POPUP|WS_VISIBLE这样就可以了

    只要没有WS_CAPTION风格是肯定没有标题的。但是有些风格他是一个组合,比如WS_OVERLAPPEDWINDOW,他的定义如下
    #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED     | \
                                 WS_CAPTION        | \
                                 WS_SYSMENU        | \
                                 WS_THICKFRAME     | \
                                 WS_MINIMIZEBOX    | \
                                 WS_MAXIMIZEBOX)
    里面藏着WS_CAPTION.

    如果你的风格里面没有WS_VISIBLE,别说显示标题,窗口都不会显示出来。检查代码其他地方的问题吧!看看是不是在WM_CREATE里面进行了操作?


    0xBAADF00D

    我用的是VS2005,创建的项目类型是win32 应用程序。如果一行代码都不修改,则生成的应用程序含有系统菜单、最大框、最小框和标题栏。现在我将生成窗口的
    那行代码的的风格修改一下:
    原代码:hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    修改后的代码:hWnd = CreateWindow(szWindowClass, szTitle, 0,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    即我将窗口风格修改为0,然后重新生成应用程序,并运行,结果如下:
    窗口能正常显示,没有系统菜单、最大框和最小框。但是该程序有边框,并且也有标题栏。
    至于风格设置为0,并不是说没有指定窗口显示的风格,查看winuser.h,即可看到如下定义:#define WS_OVERLAPPED       0x00000000L。

    如果我将代码修改成如下形式:
    hWnd = CreateWindow(szWindowClass, szTitle, 0,
         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
      UINT style=GetWindowLong(hWnd,GWL_STYLE);
    也就是先将窗口的风格设置为0,然后再将窗口的风格提取出来,发现风格居然不是我所设置的0,而是0x04c00000。
    查看winuser.h,发现如下定义:
    #define WS_CLIPSIBLINGS     0x04000000L
    #define WS_CAPTION          0x00C00000L
    也就是说虽然我设置的风格是0,但是系统创建的窗口的风格却是WS_CLIPSIBLINGS|WS_CAPTION .
    为什么会这样呢?望各位大侠指点。。。。。
    2010年3月14日 2:07
  • 哦,我试验了一下果然如此,看来Windows在设风格为0时使用了默认风格0x04c00000。应该是overlapper模式是必须有标题栏的,因为一般情况下我用来作无标题栏的窗口风格都是WS_POPUP.

    这是一个简单的无标题栏窗口的示例,你可以参考下:
    http://blog.csdn.net/Vonger/archive/2010/02/18/5311273.aspx

    还有一种办法,看起来比较怪,在你的CreateWindow完成后加入如下代码强制取消WS_CAPTION风格,但是这样可能会导致窗口工作不正常,所以还是用WS_POPUP风格最好
    ::SetWindowLong(hWnd, GWL_STYLE, ::GetWindowLong(hWnd, GWL_STYLE) & (~WS_CAPTION));


    0xBAADF00D
    2010年3月14日 5:11
    版主
  • hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    就是无标题栏的,也不能拖动。

    LHL
    2010年3月14日 9:57
  • CreateWindow是CreateWindowEx的简化版,后者多了个ExStyle,可能前者会默认设置这个额外风格吧?个人猜测,没试过。你可以去看看WS_EX_*的定义。
    LHL
    2010年3月17日 2:48