Ветеран
Сообщения: 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;
|