Как перерисовать содержимое окна до того как оно переместилось?
От: C0x  
Дата: 03.02.17 17:41
Оценка:
Перемешаю мышкой child окно над другим parent окном.
Хочу добиться эффекта прозрачности child окна относительно parent окна.
Дебагом обнаружил, что OnPaint child окна вызывается после того как окно появляется в новом месте.
То есть получается, сначала окно перемещается в новое место, там рисуется со старым содержимым, а потом перерисовывается его содержимое.
Вопрос: Как перерисовать содержимое до того как окно возникнет в новом месте?


Немного предыстории:

Есть окно в котором нарисована большая картинка. Задача на этом окне вводить текст в любой позиции. Этот текст потом добавляется к картинке и сохраняется.
Решил сделать с помощью дополнительного окна с прозрачным CEdit для ввода текста (чтобы не реализовывать все штуки по работе с текстом самостоятельно).

Все замечательно, но осталась проблема с перемещением этой рамки (окна с текстовым полем) поверх первого окна с картинкой. Когда я перемещаю рамку,
то содержимое дочернего окна рамки перерисовывается с задержкой из за чего создается неприятный эффект несоответствия содержания двух окон.

Для перерисовки дочернего окна-рамки я делаю следующее:


void CTextBoxDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{

    CDialog::OnWindowPosChanging(lpwndpos);

    Invalidate();
}


А Вот OnPaint который берет содержимое parent окна и рисует нужную область из него.

void CTextBoxDlg::OnPaint()
{

    CPaintDC dc(this); // device context for painting
                       //CDC      MemDC;
                       //BITMAP   bit;

    CDC* pParentDC = m_pParentWnd->GetDC();

    CRect rect;
    GetWindowRect(&rect);
    dc.BitBlt(0, 0, rect.Width(), rect.Height(), pParentDC, rect.left, rect.top, SRCCOPY);


    dsc.Draw(dc);

    CDialog::OnPaint();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.