Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Помогите разобраться с классом для рисования


Автор: Melevir 13.3.2010, 10:14
Всем доброго времени суток! 
Нужна помощь. Пишу класс, которому передаешь окно (CWnd), а он на нем рисует график. Проблема в том, что я не могу разобраться с CPaintDC. Как я понял, в каждом методе класса его создавать нельзя, он должен быть одним из полей. А вот как с ним обращаться тогда.. Подскажите пожалуйста.
Код

class PolarGraph
{
private:
    CWnd* pWnd;
    CPaintDC dc();
    int Ax;
    int Ay;
    int Bx;
    int By;
    void DrawRect();
    void DrawAxis();
public:
    PolarGraph(CWnd* pWnd, int Ax, int Ay, int Bx, int By);
};

PolarGraph::PolarGraph(CWnd* pWnd, int Ax, int Ay, int Bx, int By)
{

    this->Ax=Ax;
    this->Ay=Ay;
    this->Bx=Bx;
    this->By=By;
    this->pWnd=pWnd;
    CPaintDC* dc = new CPaintDC(pWnd);

    DrawRect();
    DrawAxis();
}

void PolarGraph::DrawRect()
{
    //CPaintDC dc(pWnd);
    dc.MoveTo(Ax,Ay);
    dc.LineTo(Bx,Ay);
    dc.LineTo(Bx,By);
    dc.LineTo(Ax,By);
    dc.LineTo(Ax,Ay);
}

void PolarGraph::DrawAxis()
{
    //CPaintDC dc(pWnd);
    dc.MoveTo(Ax+(Bx-Ax)*0.05,Ay+(By-Ay)*0.5);
    dc.LineTo(Ax+(Bx-Ax)*0.95,Ay+(By-Ay)*0.5);
    //pWnd->Invalidate();    
}

При такой реализации ругается 
Код

Error    1    error C2228: left of '.MoveTo' must have class/struct/union

Если в каждой функции создавать CPaintDC, то будет рисоваться только первая из двух вызванных (DrawRect()).

Автор: mes 13.3.2010, 17:28
Цитата(Melevir @  13.3.2010,  09:14 Найти цитируемый пост)
Пишу класс, которому передаешь окно (CWnd), а он на нем рисует график

Логичнее  передавать не CWnd, a CPaintDC ..


Автор: Melevir 14.3.2010, 09:16
Гениально, черт побери! Спасибо!smile
А все же если так делать, то как? Мало ли что еще мне от формы понадобится..

Автор: Earnest 16.3.2010, 08:40
Цитата(Melevir @  13.3.2010,  11:14 Найти цитируемый пост)
Проблема в том, что я не могу разобраться с CPaintDC. Как я понял, в каждом методе класса его создавать нельзя, он должен быть одним из полей

CPainDC нужно создавать только в одном месте -  в методе OnPaint. В других местах - бесполезно. Держать членом класса тоже бессмысленно.
В остальные методы (вызываемые из OnPaint) лучше передавать не CPaintDC, а базовый CDC: это даст больше гибкости, в частности, можно будет в любой момент перейти к рисованию во внеэкранном буфере и т.д.
Схема работы такая:

void CMyWnd::OnPaint()
{
   CPaintDC dc (this);
   DrawSomething (dc);
   DrawSomethingElse (dc);


При этом методы Draw... объявлены так:
   void DrawSomething (CDC&);

Автор: Melevir 18.3.2010, 23:58
Спасибаsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)