- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 XCode 中,通过将这些方法添加到 NSView 子类中可以防止窗口在单击时变为事件状态:
- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent )theEvent {
return YES;
}
- (BOOL)acceptsFirstMouse:(NSEvent )theEvent {
return YES;
}
- (void)mouseDown:(NSEvent )theEvent {
[[[NSApp]] preventWindowOrdering];
}
在Windows平台上是通过这个简单的代码完成的:
HWND hWnd = FindWindowW((String("FM") + fmxForm->ClassName()).c_str(),
fmxForm->Caption.c_str());
SetWindowLong(hWnd, GWL_EXSTYLE,
GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
如何子类化 NSView 以防止我的 FMX TForm 在单击它时变为事件状态?
如何在 firemonkey 中创建“不激活”表单?
最佳答案
可以将 NSPanel 与 NSNonactivatingPanelMask 标志一起使用。 fmx 表单的 NSView 应成为 NSPanel 的子级。我编写了一个适用于 Windows 和 Mac 平台的帮助程序类(适用于 XE4):
unit NoActivateForm;
interface
uses Fmx.Forms, Fmx.Types
{$IFDEF POSIX}
, Macapi.AppKit
{$ENDIF}
;
type TNoActivateForm = class
private
form: TForm;
{$IFDEF POSIX}
panel: NSPanel;
timer: TTimer; // for simulating mouse hover event
{$ENDIF}
procedure SetPosition(const x, y: Integer);
procedure GetPosition(var x, y: Integer);
procedure SetDimensions(const width, height: Integer);
procedure SetLeft(const Value: Integer);
procedure SetTop(const Value: Integer);
procedure SetHeight(const Value: Integer);
procedure SetWidth(const Value: Integer);
procedure SetVisible(const Value: Boolean);
function GetLeft: Integer;
function GetTop: Integer;
function GetHeight: Integer;
function GetWidth: Integer;
function GetVisible: Boolean;
{$IFDEF POSIX}
procedure OnTimer(Sender: TObject);
{$ENDIF}
public
constructor Create(AForm: TForm);
destructor Destroy; override;
property Left: Integer read GetLeft write SetLeft;
property Top: Integer read GetTop write SetTop;
property Height: Integer read GetHeight write SetHeight;
property Width: Integer read GetWidth write SetWidth;
property Visible: Boolean read GetVisible write SetVisible;
end;
implementation
uses
Classes, System.Types
{$IFDEF MSWINDOWS}
, Winapi.Windows;
{$ELSE}
, Macapi.CocoaTypes, FMX.Platform.Mac, Macapi.CoreGraphics, Macapi.CoreFoundation;
{$ENDIF}
constructor TNoActivateForm.Create(AForm: TForm);
{$IFDEF POSIX}
var
rect: NSRect;
bounds: CGRect;
window: NSWindow;
style: integer;
panelCount: integer;
begin
form := AForm;
form.Visible := false;
bounds := CGDisplayBounds(CGMainDisplayID);
rect := MakeNSRect(form.Left, bounds.size.height - form.Top - form.Height,
form.ClientWidth, form.ClientHeight);
style := NSNonactivatingPanelMask;
style := style or NSHUDWindowMask;
panel := TNSPanel.Wrap(
TNSPanel.Alloc.initWithContentRect(rect, style, NSBackingStoreBuffered,
true));
panel.setFloatingPanel(true);
//panel.setHasShadow(false); optional
window := WindowHandleToPlatform(form.Handle).Wnd;
panel.setContentView(TNSView.Wrap(window.contentView));
TNSView.Wrap(window.contentView).retain;
timer := TTimer.Create(form.Owner);
timer.OnTimer := OnTimer;
timer.Interval := 50;
end;
{$ELSE}
var hWin: HWND;
begin
form := AForm;
form.TopMost := true;
hWin := FindWindow(PWideChar('FM' + form.ClassName), PWideChar(form.Caption));
if hWin <> 0 then
SetWindowLong(hWin, GWL_EXSTYLE,
GetWindowLong(hWin, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
end;
{$ENDIF}
destructor TNoActivateForm.Destroy;
{$IFDEF POSIX}
begin
panel.release;
end;
{$ELSE}
begin
end;
{$ENDIF}
procedure TNoActivateForm.SetPosition(const x, y: Integer);
{$IFDEF POSIX}
var point: NSPoint;
screen: CGRect;
begin
screen := CGDisplayBounds(CGMainDisplayID);
point.x := x;
point.y := round(screen.size.height) - y - form.height;
panel.setFrameOrigin(point);
end;
{$ELSE}
begin
form.Left := x;
form.Top := y;
end;
{$ENDIF}
procedure TNoActivateForm.GetPosition(var x, y: Integer);
{$IFDEF POSIX}
var screen: CGRect;
begin
screen := CGDisplayBounds(CGMainDisplayID);
x := round(panel.frame.origin.x);
y := round(screen.size.height - panel.frame.origin.y - panel.frame.size.height);
end;
{$ELSE}
begin
x := form.Left;
y := form.Top;
end;
{$ENDIF}
procedure TNoActivateForm.SetDimensions(const width, height: Integer);
{$IFDEF POSIX}
var size: NSSize;
begin
size.width := width;
size.height := height;
panel.setContentSize(size);
end;
{$ELSE}
begin
form.width := width;
form.height := height;
end;
{$ENDIF}
procedure TNoActivateForm.SetLeft(const Value: Integer);
begin
SetPosition(Value, Top);
end;
procedure TNoActivateForm.SetTop(const Value: Integer);
begin
SetPosition(Left, Value);
end;
procedure TNoActivateForm.SetHeight(const Value: Integer);
begin
SetDimensions(Width, Value);
end;
procedure TNoActivateForm.SetWidth(const Value: Integer);
begin
SetDimensions(Value, Height);
end;
procedure TNoActivateForm.SetVisible(const Value: Boolean);
begin
{$IFDEF POSIX}
panel.setIsVisible(Value);
{$ELSE}
form.visible := Value;
{$ENDIF}
end;
function TNoActivateForm.GetLeft: Integer;
var x, y: Integer;
begin
GetPosition(x, y);
result := x;
end;
function TNoActivateForm.GetTop: Integer;
var x, y: Integer;
begin
GetPosition(x, y);
result := y;
end;
function TNoActivateForm.GetHeight: Integer;
begin
{$IFDEF POSIX}
result := round(panel.frame.size.height);
{$ELSE}
result := form.Height;
{$ENDIF}
end;
function TNoActivateForm.GetWidth: Integer;
begin
{$IFDEF POSIX}
result := round(panel.frame.size.width);
{$ELSE}
result := form.Width;
{$ENDIF}
end;
function TNoActivateForm.GetVisible: Boolean;
begin
{$IFDEF POSIX}
result := panel.isVisible();
{$ELSE}
result := form.visible;
{$ENDIF}
end;
{$IFDEF POSIX}
procedure TNoActivateForm.OnTimer(Sender: TObject);
var event: CGEventRef;
point: CGPoint;
form_rect: TRectF;
client_point, mouse_loc: TPointF;
shift: TShiftState;
begin
event := CGEventCreate(nil);
point := CGEventGetLocation(event);
CFRelease(event);
mouse_loc.SetLocation(point.x, point.y);
if Visible = true then
begin
form_rect := RectF(0, 0, form.Width, form.Height);
client_point.X := mouse_loc.X - Left;
client_point.Y := mouse_loc.y - Top;
if PtInRect(form_rect, client_point) then
form.MouseMove(shift, client_point.x, client_point.y)
else
form.MouseLeave();
end;
end;
{$ENDIF}
end.
上述单位的用途:
TNoActivateForm *naKeyboard; // global scope
void __fastcall TfrmKeyboard::TfrmKeyboard(TObject *Sender)
{
naKeyboard = new TNoActivateForm(frmKeyboard); // frmKeyboard is a normal fmx form
naKeyboard->Visible = true;
}
如果 frmKeyboard 是您的主窗体,则不要将上述代码放在窗体构造函数中,建议将其放在 OnShow 中。
注意:XE3中似乎不存在WindowHandleToPlatform,因此可以用
替换该行window := NSWindow(NSWindowFromObjC(FmxHandleToObjC(Form.Handle)));
关于macos - 如何在 Firemonkey 中创建 "No Activate"表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12769064/
如何使用 Firemonkey (XE6) 绘制贝塞尔曲线? XE6 wiki 中的文档目前有点稀疏。 最佳答案 以下代码可用于使用 Firemonkey XE6 绘制简单的贝塞尔曲线。创建一个新的
创建自定义 FireMonkey 样式时,您经常会遇到样式对象,例如 TButtonStyleObject,其中包含一个或多个属性(例如 TButtonStyleObject.NormalLink),
我正在努力让 FireMonkey TEdit 嵌套在 FireMonkey TPopup 中来接收键盘输入。桌面和移动项目都会发生这种情况,尽管我对后者感兴趣: 创建一个新的 FMX 项目。 向表单
我使用以下方法向 Treeviewitem 的复选框添加功能。 function TForm.CreateTVObj:TTreeviewItem; var MyCheckbox:TCheckbox
我有个问题。 我用这个简单的代码添加了一个按钮,但它没有编译任何解决方案? unit Unit1; interface uses System.SysUtils, System.Types, Syst
似乎我需要一个项目的帮助。 我有一个例程,该例程将运行时多个TabItem构造到firemonkey中的页面控件上,并且我想在该标签上有一个关闭按钮。 新选项卡上有一个复选框,用于从选项卡的样式器中加
这个问题在这里已经有了答案: How to free a component in Android / iOS (2 个回答) 7年前关闭。 为了灵 active ,不同的框架(如可见的“模块”,可以
我正在使用 Canvas 绘制函数drawrect和filltext在Tbitmap上绘制,但我不希望结果抗锯齿。有人知道该怎么做吗? 使用 OSX 和 Delphi XE3(但如果需要,可以使用 X
FireMonkey 中是否可以有可停靠的表单,因为我已经检查了表单属性,但没有这样的属性可以做到这一点。有什么解决方法可以实现这一点吗? 最佳答案 据我所知,没有内置任何内容,但您自己添加应该不会太
如果您希望 FireMonkey 中网格的同一列中存在不同的单元格控件,该怎么办?单元格控件似乎属于列,但在某些情况下(如属性编辑器),某些行需要复选框,而其他行需要组合框或编辑控件。 提前致谢。 最
我已将 ......\RAD Studio\9.0\Styles 中的几个示例样式作为资源加载到我的项目中,并且“简单地”尝试在运行时加载其中一个。 我正在使用以下代码来尝试执行此操作: var
在我的应用程序中,有一个文本字段,用户可以在其中输入他们的帐户电子邮件。 使用Java,我可以轻松地让 Android 键盘以小写字母开头 EditText text = new EditText(c
我目前正在尝试 Firemonkey 并遇到了这个问题。当我的申请中有多个表格时,我会得到相同数量的项目在我的 Windows 菜单栏中的一个应用程序(参见屏幕截图)。 在常规 VCL 应用程序中,只
我在 Delphi 中有一个程序,可以将图像组件从一个面板拖放到另一个面板,但在这里我对每个图像组件使用“TWincontrol”和“OnStartDrag”事件,并且效果很好,示例代码如下。当我在
我正在寻找一种在 firemonkey 应用程序中缓存全局热键的方法(仅限 Windows,至少目前如此)。经过一番挫折和谷歌搜索后,这应该可以工作:使用 winapi 调用注册热键 Register
Classic VCL question ...但是如何在 FireMonkey 中执行相同的操作? 我有几个标准的TControl,他们可以集中精力... 例如,在某些TEdit中,如果按返回键,我
我们从版本 1 开始就使用 Firemonkey,但仍然发现更新当前在屏幕上可见的组件很困难。在 Firemonkey 中请求重画的“方式”有很多,也许太多了: 应用样式(ApplyStyle 事件)
在 firemonkey 中,我尝试使用圆角矩形制作进度条。最简单的情况是一个矩形(进度条)和其中的第二个矩形(到目前为止的进度)。附上一个简单的例子。 带角的进度条(油漆): 我尝试过以下操作: 让
我正在使用 Delphi Seattle,我的应用程序适用于 Windows 桌面。 我正在尝试更改 TEdit 的字体大小。因此高度也被修改。在设计时一切正常,但当我运行应用程序时,TEdit 会忽
我目前正在尝试开发一个基于 Firemonkey 的项目。我使用 Firemonkey 是因为它的 UI 功能,因为该项目由许多较小的应用程序组成,每个应用程序都有 3D 方面。我目前仅使用 FMX
我是一名优秀的程序员,十分优秀!