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


Автор: PandaRus 13.12.2007, 20:41
Сейчас кое-как справился с примером програмки по книжке VC++. Программа представляет собой Виндоуз-приложение, где можно рисовать квадратики-кружки разных цветов.


Мне желательно написать программу, где будет на листе заранее нарисована сетка, и я буду разукрашивать квадратики сетки в разные цвета. После чего цвет каждого квадрата должен перевестись в какое-то число и присвоится переменной.

В идеале вижу процесс рисования как создание пиктограмм на кнопках панелей: размер кисти имеет размер ячейки или больши и при перемещении мыши перескакивает с ячеки на ячейку... Но в это в идеале.

Для начала я хотел бы узнать
-какие есть функции для преобразования цвета в число
-я нарисовал стационарную сетку, как по щелчку мыши на отрезке сетки, менять цвет отрезка.

Да, и есть ли спецальные программы для создания приложений для рисования? тогда было-бы наверно проще?

Автор: DigitSphinx 13.12.2007, 21:01
ты с делфи перешел?
1-цвет это и есть число
2-азы рисования МФСи :
Код

CDC::MoveTo(x, y);
CDC::LineTo(x,y);
CDC::Rectangle(……);

почитай про 
Код

CDC CBrush CPen CRgn 


Автор: JackYF 13.12.2007, 21:02
Цитата(DigitSphinx @  13.12.2007,  21:01 Найти цитируемый пост)
азы рисования МФСи

*задумчиво* а с чего ты взял, что топикстартер имеет в виду MFC?..

Автор: zkv 13.12.2007, 21:50
Цитата(JackYF @  13.12.2007,  21:02 Найти цитируемый пост)
а с чего ты взял, что топикстартер имеет в виду MFC?.. 

по умолчанию в этом разделе речь идет об MFC.  smile 

Автор: DigitSphinx 13.12.2007, 23:01
Цитата(JackYF @  13.12.2007,  21:02 Найти цитируемый пост)
 а с чего ты взял, что топикстартер имеет в виду MFC?..

Цитата(zkv @  13.12.2007,  21:50 Найти цитируемый пост)
по умолчанию в этом разделе речь идет об MFC.

ну вот да  smile 

Автор: PandaRus 13.12.2007, 23:24
Перешел с Паскаля.

Да, я понимаю, что цвет соответствует числу, сам задавал: RGB(0-255,0-255,0-255). 
Я имею ввиду - нарисовал я линию. Как сделать, чтобы заново считать цвета в различных точках линии и присвоить их переменным (какие есть операторы?)?

Автор: zkv 13.12.2007, 23:28
Цитата(PandaRus @  13.12.2007,  23:24 Найти цитируемый пост)
Как сделать, чтобы заново считать цвета в различных точках линии и присвоить их переменным (какие есть операторы?)? 

ничего не понятно.
объясни другими словами, постарайся выбирать слова, суть которых хорошо понимаешь, операторы тут не при чем.

Автор: PandaRus 13.12.2007, 23:37
Нарисовал, например, я кубик, 10 на 10 пикселей. Разукрасил от белого до красного (вроде RGB(0-255,0,0)). Затем хочу чтобы элементам массива A[10][10] присвоились числа от 0 до 255, соответствующие красному спектру.
Т.е. беру верхний левый угол квадрата - если там белый пиксель, то А[0][0]=0, если красный, то = 255. И так каждый.

Автор: JackYF 13.12.2007, 23:39
 smile 
Цитата(zkv @  13.12.2007,  21:50 Найти цитируемый пост)
по умолчанию в этом разделе речь идет об MFC.  

DigitSphinx,
Миль пардон. Чего-то я недосмотрел... или быстро тему переместили smile

Автор: DigitSphinx 14.12.2007, 00:12
цвет пикселя можно получить
Код

COLORREF GetPixel(
   int x,
   int y 
) const;
COLORREF GetPixel(
   POINT point 
) const;

а из COLORREF RGB можно вытащить так
 
Код

BYTE GetRValue(
  DWORD rgb   // RGB value
);
BYTE GetGValue(
  DWORD rgb     // RGB value
);

BYTE GetBValue(
  DWORD rgb     // RGB value
);


