БлогNot. Если OnResize "не работает"...

Если OnResize "не работает"...

Типовая ситуация в коде начинающих (Delphi или C++ Builder) - нечто рисуется на канве формы по пикселам, а для обновления рисунка при изменении размеров окна приложения создаётся обработчик события OnResize, который должен обновить рисунок... но обновляется только "вновь появившаяся" при увеличении окна часть или вовсе ничего не обновляется :)

Во-первых, метод перерисовки окна и так вызовется при изменении его размеров, так что принудительно делать ничего не надо. Во-вторых, если нам нужно просто перерисовать всё окно, в обработчике события OnResize достаточно вызвать метод Invalidate Вашей формы, который даст запрос на перерисовку, а уже этот запрос будет выполнен в "правильный" момент по системному сообщению WM_PAINT.

Вот законченный пример, рисующий на форме плавные чёрно-белые градиенты с центром в точке клика мышью (сначала центр равен центру формы). Все основные действия пояснены в коде:

#include <math.h> //для вычисления степени и корня
#define max(a, b)  (((a) > (b)) ? (a) : (b))
int cx,cy; //координаты центра градиента

float dist (int x1, int y1, int x2, int y2) { //Расстояние между точкой и центром
 return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}

void __fastcall TForm1::FormClick(TObject *Sender) { //Событие OnClick формы
 float scale=sqrt(pow(Form1->ClientWidth,2)+pow(Form1->ClientHeight,2));
  //Наибольшее возможное расстояние = диагонали окна формы
 unsigned int r,z;
 for (int x=0; x<Form1->ClientWidth; x++)
 for (int y=0; y<Form1->ClientHeight; y++) {
  r=dist (x,y,cx,cy); //Считаем расстояние от очередного пиксела до центра
  z=r*255./scale; //Интенсивность цвета пропорциональна ему
  Form1->Canvas->Pixels[x][y]=(TColor)RGB(z,z,z); //выводим пиксел
 }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender) {
 //Событие OnCreate формы - инициализируем центр градиента в центре формы
  cx = Form1->ClientWidth/2;
  cy = Form1->ClientHeight/2;
  Form1->DoubleBuffered=true; //На всякий случай вкл.двойную буферизацию
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y) {
 //Событие OnMouseDown формы - переопределяем центр
 cx=X; cy=Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender) {
 //Событие OnPaint формы - вызвать метод перерисовки
 this->FormClick(Form1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender) {
 //Событие OnResize формы - сказать, что будем перерисовывать
 Form1->Invalidate();
}

 Скачать этот пример в виде архива ZIP с проектом C++ Builder (4 Кб)

24.09.2013, 13:12 [10992 просмотра]


теги: программирование c++ графика builder

К этой статье пока нет комментариев, Ваш будет первым