我正在使用以下代码使表单透明,但是当应用程序启用了VCL样式时,表单使用VCL样式的背景颜色绘制而不是透明.
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure CreateParams(var Params:TCreateParams); override;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := WS_EX_TRANSPARENT or WS_EX_TOPMOST;
//Params.ExStyle := Params.ExStyle or WS_EX_LAYERED;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Brush.Style:=bsClear;
BorderStyle:=bsNone;
//SetLayeredWindowAttributes(Handle, 0, 230, $00000002);
end;
Run Code Online (Sandbox Code Playgroud)
仅供参考如果将vcl样式设置为,则代码可以正常工作Windows.
还有另一种方法可以使表单透明以解决此问题吗?
我想这也是为什么VCL样式还没有准备好真正使用的另一个原因.
没有VCL样式,TDateTimePicker控件看起来很好.打开任何vcl样式,我得到这样的外观:

我可以通过注册一个样式钩子来关闭这个组件类型的vcl样式,但这看起来很丑陋.
这是在安装了更新4的Delphi XE2上.
理想情况下,我希望有一个解决方法,或日期时间选择器的一些属性,或datetimepicker的一些子类,我可以做,以强制日期时间选择器正确绘制和主题.
请注意,正常的组合框正确主题.请注意,这可以在可以想象的最小样本项目中轻松再现.是.这是另一种风格的错误.
更新它可能是特定于平台的,与没有Aero的Windows Server 2008 R2上的Windows公共控件版本相关(Windows服务器组件术语中的"桌面体验").在其他人无法重现它之后,我才想到它,在几台不同的Windows机器上试试这个.在我这样做之后,我发现该问题仅在Windows Server 2008 R2上重现.我们的一些客户使用Windows Server 2008 R2.如您所知,使用VCL样式的一个主要原因是,无论Windows主题是什么,它都会使您的应用看起来一样.但是在上面的例子中,整个应用程序主题正确,除了DateTimePicker控件,它是错误的主题,并且只在Windows Server 2008 R2上.相同的基于XE2的演示应用程序在Windows 7上运行良好.
工作和非工作系统都在SysWow64文件夹中有一个ComCtl32.dll,版本读数为5.82.7601.17514.但是,很明显,当VCL主题关闭时,这些控件的原生布局和外观会有所不同,这会影响失败的外观代码.
Update2:报告为错误:QC Entry 106783
我有一个源自TMemo的控件.在我第一次使用Delphi XE7 VCL样式之前,它工作得很好.在Delphi XE7下,样式不会应用于控件的滚动条.如果使用黑暗的主题/风格,它看起来很可怕,而滚动条是银色的.

尝试创建一个我们可以重现错误的最小项目我发现了一些非常有趣的东西:添加/删除随机代码行(或DFM控件)会使错误出现/消失.
问题:什么真正导致这种奇怪的行为以及如何解决它?
http://s000.tinyupload.com/index.php?file_id=24129853712119260018
我正在使用以下文件从文件加载自定义样式:
TStyleManager.LoadFromFile(filename)
Run Code Online (Sandbox Code Playgroud)
当文件被更改时,我想再次加载它.但是,如果我尝试我得到一个EDuplicateStyleException因为风格已经注册.
有没有办法卸载样式,所以我可以再次加载它?典型的情况是您正在更改自定义样式,并希望在不重新启动整个应用程序的情况下查看它.
我正在使用启用了vcl样式的组合框,但是当我运行应用程序时,组合框使用的高亮颜色是窗口高亮颜色而不是vcl样式.
我怎么能解决这个问题,我的意思是在组合框中使用vcl风格的高亮颜色?

