Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.19.251] |
|
Сообщ.
#1
,
|
|
|
Как правильно создавать и удалять объекты, с помощью которых рисуется что либо
Например //Создаем объект карандаш. CPen cCurrentPen; cCurrentPen.CreatePen(0,2,COLOR); DC.SelectObject(cCurrentPen); //Тут рисуем что-то ...... //Тут рисуем что-то //Удаляем карандаш DC.DeleteDC(cCurrentPen);//можно так DeleteObject(cCurrentPen);// а можно и так cCurrentPen.DeleteObject();// или так Какое из этих трех способов правильное и наиболее предпочтительнее или может еще что есть |
Сообщ.
#2
,
|
|
|
Можно по-разному, но лучше в основном полагаться на деструкторы, т.е вообще ничего не писать для удаления. Есть, правда, нюансы. Один из них: не осталяй объекты выбранными в контекст устройства
|
Сообщ.
#3
,
|
|
|
2Z@:
DeleteObject(SelectObject(cCurrentPen)); Именно это и сказал "мастер кода" ;D 2Александр: Не злись за обзывательство! |
Сообщ.
#4
,
|
|
|
2SUnteXx: Не так я сказал. Прочитай ещё раз!
Вот примеры корректного кода: void CPopupIndicator::OnPaint() { CPaintDC dc(this); // device context for painting CBrush brBack(RGB(200, 200, 200)); CBrush* pBrOld = dc.SelectObject(&brBack); dc.SelectStockObject(NULL_PEN); CRect rc; GetClientRect(&rc); dc.Rectangle(rc.left,rc.top,rc.right+1,rc.bottom+1); if(m_hIcon) { DrawIconEx(dc.GetSafeHdc(), 1, 1, m_hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, 0, DI_NORMAL); } else { HICON hIcon = ((CLCDlg*)(AfxGetApp()->GetMainWnd())) ->CreateLangCorrespondingSystrayIcon(); DrawIconEx(dc.GetSafeHdc(), 1, 1, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, 0, DI_NORMAL); DestroyIcon(hIcon); } dc.SelectObject(pBrOld); } void CReplaceTip::OnPaint() { CPaintDC dc(this); // device context for painting CBrush brBack; brBack.CreateSolidBrush(GetSysColor(COLOR_INFOBK)); CRect rc; GetClientRect(&rc); CString strText; GetWindowText(strText); dc.SelectStockObject(DEFAULT_GUI_FONT); dc.SetBkMode(TRANSPARENT); dc.SetTextColor(GetSysColor(COLOR_INFOTEXT)); dc.FillRect(&rc, &brBack); rc.OffsetRect(2, 0); dc.DrawText(strText, -1, &rc, DT_LEFT); // Do not call CWnd::OnPaint() for painting messages } |