Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


neorom,
Цитата neorom:
и скрипт для обводки текста бо у меня их розєденить чтото не получаэться »
да я вроде старался всё структурировано сделать. Ну да ладно, ведь ты говоришь:
Цитата neorom:
и чтоби текст VALVE отображался на странице вибора папкм установки »
Тут проблема. Страница выбора директории это TNewNotebookPage и у неё и её предков нет подкласса TCanvas, а значит нарисовать тект на ней как в пред примере нге получится, разве что на вин апи, но мне сейчас туда нет времени лезть, поэтому предлагаю так: создавать на подобных Окнах TBitmapImage и рисовать на нём, а именно
TBitmapImage->TBitmap->TCanvas.
чтоб создать такой рисунок нужно много параметров и чтобы не получился километровый заголовок функции я написал свой тип = структура _BORDER_TEXT_STRUCT и _SHADOW_TEXT_STRUCT в соответствии для каждого примера. Всё работает предельно просто.
1. Мы объявляем ссылку на структуру
2. запоняем её (структуру)
3. отправляем в функцию и получаем на выходе старый добрый TBitmapImage, с которым умеет работать думаю каждый
как ты просил - два отдельных примера с комментариями
1-пример создания текста с тенью:
читать дальше »
Код: Выделить весь код
const
    TRANSPARENT = 1;

type
    HDC = LongWord;

function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';

type
    _SHADOW_TEXT_STRUCT = record
        Parent: TWinControl; // родитель картинки
        BackgroundColor: Integer; // цвет фона (катника получится прямоугольной. Поэтому всё, что в пределах прямоугольника, можно закрасить этим цветом перед тем как туда врисуется текст)
        FontStyle: TFontStyles; // стиль шрафта (если ничего не приваивать, то будет стиль по-умолчанию)
        FontSize: Integer; // размер шрифта (если ничего не приваивать, то будет размер шрифта по-умолчанию)
        FontName: String; // имя шрифта (если ничего не приваивать (не рекомендую), то будет имя шрифта по-умолчанию)
        ShadowColor: Integer; // цвет тени
        ShadowLeft: Integer; // сдвиг тени относитьльно текста вправо
        ShadowTop: Integer; // сдвиг тени относитьльно текста вниз
        TextColor: Integer; // цвет текста
        TextLeft: Integer; // расположение картинки слева
        TextTop: Integer; // расположение картинки сверху
        Text: String; // сам ткст
    end;


procedure iColorRect(Canvas: TCanvas; const Color, Width, Height: Integer);  /// private proc
var
    rt: TRect;
begin
    rt.Left := 0;
    rt.Top := 0;
    rt.Right := Width;
    rt.Bottom := Height;
    Canvas.Brush.Color := Color;
    Canvas.FillRect(rt);
end;


function CreateBitmapShadowText(const st: _SHADOW_TEXT_STRUCT): TBitmapImage;
var
    UndefWidth, UndefHeight: Integer;
begin
    Result := TBitmapImage.Create( TComponent(st.Parent) ); // создаём картинку с указанием принадлежности
    with Result do
    begin
        Parent := st.Parent; // назначаем родителя

        with Bitmap.Canvas do
        try // устанавливаем методам канвы спецификации шрифта чтоб чуть дальше методами канвы TextWidth и TextHeight получить требуемые размеры для отображения теста
            Font.Color := st.ShadowColor;
            Font.Size := st.FontSize;
            Font.Name := st.FontName;
            Font.Style := st.FontStyle;
        finally   // пишем значения размера текста в переменные, чтоб не гонять 2 раза методы TextWidth и TextHeight
            UndefWidth := st.ShadowLeft + TextWidth(st.Text);
            UndefHeight := st.ShadowTop + TextHeight(st.Text);
        end;

        SetBounds( ScaleX(st.TextLeft), ScaleY(st.TextTop), ScaleX(UndefWidth), ScaleY(UndefHeight) ); // устанвливаем размеры картинки

        /// устанавливаем размеры подклассу картинки - битмапу
        Bitmap.Width := ScaleX(UndefWidth);
        Bitmap.Height := ScaleY(UndefHeight);

        // запоняем весь битмап картинки цветом фона
        iColorRect(Bitmap.Canvas, st.BackgroundColor, Width, Height);
        // утанавливаем прозрачность канве
        SetBKMode(Bitmap.Canvas.Handle, TRANSPARENT);

        with Bitmap.Canvas do
        begin
            TextOut(0 + st.ShadowLeft, 0 + st.ShadowTop, st.Text); // рисуем текст-тень
            Font.Color := st.TextColor; // меняем цвет шрифта
            TextOut(0, 0, st.Text); // рисуем поверх тени тектс
        end;
    end;
end;



procedure InitializeWizard();
var
    sts: _SHADOW_TEXT_STRUCT;
    BitmapImage: TBitmapImage;
