Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

С++.Рисование с WinAPI.В чем разница между способами?

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> С++.Рисование с WinAPI.В чем разница между способами?
Имя
Сообщение << Старые топики   Новые топики >>
С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-26 19:42:55.720000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Вопрос прост и неумен,но времени совсем нет,спрашиваю везде где могу. Нужно мне рисовать при помощи WinAPI. Сделал как обычно и работало(куда ни пихани код):
void&nbsp;DrawR(int x,int y,int r,HWND wnd)&nbsp;&nbsp;&nbsp;&nbsp;
{
HDC canvas;
HPEN pen;
PAINTSTRUCT pst;
canvas=GetDC(wnd);
pen=CreatePen(PS_SOLID,2,RGB(0,0,255));
SelectObject(canvas,pen);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Ellipse(canvas,x-r,y-r,x+r,y+r);
DeleteObject(pen);&nbsp;&nbsp;&nbsp;
ReleaseDC(wnd,canvas);
}
Но мне сказали,что так не покатит(им не так объясняли).Надо сделать с BeginPaint.Переделал,даже в оконную функцию в самый WM_PAINT пихнул:
&nbsp;&nbsp; …PAINTSTRUCT ps;
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;HDC hdc
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HPEN pen;….
case WM_PAINT:
&nbsp;hdc = BeginPaint(hDlg, &amp;ps);&nbsp;
&nbsp;pen=CreatePen(PS_SOLID,2,RGB(0,0,255));
&nbsp;SelectObject(hdc,pen);
&nbsp;Ellipse(hdc,X-R,Y-R,X+R,Y+R);
&nbsp;EndPaint(hDlg, &amp;ps); // эти 2 строчки
&nbsp;DeleteObject(pen);&nbsp;&nbsp; // я даже местами менял((&lt;/font&gt;
return TRUE; //соответственно все переменные объявлены/присвоены - все дела
Что там оно должно нарисовать.Эффект нулевой.Какого черта?! Укажите пожалуйста на косяк).
Post #: 1
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;


все работает
Post #: 2
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, но тогда если твоё окно будет частично закрыто другим, всё что будет под ним, сотрётся, способ имеет смысл при частой перерисовке по таймеру.
Post #: 3
RE: С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-27 18:01:45.606666   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Ой,все,всем спасибо!! Позорище такое оказалось((. Я параметры рисунка считывал в одном месте оконной функции,а юзал в WM_PAINT. Переменные локальные…Кароч,программировать надо токо проспавшись((. Извиняюсь что раньше не сообразил.
Post #: 4
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.
Post #: 5
RE: С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-28 15:22:23.636666   
vvviperrr

Сообщений: 301
Оценки: 0
Присоединился: 2007-03-20 21:33:16.790000
2_SaZ_ я это не советовал) просто его же код скопипастил. насчет отключения объектов от контекста спасиб, недавно с этим попал )
Post #: 6
RE: С++.Рисование с WinAPI.В чем разница между способами? - 2008-03-28 16:18:54.516666   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Не,1-й код я вызывал нормально,в "кнопочке"). А вот про старое перо - пасиба,не знал.
Post #: 7
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> С++.Рисование с WinAPI.В чем разница между способами?







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.