- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 DWM 为我的表单制作自定义窗口框架。该平台是 C# WinForms,Pinvoking DWM。
在 MSDN article on making custom window frame with DWM 之后, 主要步骤如下:
我用下一种方式处理 WM_NCCALCSIZE 消息:
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCCALCSIZE:
if (isDwmWindowFramePaintEnabled() && m.WParam != IntPtr.Zero)
{
m.Result = IntPtr.Zero;
}
else
{
base.WndProc(ref m);
}
return;
}
}
根据 MSDN documentation on WM_NCCALCSIZE ,
When wParam is TRUE, simply returning 0 without processing theNCCALCSIZE_PARAMS rectangles will cause the client area to resize tothe size of the window, including the window frame. This will removethe window frame and caption items from your window, leaving only theclient area displayed.
除一个问题外,一切都很好,对我有用。当我最大化/恢复窗口时,它总是在恢复时增长一点点。我认为,问题是这样的:
所以,每次我最大化/恢复它时,这个窗口都会变大一点。我需要删除非客户区以使用 DWM 绘制自定义表单框架。我不能简单地将窗口边框样式设置为无,因为 DWM 将不会绘制窗口标题和边框。
请帮助解决问题并愉快地拥有自定义窗框。
最佳答案
这实际上是 Windows 窗体中的一个错误,并且有一个解决方法。在函数 Form.SizeFromClientSize(int, int)
中,AdjustWindowRectEx
函数用于转换大小,它始终使用默认测量值,不能被覆盖。这个函数从两个地方调用:
RestoreWindowBoundsIfNecessary
在 WM_WINDOWPOSCHANGED 窗口消息处理程序中SetClientSizeCore
解决方法如下:
重写表单中的 CreateParams:
private bool createParamsHack;
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
// Remove styles that affect the border size
if (createParamsHack)
cp.Style &= ~(int)(WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_THICKFRAME);
return cp;
}
}
覆盖 WndProc 并插入以下代码来处理 WM_WINDOWPOSCHANGED:
if (m.Msg == WM_WINDOWPOSCHANGED)
{
createParamsHack = true;
base.WndProc(ref m);
createParamsHack = false;
}
覆盖 SetClientSizeCore:
protected override void SetClientSizeCore(int x, int y)
{
createParamsHack = true;
base.SetClientSizeCore(x, y);
createParamsHack = false;
}
覆盖 SizeFromClientSize(Size)
以返回正确的测量结果也是个好主意,但这并不是绝对必要的。
关于c# - 带有 DWM : how to handle WM_NCCALCSIZE correctly 的自定义窗框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20085317/
来历及作用 dwm.exe是微软Microsoft®为其Windows 7/Vista操作系统定义的系统进程。dwm是Desktop Window Manage的缩写,在系统中描述为:桌面
我想弄清楚如何消除窗口之间的这些间隙。请看下面的屏幕。在第一个屏幕底部有一个间隙(大约 15px)。在第二个 - 两个窗口之间的中心间隙。 我已经应用了 uselessgap 补丁 ( https:/
我刚刚在 Arch 上安装了 dwm,我非常喜欢它。但是,我发现状态栏除了在切换标签时没有任何用处,所以我认为一个有用的功能是仅在按下 MODKEY 时显示它。 我知道 MODKEY+b 可以切换栏,
我正在使用 dwm (6.2) 窗口管理器,我发现了一个我很想解决的错误。 窗口管理器使用放置窗口的“主区域”和“堆栈区域”: 可以使用 ALT 将位于“堆栈区域” 顶部的窗口移动到“主区域” 底部+
在 Vista 和更高版本中,如果应用程序变得无响应,桌面窗口管理器能够在必要时处理重新绘制它(在它上面移动一个窗口,拖动它等等),因为它为它保留了一个像素缓冲区。 Windows 还尝试检测某个应用
我使用 DWM 创建了一个自定义窗口框架。框架成功扩展,但每当我尝试在框架上绘制时,扩展框架会覆盖我尝试绘制的任何内容。我见过其他人试图在负边界内输入左上角,但即使我尝试这样做,标题栏仍然与主窗口的绘
Q1:DWM 在多显示器 设置(扩展)中的预期行为是什么?的监视器被全屏 (D3D11) 应用程序覆盖(不是最大化的无边框窗口)? 1.所有剩余的屏幕应该是空白的 2. 应主动刷新所有剩余屏幕 3.
我有一个窗口,它反射(reflect)了另一个带有 DWM 缩略图的窗口。现在我想要当用户调整预览窗口大小时,预览区域会调整到。我怎样才能做到这一点?如何发送有关新预览尺寸的更新(将尺寸 300x30
我在 Arch Linux 中使用 dwm 平铺窗口管理器。我想自定义顶部栏显示。我已经添加了日期、内存、正在播放和正常运行时间等内容,但 CPU 显示不适合我。当我尝试运行代码以在终端中显示 CPU
我发现了一个演示应用程序,它能够使用 DwmRegisterThumbnail 获取最小化/隐藏窗口的屏幕截图。它工作完美,但结果图像是在表单本身而不是 TBitmap 中绘制的。 这是代码: pro
背景信息:我编写了这个 MFC 应用程序并使用了很长时间,当用户按下 Print Screen/Alt+Print Screen 键时,它几乎会自动将屏幕截图保存到硬盘。我一直推迟使用任何与 Aero
我正在尝试在 dwm 中获取系统托盘。 DWM是suckless的X动态窗口管理器:https://dwm.suckless.org/ 。要配置 dwm,您需要自己手动添加补丁。我制作了一个包含所有文
我引用 Custom Window Frame Using DWM 使用 DWM 创建了一个带有自定义窗口框架的窗口.我尝试使用 StretchBlt 将位图添加到标题栏。然而,它没有正确显示。如果绘
我开始相信你对 Windows API 无能为力。 我有两个 window 。其中有一个 DWM 缩略图。我想要做的是,我希望能够将带有缩略图的窗口屏幕捕获到另一个窗口中。 当我这样做时,使用 bit
我使用提供的文件安装了 dwm 6.0 here进而.. # make install # dwm 但是运行“dwm”会出现错误:“dwm:无法打开显示” 尝试了“exec dwm”,但它启动了一个新
我曾经在我的 Win7 系统上注意到一个问题,认为这是一个 DWM 错误,因为它在重新启动后得到修复。但现在我意识到它正在其他人的系统上发生(作为默认行为),这也是 Surface Pro 上的正常行
大家早上好。 我目前正在尝试编写一个小型应用程序,该应用程序是围绕通过 Windows DWM API 提供的功能(例如 DWM 缩略图)构建的。其中一个功能是能够从应用程序内动态选择缩略图区域,并将
我正在使用 WPF Shell 集成库 ( http://archive.msdn.microsoft.com/WPFShell ),但是当我将自定义 chrome 与 Aero 一起使用时,标题栏被
捕获窗口图像的正常方法是调用: HDC SharedWndDC = GetWindowDC(SharedWnd); BitBlt(BitmapDC, 0, 0, width, height, Shar
我试图在 DWM Glass 下处理 TextBox 文本的颜色。看了很多资料,还是没有完美的解决办法。 我在这里找到的几乎完美的结果代码:http://social.msdn.microsoft.c
我是一名优秀的程序员,十分优秀!