如何使用 FMX C++在任务栏上显示辅助窗体

How to show a secondary form on taskbar using FMX C++?

本文关键字:显示 窗体 任务栏 何使用 FMX C++      更新时间:2023-10-16

尝试同时在任务栏上显示多个表单时,我遇到了一个小问题。我发现我需要使用以下:

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 那样自定义表单 HWND 的创建。HWND的创建隐藏在FireMonkey内部使用的私有接口后面(TPlatformWin.CreateWindow())。 这就是为什么FireMonkey中没有CreateParams的原因。

但是,您仍然可以访问 HWND,但只能在创建后访问它。 有一个WindowHandleToPlatform()函数(替换旧的FmxHandleToHWND()函数)和一个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

另请参阅:

Embarcadero示例 WindowHandleToPlatform c++