Если 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 [11047 просмотров]