Сообщение от SendMessage должно вызвать рисование другого окна, но это не так - PullRequest
0 голосов
/ 11 февраля 2012

Проблема такая: у меня есть два приложения winapi.Есть только один способ общения.App1 отправляет сообщение в App2.App2 должен получить WM_COPYDATA со структурой, которая имеет координаты двух фигур, а затем должен нарисовать эти фигуры.Сообщение получено.Данные из структуры в порядке.Выполнен код в случае WM_COPYDATA, который должен закрасить окно, но ничего не происходит (окно имеет только сплошной белый фон)

Отправка сообщения выглядит следующим образом:

HWND secondApp = FindWindowEx(NULL, NULL, _T("lab2app2"), NULL ); 
int error = GetLastError();
if(secondApp != 0) // window found, send message
{
    // prepare data
    FiguresData figuresData;
    // Set Data About Location and dimensions of figures
    // TODO
    figuresData.square_origin_x = square_origin_x;
    figuresData.square_origin_y = square_origin_y;
    figuresData.circle_origin_x = circle_origin_x;
    figuresData.circle_origin_y = circle_origin_y;

    COPYDATASTRUCT data;

    data.dwData = FIGURESDATA;
    data.cbData = sizeof( figuresData );
    data.lpData = &figuresData;
    bool value =  SendMessage(secondApp, WM_COPYDATA, (WPARAM)(HWND)mainWindow, (LPARAM)(LPVOID)&data);
}

Структура FiguresData проста и имеет только 4ints в нем.

App2 получает сообщения и код для этого:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_PAINT:

    RECT clientRectangle;
GetClientRect(hWnd, &clientRectangle);

hdc = BeginPaint(hWnd, &ps);

    // nothing really here

    EndPaint(hWnd, &ps);
    break;

case WM_COPYDATA:
    {
    PCOPYDATASTRUCT pData;
    pData = (PCOPYDATASTRUCT) lParam;

    int square_origin_x = ((FiguresData *) ( pData->lpData ))->square_origin_x;
    int square_origin_y = ((FiguresData *) ( pData->lpData ))->square_origin_y;
    int circle_origin_x = ((FiguresData *) ( pData->lpData ))->circle_origin_x;
    int circle_origin_y = ((FiguresData *) ( pData->lpData ))->circle_origin_y;
    hdc = BeginPaint(hWnd, &ps);
    HPEN oldPen = (HPEN)SelectObject(hdc, pen);
    HBRUSH oldBrush = (HBRUSH)SelectObject(hdc, backgroundBrush);
    COLORREF oldBackgroundColor = SetBkColor(hdc, backgroundColor);

    Rectangle(hdc, square_origin_x, square_origin_y, square_origin_x+ SQUARE_SIDE, square_origin_y + SQUARE_SIDE);
    Ellipse(hdc, circle_origin_x, circle_origin_y, circle_origin_x+ SQUARE_SIDE, circle_origin_y + SQUARE_SIDE);


    // Put everything back the way we found it
    SelectObject(hdc, oldPen);
    SetBkColor(hdc, oldBackgroundColor);

    EndPaint(hWnd, &ps);
    break;
    }
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    break;
}

return 0;
}

В отладчике я вижу, что дескриптор окна в порядке.Сообщение отправляется, а также принимается App2 и выполняется код в случае WM_COPYDATA, но это не имеет никакого эффекта.Никакие фигуры не нарисованы в окне App2, и я понятия не имею, почему.Любая подсказка?

1 Ответ

1 голос
/ 11 февраля 2012

Вы звоните BeginPaint вне WM_PAINT обработчика. BeginPaint возвращает контекст устройства, который позволяет рисовать только в недопустимой области окна. Поскольку вы не вызвали InvalidateRect, окно еще не является недействительным, поэтому BeginPaint ничего не рисует.

Как правило, вы должны ограничить рисование обработчиком WM_PAINT. Пусть ваш обработчик WM_COPYDATA запомнит, что нужно рисовать, затем лишите законной силы окно, и обработчик WM_PAINT действительно его нарисует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...