C++ 将子窗口添加到Metatrader4';通过DLL的s图表-闪烁(不重画)
我想在Metatrader4的图表窗口中添加一个子窗口,该窗口始终保持在顶部,不闪烁,只是在每次出现时(在父窗口中)始终静止在那里。我是从一个DLL(C++)来做这件事的 我从mql端调用此方法:C++ 将子窗口添加到Metatrader4';通过DLL的s图表-闪烁(不重画),c++,windows,winapi,dll,metatrader4,C++,Windows,Winapi,Dll,Metatrader4,我想在Metatrader4的图表窗口中添加一个子窗口,该窗口始终保持在顶部,不闪烁,只是在每次出现时(在父窗口中)始终静止在那里。我是从一个DLL(C++)来做这件事的 我从mql端调用此方法: MT4_EXPFUNC int __stdcall testWindow(HWND hwnd) { prnt_hWnd = hwnd; CreateThread(0, NULL, ThreadProc, (LPVOID)L"Window Title", NULL, NULL);
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;
}
我通过以下方式处理window的消息:
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属性的情况下才能实现这一点。但是我的子窗口不在父窗口上 尝试将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 );
}
}