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