如何使用 FMX C++ 在任务栏上显示辅助表单?
How to show a secondary form on taskbar using FMX C++?
我在尝试同时在任务栏上显示多个表单时遇到了一点问题。
我发现我需要使用以下内容:
WS_EX_APPWINDOW
所以我多搜索了一下,然后找到了:
class TForm2 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TForm2(TComponent* Owner);
void __fastcall CreateParams(Controls::TCreateParams &Params);
};
void __fastcall TForm2::CreateParams(Controls::TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.ExStyle = Params.ExStyle | WS_EX_APPWINDOW;
Params.WndParent = ParentWindow;
}
但是该函数仅适用于 VCL(TCreateParams 不是 Fmx::Controls 的成员)。
所以,我再次搜索了一下,找到了(这个函数在OnCreate表单函数中):
SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_APPWINDOW);
但我说错了以下内容:
[bcc32 Error] Codigo.cpp(19): E2034 Cannot convert 'TWindowHandle * const' to 'HWND__ *'
Full parser context
Codigo.cpp(18): parsing: void _fastcall TfrmCodigo::FormCreate(TObject *)
[bcc32 Error] Codigo.cpp(19): E2342 Type mismatch in parameter 'hWnd' (wanted 'HWND__ *', got 'TWindowHandle *')
Full parser context
Codigo.cpp(18): parsing: void _fastcall TfrmCodigo::FormCreate(TObject *)
您知道其他替代方法吗?
如果你能帮助我,从现在开始,非常感谢!
您显示的代码片段仅适用于 VCL。
FireMonkey 不允许您像 VCL 那样自定义创建 Form 的 HWND。 HWND 创建隐藏在 FireMonkey 内部使用的私有接口后面 (TPlatformWin.CreateWindow()
)。这就是为什么 FireMonkey 中没有 CreateParams
的原因。
但是,您仍然可以访问 HWND,但只能在创建之后访问。有一个 WindowHandleToPlatform()
function (which replaces the older FmxHandleToHWND()
function), and a FormToHWND
函数(内部使用 WindowHandleToPlatform()
)。所有这些函数都是 Windows 特定的,因此如果您正在编写在多个平台上运行的 FireMonkey 代码,则必须用 #ifdef
将它们包装起来。
试试这个:
#ifdef _Windows
#include <FMX.Platform.Win.hpp>
#endif
...
#ifdef _Windows
//HWND hWnd = FmxHandleToHWND(Form2->Handle);
//HWND hWnd = WindowHandleToPlatform(Form2->Handle)->Wnd;
HWND hWnd = FormToHWND(Form2);
if (hWnd != NULL)
{
LONG Style = GetWindowLong(hWnd, GWL_EXSTYLE); // <-- don't forget this step!
SetWindowLong(hWnd, GWL_EXSTYLE, Style | WS_EX_APPWINDOW);
}
#endif
另见:
example of embarcadero WindowHandleToPlatform c++
我在尝试同时在任务栏上显示多个表单时遇到了一点问题。 我发现我需要使用以下内容:
WS_EX_APPWINDOW
所以我多搜索了一下,然后找到了:
class TForm2 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TForm2(TComponent* Owner);
void __fastcall CreateParams(Controls::TCreateParams &Params);
};
void __fastcall TForm2::CreateParams(Controls::TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.ExStyle = Params.ExStyle | WS_EX_APPWINDOW;
Params.WndParent = ParentWindow;
}
但是该函数仅适用于 VCL(TCreateParams 不是 Fmx::Controls 的成员)。
所以,我再次搜索了一下,找到了(这个函数在OnCreate表单函数中):
SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_APPWINDOW);
但我说错了以下内容:
[bcc32 Error] Codigo.cpp(19): E2034 Cannot convert 'TWindowHandle * const' to 'HWND__ *'
Full parser context
Codigo.cpp(18): parsing: void _fastcall TfrmCodigo::FormCreate(TObject *)
[bcc32 Error] Codigo.cpp(19): E2342 Type mismatch in parameter 'hWnd' (wanted 'HWND__ *', got 'TWindowHandle *')
Full parser context
Codigo.cpp(18): parsing: void _fastcall TfrmCodigo::FormCreate(TObject *)
您知道其他替代方法吗? 如果你能帮助我,从现在开始,非常感谢!
您显示的代码片段仅适用于 VCL。
FireMonkey 不允许您像 VCL 那样自定义创建 Form 的 HWND。 HWND 创建隐藏在 FireMonkey 内部使用的私有接口后面 (TPlatformWin.CreateWindow()
)。这就是为什么 FireMonkey 中没有 CreateParams
的原因。
但是,您仍然可以访问 HWND,但只能在创建之后访问。有一个 WindowHandleToPlatform()
function (which replaces the older FmxHandleToHWND()
function), and a FormToHWND
函数(内部使用 WindowHandleToPlatform()
)。所有这些函数都是 Windows 特定的,因此如果您正在编写在多个平台上运行的 FireMonkey 代码,则必须用 #ifdef
将它们包装起来。
试试这个:
#ifdef _Windows
#include <FMX.Platform.Win.hpp>
#endif
...
#ifdef _Windows
//HWND hWnd = FmxHandleToHWND(Form2->Handle);
//HWND hWnd = WindowHandleToPlatform(Form2->Handle)->Wnd;
HWND hWnd = FormToHWND(Form2);
if (hWnd != NULL)
{
LONG Style = GetWindowLong(hWnd, GWL_EXSTYLE); // <-- don't forget this step!
SetWindowLong(hWnd, GWL_EXSTYLE, Style | WS_EX_APPWINDOW);
}
#endif
另见:
example of embarcadero WindowHandleToPlatform c++