Я хотел бы добавить дочернее окно в окно графика 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. Но тогда мое дочернее окно не находится на родительском.
Попробуйте добавить стиль WS_CLIPCHILDREN в окно графика. Я бы передал дескриптор на стороне MQL4 в init () через некоторую функцию экспорта MT4. Например, SetChartWnd (HWND hChartWnd) и передача WindowHandle (Symbol (), Period ()) в качестве параметра.
Затем внутри этой функции я бы попытался сделать что-то вроде следующего:
if ( ::IsWindow( hChartWnd ) ) {
DWORD style = GetWindowLong( hChartWnd, GWL_STYLE );
style |= WS_CLIPCHILDREN;
SetWindowLong( hChartWnd, GWL_STYLE, style );
}
}
Других решений пока нет …