Полноэкранное приложение и обработка кликов на полном экране в 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 Кб)
12.05.2012, 23:04 [10868 просмотров]