【问题标题】:How to show a secondary form on taskbar using FMX C++?如何使用 FMX C++ 在任务栏上显示辅助表单?
【发布时间】:2015-03-08 16:52:49
【问题描述】:

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

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 *)

您知道其他方法可以做到这一点吗? 如果你能帮助我,从现在开始,非常感谢!

【问题讨论】:

    标签: c++ c++builder firemonkey firemonkey-fm3 c++builder-xe6


    【解决方案1】:

    您显示的代码 sn-ps 仅适用于 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
    

    另见:

    example of embarcadero WindowHandleToPlatform c++

    【讨论】:

    • 非常感谢,它成功了。但是进入条件(如果)结构有一个错误,它不是“hWnd!-NULL”是“hWnd!= NULL”。所以,这就是我想说的:if(hWnd!= NULL)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多