问题标签 [nonclient-area]

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 投票
0 回答
95 浏览

vb.net - 非客户区表单修改问题

在我决定使用以下代码扩展非客户区之后,我的项目中的表单似乎有一些问题:

代码并不准确,只是希望它可以帮助更好地理解我试图完成的工作。我现在遇到的问题是黑色现在被用作航空的透明度。一些本应为黑色的文本颜色现在反映了当前航空颜色主题的颜色,如您在示例中所见,以及其他颜色问题,例如文本突出显示颜色。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

扩展非客户区是项目的重要组成部分,所以我不能偏离太多。无论如何,我可以尝试为其他类似的事情或其他解决方案指定一个颜色集来解决这个问题?我对插手与航空有关的形式有点模糊。谢谢!

0 投票
1 回答
719 浏览

delphi - 调整非客户区大小后如何反映更改?

我想制作一个具有可选边框大小的自定义控件。请参阅下面的代码。边框在非客户区绘制,其宽度可以是 0、1 或 2 个像素。我已经成功地完成了WM_NCPAINT. 问题是,在我更改控制边框大小的属性后,我不知道如何告诉系统重新计算客户区和非客户区的新尺寸。我注意到,当我(用鼠标)调整窗口大小时,会应用更改,但我不知道如何在更改边框大小后立即执行此操作。

例子

超级列表.pas

单元1.pas

0 投票
1 回答
4496 浏览

c# - 如何以无边框形式设置客户区(ClientRectangle)?

我想知道是否可以设置无边框表单的客户区。比如说我定义了一个这样的表单:

代码

结果

具有完整客户区的表格

我想要做的是指定客户区,以便表单有一个框架(就像标准的 windows 框架,但自定义绘制)。

结果

具有重新计算的客户区的表格

本质上,蓝色区域将成为非客户区域,而灰色区域将保留为客户区域。

我试图设置客户区,但这似乎只是调整了整个表单的大小,因此不会留下“非客户”区域

这可能吗?

0 投票
2 回答
1371 浏览

.net - 为什么我的 vb.net 标题栏是白色的

出于某种原因,当我设计我的 Windows 应用程序时,表单大纲/标题栏是蓝色的,但是当应用程序运行时,它会变成白色。为什么它会这样做,我如何让它显示所有 Windows 应用程序的正常颜色?我不喜欢白色,因为我觉得它使应用程序看起来很便宜。我在 Windows 10 Pro 上使用 Visual Studio 2015 社区。设计器中的表格图片以及它正在运行时的图片。

我真的很感激在这方面的一些帮助,谢谢。

窗体

0 投票
1 回答
726 浏览

delphi - Vcl Style Utils - 摆脱默认表单图标

我已经将此作为问题发布在 GitHub 上的 RRUZ 的 Vcl Style Utils库上。不过,我想我也可以在这里得到一些帮助。

我正在使用 VCL 样式创建 Windows 10 用户界面,特别是使用“Windows 10 Dark”样式。我还使用 VCL Style Utils 能够将按钮添加到标题栏中的非客户区。就像大多数新的 Windows 10 应用程序一样,我试图完全无视表单图标及其默认功能,转而使用后退按钮。

我试图在表单的最左上角放置一个按钮,使用TNCControls. Vcl.Styles.NC但是,当我在表单的图标上放置一个按钮时,无法在图标区域单击该按钮。虽然我可以重叠图标,但单击标题栏的特定区域总是会打开表单的系统菜单,而不是单击我放置在那里的按钮。

我不希望单击此处时弹出此菜单:

表单系统菜单

我目前如何创建此按钮:

到目前为止我已经尝试过:

  1. 将表单的图标替换为完全空的 .ico 文件。

  2. 将表单样式更改为 bsSizeToolWin,但标题栏变得太小,我失去了最小化/最大化按钮。

  3. 将表单样式更改为 bsDialog,但我得到与上面 #2 相同的效果,并且无法调整表单大小。

  4. 确保按钮样式为 nsPushButton,虽然它覆盖了表单图标,但单击该区域仍会单击该图标,而该图标又会显示默认的系统菜单。

  5. 遵循此线程中的所有内容,但结论是 Windows 强制您拥有此图标。

  6. biSystemMenu从表单的属性中删除BorderIcons,但这也删除了表单右上角的默认按钮,迫使我在那里放置自己的系统按钮。

如何完全消除表单图标及其默认功能以支持 Windows 10 样式的后退按钮?

0 投票
0 回答
234 浏览

c# - 如何使用常规按钮将内容(控件)放在窗口的标题栏区域 WPF C#

我想找到一种方法将诸如控件之类的内容放入 WPF 窗口的非客户区,而无需触摸默认窗口控件按钮和窗口的任何其他属性。

尝试的解决方案:

我曾尝试使用 WindowChrome 对象来实现想要的结果,但它总是在标题栏的左右两侧留出 5px 的边距,因此窗口按钮会向内偏移,这使它看起来很丑陋、笨拙和非官方。

