Как показать вторичную форму на панели задач с помощью 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 *)

Вы знаете какую-нибудь другую альтернативу, чтобы сделать это? Если вы можете помочь мне или нет, с тех пор, спасибо много!

1 ответ

Решение

Фрагменты кода, которые вы показали, предназначены только для VCL.

FireMonkey не позволяет вам настраивать создание HWND формы, как это делает VCL. Создание HWND скрыто за закрытым интерфейсом, который FireMonkey использует внутри (TPlatformWin.CreateWindow()). Вот почему нет CreateParams в FireMonkey.

Тем не менее, вы все равно можете получить доступ к HWND, но только после того, как он был создан. E сть WindowHandleToPlatform() функция (которая заменяет старшую FmxHandleToHWND() функция) и FormToHWND функция (которая использует WindowHandleToPlatform() внутри). Все эти функции зависят от Windows, поэтому вам нужно обернуть их #ifdef если вы пишете код FireMonkey, который работает на нескольких платформах.

Попробуй это:

#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++

Другие вопросы по тегам