问题标签 [nonclient]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
7829 浏览

c# - 航空玻璃窗上的非客户绘画

现在我正在自定义我的应用程序的标题栏。我的目标是在标题栏上添加一个额外的按钮。我之前的问题 有人建议我自定义非客户区的方式。除了一件小事——发光!我可以在非客户区绘制发光,但不能让它扩散到窗外。我也找不到关于这个主题的任何资源。

我查看了这个示例并制作了自己的测试应用程序来调查非客户绘图设施。我的应用程序窗口的屏幕截图:

我的应用程序窗口

因此,您可以看到当 my 被边框剪裁时,系统按钮会从窗口中发光。

例如,Skype 的窗口在标题栏中有四个自定义按钮,它们可以“发光”出窗口框架:

Skype的窗口

任何人都可以建议我找出将按钮从窗外发光的方法吗?
提前致谢!

[编辑]
谢谢大家的回答!

0 投票
1 回答
637 浏览

c# - 为非客户端鼠标离开调用 _TrackMouseEvent 时出现 Win32 ERROR_NOACCESS (C#)

我目前正在通过拦截各种 WndProc 消息并在非客户区进行绘制来编写某种自定义表单边框。要为关闭按钮等创建某种悬停效果,我需要跟踪鼠标指针。根据 MSDN,这工作得很好,但要接收WM_NCMOUSELEAVE消息,我必须先调用_TrackMouseEvent 。

令人惊讶的是,它不起作用。_TrackMouseEvent 失败,Marshal.GetLastWin32Error() 返回998对内存位置的访问无效)。

我一无所知,所以这是我的代码:

欢迎任何帮助。:)

0 投票
1 回答
634 浏览

winforms - 如何在winForms中透明地绘制非客户区?.Net 4

我正在开发一个自定义表单,我希望非客户区是透明的。我通过消息号“0x85”处理非客户区绘画,这是我迄今为止尝试过的:

  • 使用颜色“Color.Transparent”进行绘制 -> 非客户区被涂成黑色。如果我使用红色或黑色或绿色的图像,它可以完美地工作,但透明 = 黑色
  • 创建窗体大小的透明图像并使用方法“myGraphics.DrawImage("img.png")”。背景仍然是黑色的。如果我使用红色或黑色或绿色的图像,它也可以完美地工作......
  • 不画任何东西(希望我能保持透明)......没用
0 投票
1 回答
1976 浏览

winforms - 如何在非客户区插入新按钮?

我正在开发一个自定义表单,我需要在最小化按钮旁边放一个按钮。有人知道该怎么做吗?

0 投票
1 回答
1473 浏览

winapi - WM_NCHITTEST 不改变鼠标光标

我有一个分层窗口 (WS_EX_LAYERED),它实现了自定义 NCHITTEST 和 NCCALCSIZE,以使我的窗口的客户端矩形与窗口矩形相同。我的窗户尺寸和油漆正确;当光标靠近窗口的底部边缘时,我可以从 WM_NCHITTEST 返回 HTBOTTOM 以导致从底部开始垂直调整窗口大小类型的操作。但是,我没有得到垂直调整大小光标。有没有办法解决这个问题而不必实现 WM_SETCURSOR 并测试指针的位置与窗口的边缘?

这是我的代码片段:

0 投票
1 回答
124 浏览

.net - 如何获取 NonClient 上边框大小?

我需要将辅助表单与其他表单的右边框对齐。

当我们在启用 AERO 的情况下编译和运行COMPILED应用程序(而不是从 IDE 运行它)时,会发生以下情况:

在此处输入图像描述

因此,感谢GJKH的伟大回答:如何正确确定 Aero 的非客户区大小?

...现在我可以将辅助窗体对齐到主窗体的右侧,但是辅助窗体仍然未对齐顶部的一些像素:

在此处输入图像描述

这是我正在使用的代码:

0 投票
0 回答
1033 浏览

delphi - 如何在不丢失边框“外观”的情况下向 TCustomControl 添加填充?

我编写了一个自定义的 TMemo,但注意到文本与边框相撞,根本没有填充。虽然我可以尝试通过抵消它等来解决 ClientRect 内部的问题,但在现阶段这不是一个非常优雅的解决方案。TMemo 至少有 1px 的填充,不属于客户区域,所以我想我会尝试做同样的事情(我假设这就是他们所做的)。

所以我已经使用 WM_NCCALCSIZE 缩小了客户区,但是当然边界没有完全绘制,所以我也必须实现 WM_NCPAINT。这样可行。我现在绘制一个 clBlack 边框,然后是 clWindow 的填充矩形。到目前为止,一切都很好。

在 XP(经典风格)上,但是 1px 边框看起来有点奇怪,所以我想也许有一种方法可以绘制旧的“客户端边缘”边框,并且还符合 XP/Vista/Win7 主题客户端边缘外观(我没有不知道如何使用渐变手动绘制)。

这就是我有点卡住的地方。有谁知道如何以我可以进行填充的方式绘制边框,以及如何保持适当的“客户端边缘”外观(1px 或 2px)?

非常感激。;)

(当然也欢迎其他方法)

=====

编辑: 经过一番修修补补,我想出了以下解决方案。我以为我会把它贴在这里。

编辑: 啊!当有滚动条在播放时,上面的这些东西就会崩溃。我还没有解决方案。有什么建议么?

0 投票
0 回答
637 浏览

delphi - 加厚非客户端窗口边框的滚动条绘制问题

我正在尝试使用滚动条在自定义控件的客户区域周围绘制彩色边框。为此,我设置BorderWidth为一个正整数并响应WM_NCPAINT消息。这听起来像是混合了 VCL 和 Win32,但该BorderWidth属性只会导致对WM_NCCALCSIZE消息的适当处理。

以下代码是SSCCE

结果如下所示:

截屏

除了右下角的正方形外,这看起来很完美。这个区域很容易通过做一些事情来修复;我故意不画这个区域,因为它与我试图描述的实际问题无关。所以请忽略那个正方形。

现在,我可以通过拖动它的右边框来调整它的大小。我先把它变小,这样样例控制窗口的垂直滚动条就被隐藏了。然后我慢慢放大表格,使示例控件再次完全可见。然后它看起来像这样:

截屏

在这里你可以看到问题:BorderSize垂直滚动条的最左边的像素似乎不是由操作系统绘制的。

一些观察:

  1. 使用完整inherited而不是单纯DefaltHandler(Message)会使问题变得更糟。在这种情况下,黄色区域将在窗体暂时移出屏幕后以及在控件遮挡窗体收缩增长操作后完全遮挡滚动条。

截屏

  1. 实现对WM_NCHITTEST消息的匹配响应会使控件以更好的方式运行,但不能解决滚动条绘制问题。

  2. 我知道如何在带有滚动条的控件的非客户区域内绘制自定义边框?; 这个问题的答案都受到上述问题的影响。

我正在使用 Delphi 2009 和 Windows 7 Home Premium,64 位,启用 Aero。