我试图覆盖 WndProc(我的意思是挂钩)以抵消这种不需要的效果 - 成功 - 但它会导致许多不需要的工件,例如,在某些情况下,标题栏会完全取消渲染;这些按钮仍然可以工作,但在拖动窗口之前它们将完全不可见。

我已经尝试过仅使用本机 Windows API 进行窗口管理和渲染的方法,但它们不会产生想要的结果,边距太厚,调整边框大小不一致以及其他问题。

结论:

我知道必须有一种相对简单且不笨拙的方法来执行此操作,因为文件资源管理器本身具有我要实现的功能。如果您查看左上角,则会有一个工具条,后跟您所在目录的名称,或者简称为“文件资源管理器”。

我如何实现这样的目标?我提前感谢大家的帮助。

0 投票
2 回答
327 浏览

vb.net - 从另一个表格确定表格大小

VB2012:为了在我的主窗体中进行一些计算,我需要知道辅助窗体的窗体大小。根据操作系统和主题,表单大小可能因用户而异。我知道客户规模保持不变。但是,我认为我没有正确地做某事,因为我得到不同的数字,具体取决于我要求表格大小的位置。

作为示例,这里是我的主要表单,在加载事件中我尝试获取警报表单的大小

现在警报表单设置为 FormBorderStyle=FixedDialog、ControlBox=False、MaximizeBox=False 和 MinimizeBox=False,在警报表单中,我在加载事件中有这个:

这是调试输出

正如预期的那样,客户端大小相同,但总表单大小不同。我试图围绕 .Height 和 .Width 的差异展开思考。没有其他代码可以更改表单属性。第二个调试语句与 IDE 设计器中的表单大小匹配。为什么尺寸不一样?我将如何正确查询以从另一个表单获取表单大小?

0 投票
1 回答
2413 浏览

c++ - 如何正确绘制简单的非客户区(4 px 红色边框)?

我正在尝试绘制自定义绘制的非客户区域,而不是默认主题边框(Windows 10)。

我处理WM_NCCALCSIZE将非客户区的大小调整为每侧 4 个像素,然后处理WM_NCPAINT绘制红色边框。

我的自定义绘画在首次显示应用程序时成功,但在调整应用程序大小或最小化和恢复时无法重绘,尽管在调整大小或恢复窗口时两者都被调用WM_NCCALCSIZEWM_NCPAINT

0 投票
1 回答
742 浏览

delphi - 具有非客户区的自定义控件 - 一开始不计算

我正在编写一个自定义控件,它只是一个具有非客户区的容器。在该非客户区域内,有一个小区域是一个按钮,其余部分是透明的。该图不是一个精确的矩形。

到目前为止,我已经完成了一半的工作。问题是它不会预先计算非客户区,除非我做一个小的调整,比如重新调整它的大小。

我已经关注了许多描述如何实现这一点的资源。我的处理实现WM_NCCALCSIZE或多或少与我发现的“工作”示例相同。但是当控件第一次创建时,它根本不计算这个。当我在我的消息处理程序 ( ) 中放置一个断点时WMNCCalcSize,根据我找到的示例,我应该首先检查Msg.CalcValidRects,并且只有在它是True. 但是在调试运行时,它是False,因此计算没有完成。

在设计时,如果我重新调整控件的大小,那么它会决定正确计算。它仍然不完美(此代码仍在工作中),但在我调整它之前它似乎没有设置非客户区。此外,在运行时,如果我调整代码中的大小,它仍然无法计算。

调整大小之前和之后

顶部的图像是最初创建/显示表单的时间。第二个是在我稍微调整大小之后。注意测试按钮,它是对齐的alLeft。所以最初,它消耗了应该是非客户端的区域。

如果我注释掉 check if Msg.CalcValidRects then begin,那么它会正确计算。但我看到每个例子都在做这个检查,我很确定它是需要的。

我做错了什么以及如何让它始终计算非客户区?

0 投票
1 回答
1120 浏览

c++ - 如何完全删除窗口的非客户区?

我需要一个没有标题栏、没有控制框、没有系统菜单和框架的窗口(所有这些功能都由单独的控件提供)。

我怀疑这应该与CreateWindowExA的窗口样式参数有关dwStyle,并且可能lpWindowName与此处所述有关:https ://docs.microsoft.com/en-us/windows/desktop/winmsg/window-styles

这就是参数最初的样子:

但是,在 中dwStyle,正常的窗口样式WS_OVERLAPPEDWINDOW定义为

WS_OVERLAPPED存在0x00000000L

简单地提供 0 并省略其余部分是行不通的,正如文档所暗示的那样:“窗口是重叠的窗口。重叠的窗口有一个标题栏和一个边框。”

(有趣的是,我完全能够在 VB.NET(甚至在 VB6)中通过将ControlBox属性设置为False然后使用删除标题栏来完成这项任务Text = "",所以我强烈怀疑在 VB 中可能时......)

我将如何在 C++ 中完成我的任务?


以防万一WindowProc需要处理不同的消息,这里是它的简约版本:

(使用 VS 2017 编译。)