forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Наше Open Source Software (http://forum.boolean.name/forumdisplay.php?f=132)
-   -   Процедура рисования кнопки с надписью (http://forum.boolean.name/showthread.php?t=16156)

ProgrammerForever 08.01.2012 20:05

Процедура рисования кнопки с надписью
 
Добрый день.
Выкладываю процедуру для рисования "кнопки". Процедура довольно универсальна, текст располагается точно по центру кнопки. При прорисовке большого числа кнопок не рекомндую последним параметром ставить true, иначе будет неприятный эффект мерцания.
Код:

procedure DrawButton(strText:string;intLeft,intTop,intWidth,intHeight,intBackColorR,intBackColorG,intBackColorB,intTextColorR,intTextColorG,intTextColorB:integer;isFill,isRound:boolean;intArcWidth, intArcHeight:integer;isRepaint:boolean);
var
  TextHeight, TextWidth: integer;            {Размеры текста}
begin
{Процедура рисования кнопки с надписью}
{ ProgrammerForever (c) 2012 }
{ strText      - надпись на кнопке}
{ intLeft      - расстояние от левого края экрана до левого края кнопки. Фактически - X-координата левой верхней точки}
{ intTop        - расстояние от верхнего края экрана до верхнего края кнопки. Фактически - Y-координата левой верхней точки}
{ intWidth      - Ширина кнопки}
{ intHeight    - Высота кнопки}
{ intBackColorR - Красная компонета цвета фона кнопки}
{ intBackColorG - Зелёная компонета цвета фона кнопки}
{ intBackColorB - Синяя компонета цвета фона кнопки}
{ intTextColorR - Красная компонета цвета текста кнопки}
{ intTextColorG - Зелёная компонета цвета текста кнопки}
{ intTextColorB - Синяя компонета цвета текста кнопки}
{ isFill        - True = кнопка закрашена}
{ isRound      - True = кнопка со скруглёнными краями}
{ intArcWidth  - Радиус кривизны по оси Х}
{ intArcHeight  - Радиус кривизны по оси Y}
{ isRepaint      - True = требуется перерисовка}
{ Автор - Боев Григорий }

  SetColor(intBackColorR,intBackColorG,intBackColorB);  {Устанавливаем цвет}

  if (isFill) then
  begin
    if (isRound) then
    begin
        fillRoundRect(intLeft,intTop,intWidth,intHeight,intArcWidth,intArcHeight);          {Рисуем кнопку}
    end
    else
    begin
        fillRect(intLeft,intTop,intWidth,intHeight);          {Рисуем кнопку}
    end;
  end
  else
  begin
    if (isRound) then
    begin
        DrawRoundRect(intLeft,intTop,intWidth,intHeight,intArcWidth,intArcHeight);          {Рисуем кнопку}
    end
    else
    begin
        DrawRect(intLeft,intTop,intWidth,intHeight);          {Рисуем кнопку}
    end;
  end;

  TextHeight := getStringHeight(strText);
  TextWidth := getStringWidth(strText);

  SetColor(intTextColorR,intTextColorG,intTextColorB);  {Устанавливаем цвет текста}
  drawText(strText, intLeft+(intWidth - TextWidth)/2, intTop+(intHeight-TextHeight)/2); {Пишем текст в центре кнопки}

  if isRepaint then repaint;                                    {Обновляем экран, если необходимо}
end;

Пример использования:

Код:

program ButtonDemo;
var

maxX,maxY,IntPersBottomSpice,intPersCopyright,intButtonWidth,intButtonHeight:integer;

procedure DrawButton(strText:string;intLeft,intTop,intWidth,intHeight,intBackColorR,intBackColorG,intBackColorB,intTextColorR,intTextColorG,intTextColorB:integer;isFill,isRound:boolean;intArcWidth, intArcHeight:integer;isRepaint:boolean);
var
  TextHeight, TextWidth: integer;            {Размеры текста}
begin
{Процедура рисования кнопки с надписью}
{ ProgrammerForever (c) 2012 }
{ strText      - надпись на кнопке}
{ intLeft      - расстояние от левого края экрана до левого края кнопки. Фактически - X-координата левой верхней точки}
{ intTop        - расстояние от верхнего края экрана до верхнего края кнопки. Фактически - Y-координата левой верхней точки}
{ intWidth      - Ширина кнопки}
{ intHeight    - Высота кнопки}
{ intBackColorR - Красная компонета цвета фона кнопки}
{ intBackColorG - Зелёная компонета цвета фона кнопки}
{ intBackColorB - Синяя компонета цвета фона кнопки}
{ intTextColorR - Красная компонета цвета текста кнопки}
{ intTextColorG - Зелёная компонета цвета текста кнопки}
{ intTextColorB - Синяя компонета цвета текста кнопки}
{ isFill        - True = кнопка закрашена}
{ isRound      - True = кнопка со скруглёнными краями}
{ intArcWidth  - Радиус кривизны по оси Х}
{ intArcHeight  - Радиус кривизны по оси Y}
{ isRepaint      - True = требуется перерисовка}
{ Автор - Боев Григорий }

  SetColor(intBackColorR,intBackColorG,intBackColorB);  {Устанавливаем цвет}

  if (isFill) then
  begin
    if (isRound) then
    begin
        fillRoundRect(intLeft,intTop,intWidth,intHeight,intArcWidth,intArcHeight);          {Рисуем кнопку}
    end
    else
    begin
        fillRect(intLeft,intTop,intWidth,intHeight);          {Рисуем кнопку}
    end;
  end
  else
  begin
    if (isRound) then
    begin
        DrawRoundRect(intLeft,intTop,intWidth,intHeight,intArcWidth,intArcHeight);          {Рисуем кнопку}
    end
    else
    begin
        DrawRect(intLeft,intTop,intWidth,intHeight);          {Рисуем кнопку}
    end;
  end;

  TextHeight := getStringHeight(strText);
  TextWidth := getStringWidth(strText);

  SetColor(intTextColorR,intTextColorG,intTextColorB);  {Устанавливаем цвет текста}
  drawText(strText, intLeft+(intWidth - TextWidth)/2, intTop+(intHeight-TextHeight)/2); {Пишем текст в центре кнопки}

  if isRepaint then repaint;                                    {Обновляем экран, если необходимо}
end;
begin

maxX := getwidth; {Получаем размеры экрана}
maxY := getheight; {Получаем размеры экрана}

IntPersBottomSpice:=25; {Задаётся в %}
intPersCopyright:=25;    {Задаётся в %}

intButtonWidth:=(maxX*(100-2*IntPersBottomSpice)/100);
intButtonHeight:=MaxY*intPersCopyright/100;

DrawButton('Demo',MaxX*IntPersBottomSpice/100,(MaxY-intButtonHeight)/2,intButtonWidth,intButtonHeight,64,0,0,255-64,255-0,255-0,true,true,5,5,true);

repeat until (getKeyPressed <> KE_NONE); {Ждём нажатие клавиши}
end.

Пользуйтесь с удовольствием! :)


Часовой пояс GMT +4, время: 23:38.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot