Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить линию на CClientDC 
:(
    Опции темы
DissDoc
  Дата 15.10.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Добрый вечер. Не знаю как удалить последнюю нарисованную прямую линию? Ну совершенно простой случай
Код

CCleintDC* lpDC;
CPen* lpPen;

lpPen = new CPen(прямая, 1, RGB(200, 0, 0));
lpDC->SelectObject(lpPen);
lpDC->MoveTo(point.x, point.y);
lpDC->LineTo(100, 100);

// Вот например тут как сразу же удалить эту линию????

Вот, все флаги расставляю на проверки. Осталось сделать вот что
если мы еще раз нажимаем на левую кнопку и ведем мышь, то последняя нарисованная линия удаляется. Все проверки сделал! Осталось только
удалить последнюю нарисованную линию. КАК?
PM MAIL WWW   Вверх
_hunter
Дата 16.10.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



самый простой способ -- копировать текущее изображение (перед отрисовкой линии) в битмапу и потом рисовать это мапу


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
DissDoc
Дата 16.10.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Я попробую иначе поставить вопрос. Вспоминаем Paint. Там когда выбираешь линию, то нажимая на левую клавишу мыши и водя курсором по экрану - линия то увеличивается в размерах, то уменьшается, то меняет угол поворота, при этом линия на экране всего одна! И только после отпускания клавиши мыши на экране "рисуется" линия "навсегда".
Я тоже самое хочу изобразить, а меня предыдущие линии не удаляются (((
Вот мой код
Код

CClientDC* lpDC;
CPen *lpPen;
BOOL bCorrect = FALSE;
int x, y;


OnLButtonDown(..., point)
{
    lpPen = new CPen(..., ..., ...);
    lpDC->SelectObject(lpPen);
    lpDC->MoveTo(point.x, point.y);
    x = point.x; y = point.y;
    bCorrect = TRUE;
}

OnMouseMove(..., point)
{
    if(bCorrect)
    {
        lpDC->LineTo(point.x, point.y);
        lpDC->MoveTo(x, y);
    }
}

Вот тут у меня получается куча прямых вместо одной, что делать - не знаю (((
PM MAIL WWW   Вверх
_hunter
Дата 16.10.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



и что это меняет?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
vinter
Дата 16.10.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



линии тут нет, зато есть прямоугольник, линию делать по аналогии
Код

void CPaintTool::PaintLBDown(CClientDC &dc)
{
    CBrush newBrush(m_Color), *OldBrush, BrushErase(RGB(255, 255, 255));
    int OldMode = dc.SetROP2(R2_COPYPEN);
    rect.top = point.y;
    rect.left = point.x;
    rect.bottom = point.y + 15;
    rect.right = point.x + 15;
    CPen newPen, *OldPen, newBrushPen;
    CBrush  BrushFill(m_Color);
    newPen.CreatePen(PS_SOLID, 1, m_Color);
    newBrushPen.CreatePen(PS_SOLID, 20, m_Color);
    OldPen = dc.SelectObject(&newBrushPen);
    OldBrush = dc.SelectObject(&newBrush);
    switch(CMainFrame::m_nIDPaint)
    {
    case ID_BUTTON_PEN:
        dc.SelectObject(&newPen);
        m_PenCoord.x = point.x;
        m_PenCoord.y = point.y;
        dc.MoveTo(m_PenCoord);
        dc.LineTo(m_PenCoord);
        break;
    case ID_BUTTON_BRUSH:
        m_BrushCoord.x = point.x;
        m_BrushCoord.y = point.y;
        dc.MoveTo(m_BrushCoord);
        dc.LineTo(m_BrushCoord);    
        break;
    case ID_BUTTON_RECT:
    case ID_BUTTON_ELLIPSE:
        m_CurCoord.left = m_CurCoord.right = point.x;
        m_CurCoord.top = m_CurCoord.bottom = point.y;
        break;
    case ID_BUTTON_FILL:
        dc.SelectObject(&BrushFill);
        dc.ExtFloodFill(point.x, point.y,dc.GetPixel(point), FLOODFILLSURFACE);
        break;
    case ID_BUTTON_GETCOL:
        m_Color = dc.GetPixel(point);
        break;
    case ID_BUTTON_AIRBRUSH:
        srand( (unsigned)time( NULL ) );
        for(int i = 0; i < 20; i++)
        {
            dc.SetPixel(CData::MyRandom(point.x, point.x + 20), CData::MyRandom(point.y, point.y + 20 ), m_Color);
        }
        break;
    case ID_BUTTON_ERASE:
        dc.FillRect(&rect, &BrushErase);
        break;

    }
    dc.SelectObject(OldPen);
    dc.SelectObject(OldBrush);
    dc.SetROP2(OldMode);
}

Код

void CPaintTool::PaintLBUp(CClientDC &dc)
{
    int OldMode = dc.SetROP2(R2_COPYPEN);
    CBrush newBrush, *OldBrush,  BrushErase(RGB(255, 255, 255));
    CPen newPen, *OldPen, newBrushPen, newRectPen;
    newRectPen.CreatePen(PS_SOLID, 2, m_Color);
    newPen.CreatePen(PS_SOLID, 1, m_Color);
    newBrushPen.CreatePen(PS_SOLID, 20, m_Color);
    OldPen = dc.SelectObject(&newBrushPen);
    OldBrush = dc.SelectObject(&newBrush);
    rect.top = point.y;
    rect.left = point.x;
    rect.bottom = point.y + 15;
    rect.right = point.x + 15;
    switch(CMainFrame::m_nIDPaint)
    {
    case ID_BUTTON_RECT:
        dc.SelectObject(&newRectPen);
        dc.SetROP2(R2_NOTXORPEN);
        dc.Rectangle(&m_CurCoord);
        m_CurCoord.right = point.x;
        m_CurCoord.bottom = point.y;
        dc.Rectangle(&m_CurCoord);
        break;
    case ID_BUTTON_ELLIPSE:
        dc.SelectObject(&newRectPen);
        dc.SetROP2(R2_NOTXORPEN);
        dc.Ellipse(&m_CurCoord);
        m_CurCoord.right = point.x;
        m_CurCoord.bottom = point.y;
        dc.Ellipse(&m_CurCoord);
        break;
    case ID_BUTTON_ERASE:
            dc.FillRect(&rect, &BrushErase);
        break;
    }
    dc.SelectObject(OldPen);
    dc.SelectObject(OldBrush);
    dc.SetROP2(OldMode);
}

Код

void CPaintTool::PaintMouseMove(CClientDC &dc)
{
        int OldMode = dc.SetROP2(R2_COPYPEN);
        CBrush newBrush, *OldBrush, BrushErase(RGB(255, 255, 255));
        CPen newPen, *OldPen, newBrushPen, newRectPen;
        newRectPen.CreatePen(PS_SOLID, 2, m_Color);
        newPen.CreatePen(PS_SOLID, 1, m_Color);
        newBrushPen.CreatePen(PS_SOLID, 20, m_Color);
        OldPen = dc.SelectObject(&newBrushPen);
        OldBrush = dc.SelectObject(&newBrush);
        switch(CMainFrame::m_nIDPaint)
        {
        case ID_BUTTON_PEN:
            dc.SelectObject(&newPen);
            dc.MoveTo(m_PenCoord);
            dc.LineTo(point);
            m_PenCoord.x = point.x;
            m_PenCoord.y = point.y;
            break;
        case ID_BUTTON_BRUSH:
            dc.MoveTo(m_BrushCoord);
            dc.LineTo(point);    
            m_BrushCoord.x = point.x;
            m_BrushCoord.y = point.y;
            break;
        case ID_BUTTON_RECT:
            dc.SelectObject(&newRectPen);
            dc.SetROP2(R2_NOTXORPEN);
            dc.Rectangle(&m_CurCoord);
            m_CurCoord.right = point.x;
            m_CurCoord.bottom = point.y;
            dc.Rectangle(&m_CurCoord);
            break;
        case ID_BUTTON_ELLIPSE:
            dc.SelectObject(&newRectPen);
            dc.SetROP2(R2_NOTXORPEN);
            dc.Ellipse(&m_CurCoord);
            m_CurCoord.right = point.x;
            m_CurCoord.bottom = point.y;
            dc.Ellipse(&m_CurCoord);
            break;
        case ID_BUTTON_AIRBRUSH:
            srand( (unsigned)time( NULL ) );
            for(int i = 0; i < 20; i++)
            {
                dc.SetPixel(CData::MyRandom(point.x, point.x + 20), CData::MyRandom(point.y, point.y + 20 ), m_Color);
            }
            break;
        case ID_BUTTON_ERASE:
            dc.FillRect(&rect, &BrushErase);
            rect.top = point.y;
            rect.left = point.x;
            rect.bottom = point.y + 15;
            rect.right = point.x + 15;
            break;

        }
        dc.SelectObject(OldPen);
        dc.SelectObject(OldBrush);
        dc.SetROP2(OldMode);
}



Это сообщение отредактировал(а) vinter - 16.10.2006, 16:36


--------------------
Мой блог
PM MAIL WWW   Вверх
DissDoc
Дата 16.10.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Прямоугольник даже лучше ))) Я хотел от линии сделать прямогольник )) Спасибки огромные =)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0829 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.