begin
    sts.Parent := WizardForm.SelectDirPage;
    sts.BackgroundColor := WizardForm.SelectDirPage.Color;
    sts.FontStyle := [fsBold];
    sts.FontSize := 44;
    sts.FontName := 'Tahoma';
    sts.ShadowColor := clBlack;
    sts.ShadowLeft := 2;
    sts.ShadowTop := 2;
    sts.TextColor := clYellow;
    sts.TextLeft := 10;
    sts.TextTop := 100;
    sts.Text := 'Valve';

    BitmapImage := CreateBitmapShadowText(sts);
end;


2-пример создания текста с обводкой:
читать дальше »
Код: Выделить весь код
const
    TRANSPARENT = 1;
    STEAM_GREEN = $506a5a;

type
    HDC = LongWord;

function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';

type
    _BORDER_TEXT_STRUCT = record
        Parent: TWinControl; // родитель картинки
        BackgroundColor: Integer; // цвет фона (катника получится прямоугольной. Поэтому всё, что в пределах прямоугольника, можно закрасить этим цветом перед тем как туда врисуется текст)
        FontStyle: TFontStyles; // стиль шрафта (если ничего не приваивать, то будет стиль по-умолчанию)
        FontSize: Integer; // размер шрифта (если ничего не приваивать, то будет размер шрифта по-умолчанию)
        FontName: String; // имя шрифта (если ничего не приваивать (не рекомендую), то будет имя шрифта по-умолчанию)
        BorderColor: Integer; // цвет обводки
        BorderWidth: Integer; // ширина обводки
        TextColor: Integer; // цвет текста
        TextLeft: Integer; // расположение картинки слева
        TextTop: Integer; // расположение картинки сверху
        Text: String; // сам ткст
    end;


procedure iColorRect(Canvas: TCanvas; const Color, Width, Height: Integer);  /// private proc
var
    rt: TRect;
begin
    rt.Left := 0;
    rt.Top := 0;
    rt.Right := Width;
    rt.Bottom := Height;
    Canvas.Brush.Color := Color;
    Canvas.FillRect(rt);
end;


function CreateBitmapBorderText(const bt: _BORDER_TEXT_STRUCT): TBitmapImage;  // на выходе обычный TBitmapImage со всеми вытекающими возможностями
var
    UndefWidth, UndefHeight: Integer;
begin
    Result := TBitmapImage.Create( TComponent(bt.Parent) ); // создаём картинку с указанием принадлежности
    with Result do
    begin
        Parent := bt.Parent; // назначаем родителя

        with Bitmap.Canvas do
        try // устанавливаем методам канвы спецификации шрифта чтоб чуть дальше методами канвы TextWidth и TextHeight получить требуемые размеры для отображения теста
            Font.Color := bt.BorderColor;
            Font.Size := bt.FontSize;
            Font.Name := bt.FontName;
            Font.Style := bt.FontStyle;
        finally   // пишем значения размера текста в переменные, чтоб не гонять 2 раза методы TextWidth и TextHeight
            UndefWidth := TextWidth(bt.Text) + bt.BorderWidth*2;
            UndefHeight := TextHeight(bt.Text) + bt.BorderWidth*2;
        end;

        SetBounds( ScaleX(bt.TextLeft+ bt.BorderWidth), ScaleY(bt.TextTop), ScaleX(UndefWidth), ScaleY(UndefHeight) ); // устанвливаем размеры картинки

        /// устанавливаем размеры подклассу картинки - битмапу
        Bitmap.Width := ScaleX(UndefWidth);
        Bitmap.Height := ScaleY(UndefHeight);

        // запоняем весь битмап картинки цветом фона
        iColorRect(Bitmap.Canvas, bt.BackgroundColor, Width, Height);
        // утанавливаем прозрачность канве
        SetBKMode(Bitmap.Canvas.Handle, TRANSPARENT);

        with Bitmap.Canvas do
        begin
            // рисуем обводку
            TextOut(bt.BorderWidth*2, bt.BorderWidth*2, bt.Text);
            TextOut(0, 0, bt.Text);
            TextOut(bt.BorderWidth*2, 0, bt.Text);
            TextOut(0, bt.BorderWidth*2, bt.Text);
            
            Font.Color := bt.TextColor; // меняем цвет шрифта
            TextOut(bt.BorderWidth, bt.BorderWidth, bt.Text); // рисуем поверх тени тектс
        end;
    end;
end;



procedure InitializeWizard();
var
    bts: _BORDER_TEXT_STRUCT;
    BitmapImage: TBitmapImage;
begin
    bts.Parent := WizardForm.SelectDirPage;
    bts.BackgroundColor := WizardForm.SelectDirPage.Color;
    bts.FontStyle := [];
    bts.FontSize := 44;
    bts.FontName := 'Tahoma';
    bts.BorderColor := clBlack;
    bts.BorderWidth := 1;
    bts.TextColor := STEAM_GREEN;
    bts.TextLeft := 10;
    bts.TextTop := 100;
    bts.Text := 'Valve';

    BitmapImage := CreateBitmapBorderText(bts);
end;


