Здравствуйте, Mag, Вы писали:
Mag>Что-то я торможу... Имея, объект Graphics можно нарисовать линию (DrawLine), но нельзя сделать SetPixel, странно... Или я не прав?
Прав, конечно!
Дело в том, что Graphics отвязан от устройства, на котором он, в конечном счете, будет рисовать. А пиксели — это device-dependent штука, вот в точечном рисунке (Bitmap) они есть — там и SetPixel есть. Кстати, именно поэтому в GDI+ нет растровых операций.
На самом деле, нарисовать пиксель в GDI+ можно:
pGraphics->SetPageUnit(PixelUnit);
pGraphics->FillRectangle(&SolidBrush(...), Rect(x, y, 1, 1));
Причем именно FillRectangle, DrawRectangle не поможет.
Здравствуйте, AndreyFedotov, Вы писали:
AF>Здравствуйте, Mag, Вы писали:
Mag>>Так мне не охото к обычному GDI возвращаться...
AF>Тогда придётся возиться с функциями Bitmap, как уже предлагалось. AF>Скобки:
AF>
AF>hDC = Gr.GetHDC()
AF>SetPixel( hDC, x, y, color );
AF>ReleaseDC( hDC );
AF>
AF>По-моему дешевле...
Тоже хорошее решение. Но мне больше приглянулось решение Олега Харитонова — единичный закрашенный прямоугольник.
Здравствуйте, Mag, Вы писали:
Mag>Что-то я торможу... Имея, объект Graphics можно нарисовать линию (DrawLine), но нельзя сделать SetPixel, странно... Или я не прав?
Увы... Прав... Как нет и GetPixel. Но зачем она тебе?
Вообще то, как мне кажется, если она потребовалось — что то скорее всего программ спроектирована не особо удачно.
Посмотри — возможно что-то можно сдлать иначе.
И если всё- таки надо, то:
Graphics имеет в своём составе GetHDC: получаешь контекст изображения и SetPixel'ишь его маниакально...
Только не забудь его потом отпустить...
Вообще советую посмтреть в MSDN — там даже пример есть, довольно хороший.
С Уважением, Андрей
Здравствуйте, AndreyFedotov, Вы писали:
AF>Здравствуйте, Mag, Вы писали:
Mag>>Что-то я торможу... Имея, объект Graphics можно нарисовать линию (DrawLine), но нельзя сделать SetPixel, странно... Или я не прав?
AF>Увы... Прав... Как нет и GetPixel. Но зачем она тебе?
Отрисовка у меня идёт по WM_PAINT'у (C#). Необходимо отрисовывать точки некоего графика.
AF>Вообще то, как мне кажется, если она потребовалось — что то скорее всего программ спроектирована не особо удачно.
Возможно. Есть ещё вариант отрисовывать на Image'е, но не очень удобно, т.к. отрисовка многослойная и динамичная.
AF>Посмотри — возможно что-то можно сдлать иначе.
Подумаю... Пока реализовал единичным элипсом.
AF>И если всё- таки надо, то: AF>Graphics имеет в своём составе GetHDC: получаешь контекст изображения и SetPixel'ишь его маниакально... AF> Только не забудь его потом отпустить... AF> Вообще советую посмтреть в MSDN — там даже пример есть, довольно хороший.
Так мне не охото к обычному GDI возвращаться...
Здравствуйте, Mag, Вы писали:
Mag>Здравствуйте, AndreyFedotov, Вы писали:
AF>>Здравствуйте, Mag, Вы писали:
Mag>>>Так мне не охото к обычному GDI возвращаться...
AF>>Тогда придётся возиться с функциями Bitmap, как уже предлагалось. AF>>Скобки:
AF>>
AF>>hDC = Gr.GetHDC()
AF>>SetPixel( hDC, x, y, color );
AF>>ReleaseDC( hDC );
AF>>
AF>>По-моему дешевле... Mag>Тоже хорошее решение. Но мне больше приглянулось решение Олега Харитонова — единичный закрашенный прямоугольник.
Согласен. Если точек — мало и если нужна возможность увеличить их размер, то его решение — лучше. Правда в этом случае — может быть лучше окружность 1-го радиуса... Но вот если точек может быть много — то SetPixel — быстрее, однозначно...
Здравствуйте, AndreyFedotov, Вы писали:
Mag>>>>Так мне не охото к обычному GDI возвращаться... AF>>>Тогда придётся возиться с функциями Bitmap, как уже предлагалось.
Вот Bitmap.SetPixel() точно очень медленная штука, проверено. Мы с этим столкнулись в нашем проекте. Пришлось отказаться от SetPixel и использовать LockBits(). Это если строго в рамках GDI+.
AF>Согласен. Если точек — мало и если нужна возможность увеличить их размер, то его решение — лучше. Правда в этом случае — может быть лучше окружность 1-го радиуса... Но вот если точек может быть много — то SetPixel — быстрее, однозначно...
Насчет сравнения сокростей GDI и GDI+, то тут пока не проведешь замеры сказать ничего нельзя. В ряде случаев, к моему удивлению GDI+ делает GDI, причем там, где вроде бы должна притормаживать. Я конкретно для SetPixel/FillRectangle замеры не делал, но могу сказать, что если число точек не превышает сотен тысяч, то за производительность можно быть спокойным.