Как определить onDraw () в MFC

Я понимаю что onDraw() функция виртуальная пустота, которая вызывается автоматически через OnPaint(), который сам запускается сообщением WM_PAINT.

Моя декларация выглядит примерно так:

myDialog.cpp

void myDialog::OnDraw(CDC* dc)
{
CCustomMemDC pDC(dc);
CExampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}

myDialog.h

afx_msg void OnDraw(CDC* dc);

и в моем OnPaint()

CDialog::OnPaint();

Однако я не мог заставить OnDraw быть запущенным вообще … Может ли кто-нибудь просветить, если этот метод правильный?

Спасибо!

2

Решение

Диалог не имеет OnDraw. Это виртуальная функция в представлениях, позволяющая печатать и рисовать на экране.

В диалоге просто используйте OnPaint. В диалоговом окне нет перенаправления на виртуальную функцию OnDraw.

1

Другие решения

Это не правильно. Как уже отмечали другие, OnDraw () — это виртуальный метод CView, а не CDialog. Следовательно, ваш метод OnDraw () никогда не будет вызываться.

Я не знаю, почему в вашем диалоге возникла проблема с мерцанием, и вам нужно было бы его смягчить. Если у вас есть настраиваемый элемент управления в диалоговом окне, которое вызывает мерцание, то вам, вероятно, нужно исправить в нем код рисования и, возможно, добавить WS_CLIPCHILDREN в качестве стиля окна в свой диалог. Это гарантирует, что фон пользовательского элемента управления не стирается, когда диалоговое окно выполняет свое сообщение WM_ERASEBKGND.

Нет смысла перезаписывать WM_PAINT диалога, если вы действительно не планируете делать на нем собственное рисование. Если у вас нет очень веских причин, не делайте этого.

Если вы решили проигнорировать совет, добавьте ON_WM_PAINT () к вашему обработчику сообщений в диалоговое окно, а затем нарисуйте диалоговое окно самостоятельно:

void myDialog::OnPaint()
{
CPaintDC dc(this);
CCustomMemDC pDC(&dc);
// do your specialized code knowing you are responsible for drawing the whole dialog
}

Если вы действительно хотите использовать свой метод OnDraw (), то вы также можете написать OnPaint () следующим образом:

void myDialog::OnPaint()
{
CPaintDC dc(this);
OnDraw(&dc);
}

Но первое, что я хотел бы сделать в вашей ситуации, это попробовать добавить стиль WS_CLIPCHILDREN к вашему стилю диалога.

0

По вопросам рекламы [email protected]