2013-09-16 3 views
0

Metatrader4의 차트 창에 항상 자식 창을 추가하고 싶습니다. 부모 창이 항상 깜박이지 않고 항상 정적으로 표시됩니다). DLL (C++)에서이 작업을 수행하고 있습니다.DLL을 통해 Metatrader4의 차트에 자식 창 추가 - 깜박임 (다시 그리지 않음)

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

부모 윈도우의 (그래프) 핸들 파라미터로서 주어진다

는 I는 MQL 측으로부터이 메소드를 호출한다. 다음은, (내 생각) 부모 윈도우가 다시 그려되고 점점 후

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; 
} 

시작에서 내 자식 창, 그때, 갑자기 사라질 나타납니다 :

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; 
} 

나는 윈도우의 메시지를 이런 식으로 처리 깜박 거림 (빨리 사라짐).

저의 목표는 차트에 정적으로, 항상 최상위로 깜박임없이 자식 창을 갖는 것입니다. WS_CHILD 속성없이이 작업을 수행 할 수 있습니다. 그렇지만 내 아이 창은 부모가 아닙니다.

답변

0

차트 창에 WS_CLIPCHILDREN 스타일을 추가하십시오. init()의 MQL4 측 핸들을 MT4 내보내기 함수를 통해 전달합니다. 예를 들어 SetChartWnd (HWND hChartWnd) 및 WindowHandle (Symbol(), Period())을 매개 변수로 전달합니다. 그 함수 안에는 다음과 같은 것을 시도 할 것입니다 :

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