БлогNot. Полноэкранное приложение и обработка кликов на полном экране в C++ Builder

Полноэкранное приложение и обработка кликов на полном экране в C++ Builder

Понадобилось сегодня в учебных целях. Во-первых, как сделать полноэкранную форму в C++ Builder. В инете много мифов, что для этого нужен непременно OpenGL или DirectX, на самом деле достаточно в Инспекторе Объектов поменять 2 свойства формы:

Form1->BorderStyle = bsNone;
Form1->WindowState = wsMaximized;

Потом кидаем на форму компонент TImage и ставим ему свойство

Image1->Align = alClient;

Во-вторых, как избежать мерцания при перерисовках. Можно найти массу решений с использованием кучи функций Windows API, но в Билдере обычно хватает следующего:

void __fastcall TForm1::FormCreate(TObject *Sender) {
 Form1->DoubleBuffered = true;
}

Третья типовая проблема - как обработать координаты мыши при щелчке по рисунку, ведь в обработчик Image1Click они не передаются? В принципе, это легко сделать:

void __fastcall TForm1::Image1Click(TObject *Sender) {
 TPoint CursorPos; GetCursorPos(&CursorPos);
 //Делаем что-то с CursorPos.x, CursorPos.y
}

- но зачем это нужно, если есть Image1MouseDown и Image1MouseUp - нажатие и отпускание кнопки мыши? Давайте рассмотрим простейшую жизненную ситуацию - если клик был "с протягом", то есть, координаты отпускания отличаются от координат нажатия кнопки мыши, то рисуется нечто, например, эллипс, в той области, которую мы "протянули", а если клик был точно на месте или "протяг" оказался слишком маленьким (меньше заданного значения r), то рисуется эллипс с центром в точке клика (или этого слишком маленького протяга).

int x1,y1,x2,y2;

//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y) {
 if (Button == mbRight) Application->Terminate(); //Выход по правой кнопке
 x1=X; y1=Y; //Координаты нажатия мыши
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y) {
 int r=20; //Минимально допустимый радиус
 x2=X; y2=Y; //Координаты отпускания мыши
 TCanvas *Canvas = Image1->Canvas; //Канва рисунка
 TColor Color=(TColor)random (0x7fffffff); //Случайный цвет
 Canvas->Brush->Color = Color;
 TBrushStyle Style = (TBrushStyle)random(8); //Случайный стиль заполнения
 if (Style==bsClear) Style=bsSolid;
 Canvas->Brush->Style = Style;
 int Width=abs(x2-x1), Height=abs(y2-y1), x=min(x1,x2), y=min(y1,y2); //Нужные размеры
 if (Width<2*r) { Width=2*r; x=(x1+x2)/2-r; }   //Щелчок "на месте" -
 if (Height<2*r) { Height=2*r; y=(y1+y2)/2-r; } //делаем минимальные размеры
 Canvas->Ellipse(x,y,x+Width,y+Height); //Отрисовка
}

Чтобы в С++ Builder работала функция min, нужно подключить к модулю

#include <algorithm.h>

Из листинга также видно, что выход из приложения будет по нажатию правой кнопки мыши, ну и по Alt+F4, конечно.

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


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

12.05.2012, 23:04; рейтинг: 9582