Я понимаю что 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 быть запущенным вообще … Может ли кто-нибудь просветить, если этот метод правильный?
Спасибо!
Диалог не имеет OnDraw. Это виртуальная функция в представлениях, позволяющая печатать и рисовать на экране.
В диалоге просто используйте OnPaint. В диалоговом окне нет перенаправления на виртуальную функцию OnDraw.
Это не правильно. Как уже отмечали другие, 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
к вашему стилю диалога.