通过 DLL 将子窗口添加到 Metatrader4 的图表 - 闪烁(不重绘)

Posted

技术标签:

【中文标题】通过 DLL 将子窗口添加到 Metatrader4 的图表 - 闪烁(不重绘)【英文标题】:Adding child window to Metatrader4's chart via DLL - blinking (not redrawing) 【发布时间】:2013-09-16 14:46:07 【问题描述】:

我想在 Metatrader4 的图表窗口中添加一个子窗口,该窗口始终保持在顶部,不闪烁,只是在任何事情上(在父窗口中)一直静态存在。我是通过 DLL (C++) 执行此操作的。

我从 mql 端调用这个方法:

MT4_EXPFUNC int __stdcall testWindow(HWND hwnd) 
    prnt_hWnd = hwnd;
    CreateThread(0, NULL, ThreadProc, (LPVOID)L"Window Title", NULL, NULL);
    return 0;

父窗口的(图表)句柄作为参数给出。

DWORD WINAPI ThreadProc( LPVOID lpParam )

    MSG messages;
    /*
    ... in createWindowClass:


        WNDCLASSEX wc;
        wc.hInstance =  GetModuleHandle(NULL);
        wc.lpszClassName = (LPCWSTR)L"MyClass";
        wc.lpszClassName = (LPCWSTR)szClassName;
        wc.lpfnWndProc = DLLWindowProc;
        wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
        ...
    */
    CreateWindowClass(L"MyClass");
    HWND hwnd = CreateWindowEx (0, L"MyClass", NULL, WS_VISIBLE | WS_CHILD , CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, prnt_hWnd, NULL, GetModuleHandle(NULL), NULL );
    ShowWindow (hwnd, SW_SHOWNORMAL);
    while (GetMessage (&messages, NULL, 0, 0))
    
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    
    return 1;

我这样处理窗口的消息:

LRESULT CALLBACK DLLWindowProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

    switch (message) 
        case WM_PAINT: 
             PAINTSTRUCT ps;
             BeginPaint( hwnd, &ps );
             EndPaint( hwnd, &ps );
             return 0;
           
        case WM_COMMAND:
              /* */                   
               break;
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    
    return 0;

一开始我的子窗口出现,然后(我猜)父窗口被重绘后,突然它消失了,然后它只是闪烁(快速出现-消失)。

我的目标是在该图表上静态创建一个子窗口,因此始终位于最上方,不会闪烁。我只能在没有 WS_CHILD 属性的情况下实现这一点。但是我的子窗口不在父窗口上。

【问题讨论】:

【参考方案1】:

尝试将 WS_CLIPCHILDREN 样式添加到图表窗口。我会通过一些 MT4 导出函数在 init() 中传递 MQL4 端的句柄。例如, SetChartWnd( HWND hChartWnd ) 并将 WindowHandle( Symbol(), Period() ) 作为参数传递。 然后在该函数中,我会尝试执行以下操作:

if ( ::IsWindow( hChartWnd ) ) 
    DWORD style = GetWindowLong( hChartWnd, GWL_STYLE );
    style |= WS_CLIPCHILDREN;
    SetWindowLong( hChartWnd, GWL_STYLE, style );
  

【讨论】:

以上是关于通过 DLL 将子窗口添加到 Metatrader4 的图表 - 闪烁(不重绘)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不从当前活动选项卡中获取焦点的情况下将子窗口添加到 QMdiArea(设置为 TAB 模式)?

将子视图添加到 NSView 以获得类似国际象棋的网格

将子窗口停靠到父窗口

实体框架代码优先 - 通过主键将子实体添加到父实体

通过 xib 或 storyboard 将子视图添加到 UICollectionViewCell 的 contentView

如何使用 Win32 API 阻止来自透明窗口的鼠标输入?