![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Krjuger |
![]()
Сообщение
#1
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Собственно,есть проэкт в VS 2008 C++,у фрейма есть кнопка и picturebox.По нажатии на кнопку должна отрисоваться сетка из прямоугольников.(100х100 где то) Дело в том что после нажания кнопки происходит отрисовка,но по завершению результат пропадает,приходится нажимать 2 раз,и тогда от нормально и длительно отображается,хотя иногда тоже пропадает.Мне непонятно почему такое может происходить??Еще мне немного не нравится та скорость,с которой происходит отрисовка,можно ли ее как нибудь ускорить?Дело в том,что потом для каждой "клетки" будет задаваться свой собственный цвет.
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
const int N=100;
double size=1.0;
double x,y;
double h=size/N;
double Xkoef= (pictureBox1->Width)/size;
double Ykoef= (pictureBox1->Height)/size;
Graphics^ g = pictureBox1->CreateGraphics();
Pen^ bluePen = gcnew Pen( Color::Blue,1.0f );
SolidBrush^ hBrush = gcnew SolidBrush (Color::Red);
for ( int i=1 ; i<=N ; i++)
{
for ( int j=0 ; j<=N ; j++)
{
x= (i)*h * Xkoef;
y= (j)*h * Ykoef;
g->FillRectangle( hBrush,Rectangle(x, y,(x + h*Xkoef),(y + h*Ykoef)));
g->DrawRectangle(bluePen,Rectangle(x, y,(x + h*Xkoef),(y + h*Ykoef)));
}
}
}
Сообщение отредактировано: Krjuger - 5.05.2011 18:09 |
![]() ![]() |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Krjuger, тип RectangleF как-то больше подходит для заталкивания в него вещественных значений, чем Rectangle. Опять же, не надо перерасчитывать значения X в цикле по J, результаты будут одинаковыми, вынеси вычисления из внутреннего цикла. Но это так, для проформы. На скорость отрисовки влияния не окажет.
С точки зрения алгоритма - все прекрасно, почему сбоит реализация в VS 2008 - непонятно. Проверил на C# - рисует прямоугольнички как положено, ничего не исчезает. Цитата Еще мне немного не нравится та скорость, с которой происходит отрисовка,можно ли ее как нибудь ускорить? Если б ты не написал ниже, что Цитата потом для каждой "клетки" будет задаваться свой собственный цвет. - то ларчик открывался просто: в цикле заполняешь массив RectangleF[], без отрисовки, а потом одним махом g->FillRectangles + g->DrawRectangles. Выигрыш по скорости очень заметен. Но раз для каждой клетки - свой цвет, то можно сэкономить на одной из отрисовок. В цикле делаешь g->FillRectangle, и запоминаешь область. А потом, после циклов - опять же один вызов g->DrawRectangles, и тебе все клеточки обведутся... |
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 12:48 |