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