С++.Рисование с WinAPI.В чем разница между способами?
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-26 19:42:55.720000
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Вопрос прост и неумен,но времени совсем нет,спрашиваю везде где могу. Нужно мне рисовать при помощи WinAPI. Сделал как обычно и работало(куда ни пихани код): void DrawR(int x,int y,int r,HWND wnd) { HDC canvas; HPEN pen; PAINTSTRUCT pst; canvas=GetDC(wnd); pen=CreatePen(PS_SOLID,2,RGB(0,0,255)); SelectObject(canvas,pen); Ellipse(canvas,x-r,y-r,x+r,y+r); DeleteObject(pen); ReleaseDC(wnd,canvas); } Но мне сказали,что так не покатит(им не так объясняли).Надо сделать с BeginPaint.Переделал,даже в оконную функцию в самый WM_PAINT пихнул: …PAINTSTRUCT ps; HDC hdc HPEN pen;…. case WM_PAINT: hdc = BeginPaint(hDlg, &ps); pen=CreatePen(PS_SOLID,2,RGB(0,0,255)); SelectObject(hdc,pen); Ellipse(hdc,X-R,Y-R,X+R,Y+R); EndPaint(hDlg, &ps); // эти 2 строчки DeleteObject(pen); // я даже местами менял((</font> return TRUE; //соответственно все переменные объявлены/присвоены - все дела Что там оно должно нарисовать.Эффект нулевой.Какого черта?! Укажите пожалуйста на косяк).
|
|
|
RE: С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-27 01:07:47.076666
|
|
|
vvviperrr
Сообщений: 301
Оценки: 0
Присоединился: 2007-03-20 21:33:16.790000
|
void DrawR(int x,int y,int r,HWND wnd) { HDC canvas; HPEN pen; PAINTSTRUCT pst; canvas=GetDC(wnd); pen=CreatePen(PS_SOLID,2,RGB(0,0,255)); SelectObject(canvas,pen); Ellipse(canvas,x-r,y-r,x+r,y+r); DeleteObject(pen); ReleaseDC(wnd,canvas); } case WM_PAINT: hdc = BeginPaint(hWnd, &ps); DrawR(100,100,50,hWnd); EndPaint(hWnd, &ps); break; все работает
|
|
|
RE: С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-27 12:25:24.910000
|
|
|
redsh
Сообщений: 338
Оценки: 0
Присоединился: 2007-06-17 22:35:25.540000
|
система посылает твоей проге мессагу WM_PAINT если нужно перерисовать окно (например, если его часть до этого была закрыта другим окном). обрабатываем так: case WM_PAINT:
hdc = BeginPaint(hWin, &ps);
// здесь рисуем
Ellipse(hdc, 100, 100, 200, 200);
EndPaint(hWin, &ps);
return 0; // (TRUE - если CreateDialog/DialogBox)
также можно рисовать с помощью GetDC, но тогда если твоё окно будет частично закрыто другим, всё что будет под ним, сотрётся, способ имеет смысл при частой перерисовке по таймеру.
|
|
|
RE: С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-27 18:01:45.606666
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Ой,все,всем спасибо!! Позорище такое оказалось((. Я параметры рисунка считывал в одном месте оконной функции,а юзал в WM_PAINT. Переменные локальные…Кароч,программировать надо токо проспавшись((. Извиняюсь что раньше не сообразил.
|
|
|
RE: С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-28 14:06:34.106666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Genco, у тебя есть недоработка. Ты удаляешь кисть, которая установлена в контексте устройства. Почитай мсдн, тама немного про жто написано. Прежде чем вызывать DeleteObject(pen); нужно в контекст устройства установить предыдущий "pen", например:
HPEN oldPen = (HPEN)SelectObject( hDC, hPen );
// рисуем
SelectObject( hDC, oldPen );
DeleteObject( hPen ); и не делай так, как тебе vvviperrr посоветовал. Если рисуешь по WM_PAINT - то контекст устройства, в который ты будешь рисовать, получай через BeginPaint, если рисуешь просто так - то тошда GetDC.
|
|
|
RE: С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-28 15:22:23.636666
|
|
|
vvviperrr
Сообщений: 301
Оценки: 0
Присоединился: 2007-03-20 21:33:16.790000
|
2_SaZ_ я это не советовал) просто его же код скопипастил. насчет отключения объектов от контекста спасиб, недавно с этим попал )
|
|
|
RE: С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-28 16:18:54.516666
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Не,1-й код я вызывал нормально,в "кнопочке"). А вот про старое перо - пасиба,не знал.
|
|
|
|
|