代码之家  ›  专栏  ›  技术社区  ›  Ravi shankar

如何在visual c++win32 API中改变应用程序主窗口的边框样式

  •  0
  • Ravi shankar  · 技术社区  · 14 年前

    我在Visual c++(Win32 API)中有一个应用程序。在我的应用程序中,主窗口边框以旧窗口样式显示。我已经尝试将wndWc.style值更改为WS_OVERLAPPED、WS_pop up和WinUser.h中提供的其他值,但是主窗口的外观没有任何更改,因为我的所有弹出窗口都是以windows 7样式显示的,如何纠正这种情况。在这方面的任何帮助都将不胜感激。我在主窗口和弹出窗口都附上了图片。 alt text

    alt text

    代码:

    // our window class
      WNDCLASS wndWc;
      // ---------------------------------------------------------
      // fill window class members
      // ---------------------------------------------------------
      wndWc.style = CS_GLOBALCLASS;
      wndWc.lpfnWndProc = (WNDPROC) WndProc;
      wndWc.cbClsExtra = 0;
      wndWc.cbWndExtra = 0;
      wndWc.hInstance = GetModuleHandle(NULL);
      wndWc.hIcon = NULL;
      wndWc.hCursor = LoadCursor(0, IDC_ARROW);
      wndWc.hbrBackground = (HBRUSH)GetStockObject(0);
      wndWc.lpszMenuName = NULL;
      wndWc.lpszClassName = "XYZ";
    
    
      // register class
      if (!RegisterClass(&wndWc)) return false;
      // ---------------------------------------------------------
    
      // get actual screen resolution
      int iSw = (WORD)GetSystemMetrics(SM_CXSCREEN);       // height
      int iSh = (WORD)GetSystemMetrics(SM_CYSCREEN);       // height
    
      // make a rectangle on the center of the screen
      RECT rc = {(iSw - iWidth)/2, (iSh - iHeight)/2, width, height};
    
      // create the window. the spaces on the window title
      // are just to make sure this will be visible when the region
      // is active. just run the app and you'll understand. =)
      hWnd = CreateWindow("XYZ", "XYZ",
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,CW_USEDEFAULT, width,height,
                          NULL, NULL, GetModuleHandle(NULL), NULL);
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Leo Davidson    14 年前

    可能是您的EXE已被标记为在以前操作系统版本的兼容模式下运行。右键单击EXE,选择“属性”,然后确保“兼容性”选项卡上的所有内容都已关闭。(尤其是“禁用视觉主题”和“在兼容模式下运行此程序…”)

    失败了。。。

    需要做任何事情都是不寻常的,但是在应用程序的开头尝试一下:

    SetThemeAppProperties (STAP_ALLOW_NONCLIENT | STAP_ALLOW_控件)

    如果不起作用,请尝试显式设置窗口的主题:

    SetWindowTheme (hWnd,“窗口”,空);

    FWIW,我把你的代码粘贴到了一个新的Visual Studio 2008项目中,这个项目是用“Win32项目”向导创建的,它带有Windows 7边框。你通常得让开 事实上是为了边界。

    您正在生成的EXE可能有一些不寻常的地方,例如EXE头中的标志设置不正确。例如,如果它没有指定它是一个Windows GUI应用程序,或者可能有一些版本字段。。。

    EXE的清单可能也起到了一定的作用,但我只是尝试完全删除清单,我的程序仍然有一个主题窗口,所以可能不是这样。

        2
  •  1
  •   MSalters    14 年前

    如果你仔细看,你会发现不仅仅是边界。“关闭”按钮也使用旧的视觉样式。因此,仅更改窗样式是不够的。您必须指出您的应用程序支持Vista和Aero