|
Pers.narod.ru. Обучение. Примеры по 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 Кб)
|
|