2014-11-21 9 views
1

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

Моя декларация выходит что-то вроде этого:

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 запускаться вообще ... Может ли кто-нибудь просветить, правильно ли этот метод?

Спасибо!

+0

'OnPaint' /' OnDraw' в первую очередь (если не исключительно) для * просмотров *. Обычно вы не хотите связываться с рисунком непосредственно в диалоговом окне - вы хотите поместить элементы управления в диалог, и они должны рисовать в своих областях, и пусть остальная часть диалога позаботится о себе. –

+0

Моя мотивация для этого, так как я следую руководству по удалению мерцания на экране. http://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC –

ответ

1

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

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

0

Неправильно. Как отмечали другие, 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 в диалоговом стиле.