如何使用 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 那样自定义表单 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++
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 使用非托管导出显示和关闭 C# 窗体 C++
- 显示主窗体 Qt C++ 中的其他窗体
- 如何使用 FMX C++在任务栏上显示辅助窗体
- 从单击点显示窗体
- Windows窗体显示与显示对话框
- C++Windows窗体应用程序:当我单击当前窗体上的按钮时,如何显示以前的窗体
- C++窗体-单击按钮后如何显示/隐藏某个对象(如按钮或文本框)
- 如何在Windows窗体应用程序中显示cv::Mat
- 如何在qt构造函数完成执行前显示窗体
- 使QT窗体不显示在任务栏
- 显示未处于模式模式的对话框窗体