JackYF,  smile 

Автор: PandaRus 14.12.2007, 00:29
Вот так что-ли:
Код

Color=GetPixel (X,Y);
A[i][j]=GetRValue(Color rgb);
?

Не, что-то не так с последней строкой? Что за DWORD?

Автор: DigitSphinx 14.12.2007, 01:51
DWORD т.е. 4-х байтное значение, COLORREF 4-х байтный ))
Код

typedef DWORD COLORREF;

т.е. код вот такой
Код

COLORREF color = DC.GetPixel(x, y);
A[i][j]=GetRValue(Color);


Автор: PandaRus 14.12.2007, 17:25
Не понял что значит DC в DC.GetPixel.


Написал так:
Код

void CSketcherView::OnDraw(CDC* pDC)
{
    CSketcherDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    CPen aPen;
    aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));
    CPen* pOldPen=pDC->SelectObject(&aPen);
    pDC->MoveTo(50,50);
    pDC->LineTo(100,100);

    int A1;
    typedef DWORD COLORREF;
    COLORREF Color;
    Color  = GetPixel( 50, 50 );
    A1=GetRValue(Color);
}


-Ошибка - 
Error    1    error C2660: 'GetPixel' : function does not take 2 arguments    

Автор: DigitSphinx 14.12.2007, 17:49
DC имелось ввиду CDC на которовм рисуем.
Код

COLORREF GetPixel(
  HDC hdc,    // handle to DC
  int nXPos,  // x-coordinate of pixel
  int nYPos   // y-coordinate of pixel
);

т.е. тебе еще надо туда кидать и HDC (если бы ты писал на АПИ) но поскольку ты юзаешь МФСи то надо использовать CDC::GetPixel 
т.е. функцию МФСи, твой код будет таким.
Код

void CSketcherView::OnDraw(CDC* pDC)
{
    CSketcherDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    CPen aPen;
    aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));
    CPen* pOldPen=pDC->SelectObject(&aPen);
    pDC->MoveTo(50,50);
    pDC->LineTo(100,100);

    int A1;//лучше BYTE A1;  экономия памяти так сказать ))
    //typedef DWORD COLORREF; вот это лишнее, это уже давно за тебя сделали ))
    COLORREF Color;
    Color  = pDC->GetPixel( 50, 50 );
    A1=GetRValue(Color);

}

Автор: PandaRus 14.12.2007, 18:08
Большое спасибо - все работает - соответствующие числа красного спектра пошли в мой файл

Автор: DigitSphinx 14.12.2007, 18:16
помечай тему как решенную  smile 

Автор: PandaRus 14.12.2007, 20:33
Новый вопрос появился - как менять цвет кисти?
Нашел функцию:
SetDCPenColor(hdc,RGB(0,0,0))
но опять не понял, как ей пользоваться - писал:
Код

SetDCPenColor(aPen,RGB(0,0,0));

в ответ "CDC не может быть преобразован в HDC".

Как будет правильно? И можно ли кроме цвета менять размер и тип кисти?

Автор: PandaRus 14.12.2007, 21:41
Прошу прощения - воспользовался поиском

Автор: KoliaMor 19.12.2007, 12:32
Подскажите плиз, а то я че-то не догоняю:

Есть массив BYTE* Pixels[W*H*3];

Когда я делаю 
Код

GetBitmapBits(Image1->Picture->Bitmap->Handle, H*W,Pixels);
SetBitmapBits(Image2->Picture->Bitmap->Handle, H*W,Pixels);

 - копирование проходит нормально, а в если напрямую
Код

   for(int h=0;h<H;h++)
      for(int w=0;w<W;w++){
         Pixel[0] = GetRVal(Image1->Canvas->Pixelsp[w][h]);
         Pixel[1] = GetGVal(Image1->Canvas->Pixelsp[w][h]);
         Pixel[2] = GetBVal(Image1->Canvas->Pixelsp[w][h]);
          Pixel += 3;
      }  
       Pixel -= W*H*3];

SetBitmapBits(Image2->Picture->Bitmap->Handle, H*W,Pixels);


- копируется только один цвет.

Как распределяются RGB компоненты в массиве Pixel при использовании GetBitmapBits() ?????

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