2013-07-03 2 views
0

Я новичок в MFC и окна программирования в целом, и это что-то я не понял
Везде, где я читал это говорит не использовать CClientDC в OnPaint и использовать только CPaintDC
В моем коде, я прилагаю мой прямоугольник функции рисования по умолчанию, созданный OnPaint() обработчик, когда я делаю приложение MFC диалог, основанный с помощью мастераЧто произойдет, если я использую CClientDC в функции OnPaint()?

void Cgraph_on_dlgboxDlg::OnPaint() 
{ 
    CPaintDC dc(this); // ----------------------------> LINE 1 
    if (IsIconic()) 
    { 
     // CPaintDC dc(this); // device context for painting // ----------------------------> LINE 2 

     SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 

     // Center icon in client rectangle 
     int cxIcon = GetSystemMetrics(SM_CXICON); 
     int cyIcon = GetSystemMetrics(SM_CYICON); 
     CRect rect; 
     GetClientRect(&rect); 
     int x = (rect.Width() - cxIcon + 1)/2; 
     int y = (rect.Height() - cyIcon + 1)/2; 

     // Draw the icon 
     dc.DrawIcon(x, y, m_hIcon); 
    } 
    else 
    { 
     CDialogEx::OnPaint(); 
    } 

    COLORREF pencolour = RGB(0, 0, 0); 
    COLORREF brushcolour = RGB(0, 0, 255); 
    CPen pen(PS_SOLID, 5, pencolour); 
    CBrush brush(HS_CROSS, brushcolour); 
    // CPaintDC Dc(this);  // ----------------------------> LINE 3 
    // CClientDC Dc(this);  // ----------------------------> LINE 4 
    dc.SetBkMode(TRANSPARENT); 
/**** 
get rectangle coordinates and properties 
****/ 
    dc.Rectangle(CRect(point1, point2)); 
} 

в этом коде, изначально LINE 1 не существует. В этом случае программа рисует прямоугольник, если CClientDC объявлен в LINE 4, но ничего не рисует в CPaintDC в LINE 3. Если CPaintDC в LINE 2 удаляется до LINE 1, а LINE 3 и 4 закомментированы, он работает. Почему это происходит? Из того, что я понял, CClientDC вообще не должен работать, или я чего-то не хватает?
Опять же, не следует ли CPaintDC в LINE 2 иметь область действия только в блоке if? Почему объявление CPaintDC дважды не создает никакого вывода?

+1

'Важно использовать' CPaintDC' в обработчике 'OnPaint', потому что он автоматически вызывает' BeginPaint' и 'EndPaint' во время ctor/dtor. Если вы этого не сделаете, ваше приложение будет залито сообщениями WM_PAINT, потому что грязный прямоугольник никогда не будет проверен. Вы должны * никогда не создавать более одного «CPaintDC», потому что он снова вызовет «BeginPaint», что недействительно. –

ответ

1

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

Код по умолчанию создает CPaintDC только в строке 2, потому что он не будет вызывать CDialogEx :: OnPaint, когда диалог свернут. Когда диалог не свернут, CDialogEx :: OnPaint построит CPaintDC. Один и только один CPaintDC можно использовать для любого частного вызова OnPaint.

Вы можете использовать CClientDC для рисования вашего прямоугольника, если вы оставите исходное обращение с CPaintDC так, как было.

Смежные вопросы