Внимание всем! Данный пример нужно использовать только в том случае, если у класса на котором хотите рисовать нет подкласса TCanvas, в противном случае лучше использвать пред. пример, тк он быстрее(хотя на глаз не видно). Хотя и у этого примера есть свой плюс - картинка на выходе.

==================================== UPD
разъединил предыдущий пример:

с тенью:
читать дальше »
Код: Выделить весь код
const
    TRANSPARENT = 1;

    STEAM_GREEN = $506a5a;


type
    HDC = LongWord;

    _LITTLE_FONT_INFO = record
       Style: TFontStyles;
       Size: Integer;
       Name: String;
    end;


function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';


procedure CreateTextWithShadow(Canvas: TCanvas; const Text: String; const FontInfo: _LITTLE_FONT_INFO; const TextLeft, TextTop, TextColor, ShadowColor, ShadowLeft, ShadowTop: Integer);
begin
    with Canvas do
    begin
        Font.Color := ShadowColor;
        Font.Size := FontInfo.Size;
        Font.Name := FontInfo.Name;
        Font.Style := FontInfo.Style;
        TextOut(TextLeft + ShadowLeft, TextTop + ShadowTop, Text);
        Font.Color := TextColor;
        TextOut(TextLeft, TextTop, Text);
    end;
end;


procedure WizardFormOnPaint(Sender: TObject);
var
    lfi: _LITTLE_FONT_INFO;
begin
    SetBKMode(TWizardForm(Sender).Canvas.Handle, TRANSPARENT);

    lfi.Style := [];
    lfi.Size := 24;
    lfi.Name := 'Arial';
    CreateTextWithShadow(TWizardForm(Sender).Canvas, 'VALVE', lfi, ScaleX(127), ScaleY(77), clWhite, clBlack, 4, 3);
end;


procedure InitializeWizard();
begin
    WizardForm.Color := STEAM_GREEN;
    WizardForm.OuterNotebook.Hide;
    WizardForm.OnPaint := @WizardFormOnPaint;
end;


с обводкой:
читать дальше »
Код: Выделить весь код
const
    TRANSPARENT = 1;

    STEAM_GREEN = $506a5a;


type
    HDC = LongWord;

    _LITTLE_FONT_INFO = record
       Style: TFontStyles;
       Size: Integer;
       Name: String;
    end;


function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';


procedure CreateTextWithBorder(Canvas: TCanvas; const Text: String; const FontInfo: _LITTLE_FONT_INFO; const TextLeft, TextTop, TextColor, ShadowColor, BorderWidth: Integer);
begin
    with Canvas do
    begin
        Font.Color := ShadowColor;
        Font.Size := FontInfo.Size;
        Font.Name := FontInfo.Name;
        Font.Style := FontInfo.Style;
        TextOut(TextLeft + BorderWidth, TextTop + BorderWidth, Text);
        TextOut(TextLeft - BorderWidth, TextTop - BorderWidth, Text);
        TextOut(TextLeft + BorderWidth, TextTop - BorderWidth, Text);
        TextOut(TextLeft - BorderWidth, TextTop + BorderWidth, Text);
        Canvas.Font.Color := TextColor;
        TextOut(TextLeft, TextTop, Text);
    end;
end;


procedure WizardFormOnPaint(Sender: TObject);
var
    lfi: _LITTLE_FONT_INFO;
begin
    SetBKMode(TWizardForm(Sender).Canvas.Handle, TRANSPARENT);

    lfi.Style := [fsBold];
    lfi.Size := 54;
    lfi.Name := 'Tahoma';
    CreateTextWithBorder(TWizardForm(Sender).Canvas, 'VALVE', lfi, ScaleX(16), ScaleY(16), clBlack, clWhite, 1);
end;


procedure InitializeWizard();
begin
    WizardForm.Color := STEAM_GREEN;
    WizardForm.OuterNotebook.Hide;
    WizardForm.OnPaint := @WizardFormOnPaint;
end;



прямоугольник:
читать дальше »
Код: Выделить весь код
const
    STEAM_GREEN = $506a5a;


type
    HDC = LongWord;


function SetBkMode(DC: HDC; BkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';


procedure CreateSquare(Canvas: TCanvas; const Left, Top, Width, Height, BorderWidth, BorderColor: Integer);
begin
    with Canvas do
    begin
        Pen.Color := BorderColor;
        Pen.Width := BorderWidth;
        MoveTo(Left, Top);
        LineTo(Left, Top + Height);
        LineTo(Left + Width, Top + Height);
        LineTo(Left + Width, Top);
        LineTo(Top, Left);
    end;
end;


procedure WizardFormOnPaint(Sender: TObject);
begin
    CreateSquare(TWizardForm(Sender).Canvas, ScaleX(5), ScaleY(5), ScaleX(300), ScaleY(120), 1, clWhite);
end;


procedure InitializeWizard();
begin
    WizardForm.Color := STEAM_GREEN;
    WizardForm.OuterNotebook.Hide;
    WizardForm.OnPaint := @WizardFormOnPaint;
end;

Последний раз редактировалось Johny777, 28-05-2013 в 01:09.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:33, 28-05-2013 | #540