TDateTime选择器是一个ComboBox,下拉列表将替换为日历.我使用XE2 VCL样式,更改样式不会影响TDateTimePicker颜色和字体颜色.我已经用这个问题更改了日历样式但是对于ComboBox来说解决方案不行,任何想法?现在我计划继承TComboBox以用于TMonthCalendar,但我知道是否有人有更好的解决方案.
我有以下过程允许从Windows中删除文件,删除工作正常,但是当我在运行时使用(TStyleManager.TrySetStyle(styleName))更改样式时,表单接受不再丢弃!这到底有什么问题?
public //public section of the form
...
procedure AcceptFiles( var msg : TMessage ); message WM_DROPFILES;
...
procedure TMainFrm.AcceptFiles(var msg: TMessage);
var
i,
fCount : integer;
aFileName : array [0..255] of char;
begin
// find out how many files the form is accepting
fCount := DragQueryFile( msg.WParam, {uses ShellApi is required...}
$FFFFFFFF,
acFileName,
255 );
for I := 0 to fCount - 1 do
begin
DragQueryFile(msg.WParam, i, aFileName, 255);
if UpperCase(ExtractFileExt(aFileName)) = '.MSG' then //accept only .msg …Run Code Online (Sandbox Code Playgroud) 我开发了一个具有一种形式的DLL.我使用下面的代码为它设置了一个样式.
library TestLib;
uses Vcl.Themes, Vcl.Styles,....
.
.
exports
function1,
function2;
begin
TStyleManager.TrySetStyle('Style1');
end.
Run Code Online (Sandbox Code Playgroud)
当我加载此DLL并调用function1打开此窗体.表单打开时应用了样式.
现在,当我最小化该窗口时,我收到了访问冲突.包括Maximize&Restore在内的一切都运行良好.此外,所有功能都正常.
我想这不是处理由此表单的Minimize事件生成的消息.请指教.
注意:当我删除样式时,一切正常.
Call Stack
:0976742b TWinControl.HandleNeeded + $3
:0978ad8a TStyleManager.HandleMessage + $56
:09762a3c TWinControl.DoHandleStyleMessage + $14
:0972e6be TCustomForm.WndProc + $612
:09763c2b TWinControl.MainWndProc + $2F
Run Code Online (Sandbox Code Playgroud)
更新:SSCCE
Project1.EXE(有一个表单Unit1.pas/dfm)
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function InitDLL: Boolean;
end; …Run Code Online (Sandbox Code Playgroud) 在主窗体上添加一个Tbutton和一个TSaveDialog
在SaveDialog1的属性中将"ofOverwritePrompt"设置为True
使用:
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveDialog1.Execute();
end;
Run Code Online (Sandbox Code Playgroud)运行应用程序.按按钮执行保存对话框.尝试保存到已存在的文件.如果要替换文件,则会出现一个消息框.按取消.到目前为止都很好.关闭应用程序.
转到项目/选项/应用程序/外观并选择自定义样式(例如Amakrits).将Amakrits设置为默认样式.
(使用TFileSaveDialog会得到相同的结果)
如果我使用Delphi XE8编译并运行应用程序就可以了,因为即使选择了另一种样式,保存对话框窗口似乎也使用默认的窗口样式.
编辑:我有Windows 10专业版.使用Delphi 10.1 Berlin编译为win32的源代码.替换消息框部分隐藏.仅显示左上方的小部分,请参见图.
这里用XE8 win32编译:
PS.我使用默认的100%比例因子.
使用win64(Delphi 10.1 Berlin)编译似乎没问题:
因此,编译为win32对我来说不起作用,但64位会.有线索吗?
编辑:尝试使用"GetSaveFileName(OFN)"也不适合我在win32(胜利64是好的):
目前我正在测试启用VCL样式的应用程序的各个方面.
我注意到,当Windows缩放高于默认的96 dpi/100%时,VCL表单的图标和标题栏文本太大 - 两者都要靠近 - 请参阅附带的屏幕截图.对于200%或250%的更高标度(例如在4K显示器和Windows 10上使用),尤其如此,但即使缩放为144 dpi/150%,问题也已经可见.
对于RAD Studio提供的所有样式都是如此.通过项目设置启用清单的高Dpi感知.如果我在应用程序中禁用VCL样式,则图标和标题栏文本的大小正确.
我在这里错过了什么吗?如果启用显示缩放,开箱即用的样式是否应该没有开箱即用的显示错误?或者是否有一些设置我可以调整以解决这个问题.
谢谢,