相关疑难解决方法(0)

处理WM_NCPAINT"破坏"Vista/Aero上的DWM玻璃渲染

我正在尝试创建一个窗口,WM_NCPAINT根据用户设置在具有Aero/Glass和自定义渲染帧(通过处理)之间切换.(Windows Vista).

DwmComposition已启用.我的应用程序提供了玻璃框架,但是一旦我切换设置以触发自定义WM_NCPAINT代码路径然后切换回使用DefWindowProcWM_NCPAINT处理,原生框架现在永远停留在"Vista Basic"风格 - 它不再是半透明的标题按钮与普通的Aero/Glass按钮看起来不同.

我已经尝试了各种方法,从发送SWP_FRAMECHANGED到更改窗口样式,然后将其更改回来,隐藏它等等,但是一切都无济于事.似乎只要我处理WM_NCPAINT一个玻璃窗而不是推迟到DefWindowProc我的窗户就会永远"破碎".

我在MSDN上找到了一个C#/ WPF示例(代码点msdn dot microsoft dot com slash chrome),似乎表明只需要停止处理WM_NCPAINT并且玻璃会返回,但这似乎不适用于我自己的应用程序.

有没有办法干净地重置这个状态?我的代码是用C++编写的,住在这里:

http://bengoodger.dreamhosters.com/software/chrome/dwm/

#include <windows.h>
#include <dwmapi.h>

static const wchar_t* kWindowClass = L"BrokenGlassWindow";
static const wchar_t* kWindowTitle =
    L"BrokenGlass - Right click client area to toggle frame type.";
static const int kGlassBorderSize = 50;
static const int kNonGlassBorderSize = 40;

static bool g_glass = true;
bool IsGlass() {
  BOOL composition_enabled = …
Run Code Online (Sandbox Code Playgroud)

winapi nonclient aero dwm

10
推荐指数
1
解决办法
7950
查看次数

标签 统计

aero ×1

dwm ×1

nonclient ×1

winapi ×1