Как разместить прозрачную надпись на tbitmap


Содержание

Как разместить прозрачную надпись на tbitmap?

Как разместить прозрачную надпись на TBitmap?

procedure TForm1.Button1Click(Sender: TObject); var OldBkMode : integer; begin Image1.Picture.Bitmap.Canvas.Font.Color := clBlue; OldBkMode := SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,TRANSPARENT); Image1.Picture.Bitmap.Canvas.TextOut(10, 10, ‘Hello’); SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,OldBkMode); end;

Вопрос:

Можно ли обратиться к колонке или строке grid’а по заголовку?

В следующем примере приведены две функции: GetGridColumnByName() и GetGridRowByName(), которые возвращают колонку или строку, имеющую заданный заголовок (caption).

procedure TForm1.FormCreate(Sender: TObject); begin StringGr + IntToStr(Row)); end;

Вопрос:

Как использовать клавишу-акселератор в TTabsheets? Я добавляю клавишу-акселератор в заголовок каждого Tabsheet моего PageControl, но при попытке переключать страницы этой клавишей программа пикает и ничего не происходит.

Можно перехватить сообщение CM_DIALOGCHAR.

Вопрос:

При использованиии компонента TRegistry под NT пользователь с права доступа ниже чем «администратор» не может получить доступа к информации реестра в ключе HKEY_LOCAL_MACHINE. Как это обойти?

Проблема вызвана тем, что TRegistry всегда открывает реестр с параметром KEY_ALL_ACCESS (полный доступ), даже если необходим доступ KEY_READ (только чтение). Избежать этого можно используя функции API для работы с реестром (RegOpenKey и т.п.), или создать новый класс из компонента TRegestry, и изменить его так чтобы можно было задавать режим открытия реестра.

Вопрос:

Можно ли изменить число колонок и их ширину в компоненте TFileListBox?

В приведенном примере FileListBox приводится к типу TDirectoryListBox — таким образом можно добавиь дополнительные колонки.

with TDirectoryListBox(FileListBox1) do begin Columns := 2; SendMessage(Handle, LB_SETCOLUMNWIDTH, Canvas.TextWidth(‘WWWWWWWW.WWW’),0); end;

Вопрос:

Как настроить табуляцию в компоненте TMemo?

Пошлите в Memo сообщение EM_SETTABSTOPS. Например установим первую позицию табуляции на 20-й пиксел.

procedure TForm1.FormCreate(Sender: TObject); var DialogUnitsX : LongInt; PixelsX : LongInt; i : integer; TabArray : array[0..4] of integer; begin Memo1.WantTabs := true; DialogUnitsX := LoWord(GetDialogBaseUnits); PixelsX := 20; for i := 1 to 5 do begin TabArray[i — 1] :=((PixelsX * i ) * 4) div DialogUnitsX; end; SendMessage(Memo1.Handle, EM_SETTABSTOPS,5,LongInt(@TabArray)); Memo1.Refresh; end;

Вопрос:

Как перехватить нажатия функциональных клавиш и стрелок?

Проверяйте значение переменной key на равенство VK_RIGHT, VK_LEFT, VK_F1 и т.д. на событии KeyDown формы.

procedure TForm1.FormKeyDown( Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_RIGHT then Form1.Caption := ‘Right’; if Key = VK_F1 then Form1.Caption := ‘F1’; end;

Вопрос:

При обработке события DrawCell компонента DrawGr >

Правильно укажите границы используемого канваса.

If (Row = 0) then begin DrawGr >

Вопрос:

При использовании BitBtn Caption(текст) и картинка(bitmap) из файла не видны одновременно. Почему?

Это может происходить если картинка слишком велика. Класс TBitBtn сначала рисует картинку, а затем выводит текст над, под, слева или справа от картинки (в завивимости от свойства Layout). Если размер картинки такой же как у всей кнопки для вывода текста просто не остается места. Если Вам нужно получить кнопку такого же размера как Ваша картинка и видеть при этом надпись на кнопке Вам придется выводить текст надписи непосредственно на канву картинки.

var bm : TBitmap; OldBkMode : integer; begin bm := TBitmap.Create; bm.W ); SetBkMode(bm.Canvas.Handle, OldBkMode); BitBtn1.Glyph.Assign(bm); end;

Вопрос:

Можно ли изменить вид текстового курсора (каретки) edit’а или другого элемента управления Windows?

Можно! В примере показано как создать два цветных «bitmap’а»: «улыбчивый» и «хмурый» и присвоить их курсору edit’а. Для этого нужно перехватить оконную процедуру edit’а. Чтобы сделать это заменим адрес оконной процедуры Edit’а нашим собственным, а старую оконную процедуру будем вызывать по необходимости. Пример показывает «улыбчивый» курсор при наборе текста и «хмурый» при забое клавишей backspace.

unit caret1; interface <$IFDEF WIN32>uses Windows, Messages, SysUtils, ); OldEditsWindowProc := Pointer(SetWindowLong(Edit1.Handle,GWL_WNDPROC, LongInt(@NewWindowProc))); end; procedure TForm1.FormDestroy(Sender: TObject); begin SetWindowLong(Edit1.Handle,GWL_WNDPROC, LongInt(OldEditsWindowProc)); CaretBm.Free; CaretBmBk.Free; end;

Вопрос:

При использовании модулей доступа к BDE (DbiTypes, DbiProcs, DbiErrs), любая попытка вызвать процедуру abort выдает ошибку при компиляции при вызове метода abort «Statement expected, but expression of type ‘Integer’ found». Я пытался найти DbiTypes.pas, DbiProcs.pas и DbiErrs.pas чтобы разобраться но не нашел этих файлов. Где расположены эти файлы и как обойти ошибку?

Модули DbiTypes, DbiProcs, DbiErrs это псевдонимы модуля «BDE», обьявлены в Projects->Options->Directories/Conditionals->Unit Aliases. Исходник модуля DBE находится в каталоге «doc» и называется «BDE.INT». В этом файле обьявленна константа ABORT со значением -2. Так как Вы хотите использовать процедуру Abort(), которая обьявлена в модуле SysUtils, Вам нужно добавить префикс SysUtils перед вызовом процедуры Abort.

Вопрос:

Почему при изменении цвета букв StatusBar’а ничего не происходит?

Status bar — стандартный элемент управления Windows, и соответственно цвет его букв — значение clBtnText которое изменяется с помощью настроек в Control Panel. Этот цвет черный по умолчанию и может изменяться в зависимости от выбранной цветовой схемы. Другие стандартные элемент управления Windows, например кнопки, также имеют цвет букв, настраиваемый из ControlPanel. StatusBar и его панели имеют свойство «owner-draw», позволяющее Вам использовать любой цвет букв.

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); begin if Panel = StatusBar.Panels[0] then begin StatusBar.Canvas.Font.Color := clRed; StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, ‘Panel — 0’) end else begin StatusBar.Canvas.Font.Color := clGreen; StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, ‘Panel — 1’); end; end;

Вопрос:

Как сделать многострочную надпись на TBitBtn?

Выводите текст надписи непосредственно на «glyph» TBitBtn’а. См. пример.

procedure TForm1.FormCreate(Sender: TObject); var R : TRect; N : Integer; Buff : array[0..255] of Char; begin with BitBtn1 do begin Caption := ‘A really really long caption’; Glyph.Canvas.Font := Self.Font; Glyph.W ; DrawText(Glyph.Canvas.Handle,Buff,StrLen(Buff),R, DT_CENTER or DT_WORDBREAK or DT_CALCRECT); OffsetRect(R,(Glyph.Width — R.Right) div 2, (Glyph.Height — R.Bottom) div 2); DrawText(Glyph.Canvas.Handle,Buff,StrLen(Buff),R, DT_CENTER or DT_WORDBREAK); end; end;

Вопрос:

Как изменить стиль шрифта RichEdit нажатиями соответствующих комбинаций клавиш? (например включить курсив по нажатию Ctrl + I)

В примере стили шрифта меняются по нажатию след. комбинаций клавиш Ctrl + B — вкл/выкл жирного шрифта Ctrl + I — вкл/выкл наклонного шрифта Ctrl + S — вкл/выкл зачеркнутого шрифта Ctrl + U — вкл/выкл подчеркнутого шрифта

const KEY_CTRL_B = 02; KEY_CTRL_I = 9; KEY_CTRL_S = 19; KEY_CTRL_U = 21; procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char); begin case Ord(Key) of KEY_CTRL_B: begin Key := #0; if fsBold in (Sender as TRichEdit).SelAttributes.Style then (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style — [fsBold] else (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style + [fsBold]; end; KEY_CTRL_I: begin Key := #0; if fsItalic in (Sender as TRichEdit).SelAttributes.Style then (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style — [fsItalic] else (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style + [fsItalic]; end; KEY_CTRL_S: begin Key := #0; if fsStrikeout in (Sender as TRichEdit).SelAttributes.Style then (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style-[fsStrikeout] else (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style+[fsStrikeout]; end; KEY_CTRL_U: begin Key := #0; if fsUnderline in (Sender as TRichEdit).SelAttributes.Style then (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style-[fsUnderline] else (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style+[fsUnderline]; end; end; end;

Вопрос:

В документации компонента TRegIniFile говорится, что можно изменять корневой ключ (root key). Я пытаюсь это сделать но ничего не получается.

uses Registry; procedure TForm1.Button1Click(Sender: TObject); var WinIni : TRegIniFile; begin WinIni := TRegIniFile.Create(»); WinIni.RootKey := HKEY_LOCAL_MACHINE; WinIni.WriteString(‘Frank’,’Borland’,’Writes Fast Code!’); WinIni.Free; end;

Вопрос:

Можно ли динамически изменять свойство «owner» компонента во время выполнения программы?

Вы можете менять свойство «owner» и после создания компонента с помощью методов InsertComponent() и RemoveComponent().

Вопрос:

Как очистить содержимое Canvas’а?

Просто нарисуйте прямоугольник любого цвета.

Canvas.Brush.Color := ClWhite; Canvas.FillRect(Canvas.ClipRect);


Вопрос:

Можно ли динамически менять какая форма считается главной в приложении во время работы программы?

Можно, но только во время загрузки приложения. Чтобы сделать это выберите «View->Project Source» и измените код инициализации приложения, так что порядок создания форм зависил от какого-то условия.

Вам придется редактировать этот код, если Вы добавите в приложение новые формы.

begin Application.Initialize; if then begin Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); end else begin Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm1, Form1); end; end. Application.Run;

Вопрос:

Как программно «щелкнуть» по компоненту speed button? Я пытался использовать SendMessage но у Speedbuttons нет «handle».

В примере используется метод Perform класса TControl для отправки сообщения.

procedure TForm1.SpeedButton1Click(Sender: TObject); begin ShowMessage(‘clicked’); end; procedure TForm1.Button1Click(Sender: TObject); begin SpeedButton1.Perform(WM_LBUTTONDOWN, 0, 0); SpeedButton1.Perform(WM_LBUTTONUP, 0, 0); end;

Вопрос:

Можно ли отключить определенный элемент в RadioGroup?

В примере показано как получить доступ к отдельным элементам компонента TRadioGroup.

procedure TForm1.Button1Click(Sender: TObject); begin TRadioButton(RadioGroup1.Controls[1]). Enabled := False; end;

Вопрос:

Почему методы рисования Delphi (например MoveTo и LineTo) рисуют на один пиксел короче?

Так работает большинство графических систем, включая Windows. Библиотека VCL просто передает вызовы в функции GDI. Если Вы хотите нарисовать линию с последним пикселом включительно просто добавте единицу к координатам.

Вопрос:

Как показать подсказки «hints» для элементов меню?

В примере создается обработчик события Application.Hint — подсказки меню изображаются на status panel.

type TForm1 = ; Application.OnHint := HintHandler; end; procedure TForm1.HintHandler(Sender: TObject); begin Panel1.Caption := Application.Hint; end; procedure TForm1.MenuItemCloseClick(Sender: TObject); begin Application.Terminate; end; procedure TForm1.MenuItemOpenClick(Sender: TObject); begin if OpenDialog1.Execute then Form1.Caption := OpenDialog1.FileName; end;

Вопрос:

Как опеделить состояние списка ComboBox, выпал/скрыт?

Пошлите ComboBox сообщение CB_GETDROPPEDSTATE.

if SendMessage(ComboBox1.Handle, CB_GETDROPPEDSTATE,0,0) = 1 then begin <список ComboBox выпал>end;

Вопрос:

Как удалить каталог вместе со всеми содержащимися в нем файлами?

В примере стираются все файлы в каталоге и сам каталог. Чтобы удалить файл, помечанные только для чтения (read only) и занятые другими программами в момент удаления — напишите дополнительную процедуру.

procedure TForm1.Button1Click(Sender: TObject); var DirInfo: TSearchRec; r: integer; begin r := FindFirst(‘C:\Download\*.*’, FaAnyfile, DirInfo); while r = 0 do begin if ((DirInfo.Attr and FaDirectory <> FaDirectory) and (DirInfo.Attr and FaVolumeId <> FaVolume ); end;

Вопрос:

Как отключить системное меню формы и кнопки Minimize, Maximize, and Close во время выполнения(Runtime)?

В приведенном примере показано как это сделать

procedure TForm1.Button1Click(Sender: TObject); begin Form1.BorderIcons := Form1.BorderIcons — [biSystemMenu, biMinimize, biMaximize]; end; procedure TForm1.Button2Click(Sender: TObject); begin Form1.BorderIcons := Form1.BorderIcons + [biSystemMenu, biMinimize, biMaximize]; end;

Вопрос:

Как извлечь Red, Green, и Blue компонент из определенного цвета?

Используйте функции Window API Get RValue(), GetGValue(), и GetBValue().

procedure TForm1.Button1Click(Sender: TObject); begin Form1.Canvas.Pen.Color := clRed; Memo1.Lines.Add(‘Red := ‘ + IntToStr(GetRValue(Form1.Canvas.Pen.Color))); Memo1.Lines.Add(‘Red := ‘ + IntToStr(GetGValue(Form1.Canvas.Pen.Color))); Memo1.Lines.Add(‘Blue:= ‘ + IntToStr(GetBValue(Form1.Canvas.Pen.Color))); end;

Вопрос:

Как определить номер текущей строки в TMemo?

Чтобы определить номер текущей строки любого объекта управления edit — пошлите ей сообщение EM_LINEFROMCHAR

procedure TForm1.Button1Click(Sender: TObject); var LineNumber : integer; begin LineNumber := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, word(-1), 0); ShowMessage(IntToStr(LineNumber)); end;

Вопрос:

Как проигрываеть MPEG файл в Delphi-программе?

Если в системе Windows MMSystem установлен декодер MPEG — используя компонент TMediaPlayer

procedure TForm1.Button1Click(Sender: TObject); begin MediaPlayer1.Filename := ‘C:\DownLoad\rsgrow.mpg’; MediaPlayer1.Open; MediaPlayer1.Display := Panel1; MediaPlayer1.DisplayRect := Panel1.ClientRect; MediaPlayer1.Play; end;

Вопрос:

Как использовать анимированный курсор?

Во первых необходимо получит handle курсора, а затем определить его в массиве курсоров компонента TScreen. Индексы предопределенных курсоров системы отрицательны, пользователь может определить курсор, индекс которого положителен.

procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0, ‘C:\TheWall\Magic.ani’, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage(‘Cursor not loaded’) else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end;

Вопрос:

Как узнать о нажатии «non-menu» клавиши в момент когда меню показано?

Создайте обработчик сообщения WM_MENUCHAR.

unit Unit1; interface uses Windows, Messages, SysUtils, ; m.Result := 1; end; end.

Вопрос:

Как определить наличие сопроцессора?

В отличие от общепринятого мнения не всее клоны 486/586/686/ и Pentium имеют сопроцессор для вычислений с плавающей запятой. В примере определяется наличие сопроцессора и под Win16 и под Win32.

Илон Маск рекомендует:  Создание веб-страницы

<$IFDEF WIN32>uses Registry; <$ENDIF>function HasCoProcesser : bool; <$IFDEF WIN32>var TheKey : hKey; <$ENDIF>begin Result := true; <$IFNDEF WIN32>if GetWinFlags and Wf_80x87 = 0 then Result := false; <$ELSE>if RegOpenKeyEx(HKEY_LOCAL_MACHINE, ‘HARDWARE\DESCRIPTION\System\FloatingPointProcessor’,0, KEY_EXECUTE, TheKey) <> ERROR_SUCCESS then result := false; RegCloseKey(TheKey); <$ENDIF>end; procedure TForm1.Button1Click(Sender: TObject); begin if HasCoProcesser then ShowMessage(‘Has CoProcessor’) else ShowMessage(‘No CoProcessor — Windows Emulation Mode’); end;

Вопрос:

Как узнать серийный номер аудио CD?

CD может иметь или не иметь серийный номер и/или универсальный код продукта (Universal Product Code). MCI-расширение Windows предоставляет эту информации с помощью комманды MCI_INFO_MEDIA_IDENTITY command. Эта команда возвращает уникальную ID-строку.

uses MMSystem, MPlayer; procedure TForm1.Button1Click(Sender: TObject); var mp : TMediaPlayer; msp : TMCI_INFO_PARMS; MediaString : array[0..255] of char; ret : longint; begin mp := TMediaPlayer.Create(nil); mp.Visible := false; mp.Parent := Application.MainForm; mp.Shareable := true; mp.DeviceType := dtCDAudio; mp.FileName := ‘D:’; mp.Open; Application.ProcessMessages; FillChar(MediaString, sizeof(MediaString), #0); FillChar(msp, sizeof(msp), #0); msp.lpstrReturn := @MediaString; msp.dwRetSize := 255; ret := mciSendCommand(Mp.DeviceId, MCI_INFO, MCI_INFO_MEDIA_IDENTITY, longint(@msp)); if Ret <> 0 then begin MciGetErrorString(ret, @MediaString, sizeof(MediaString)); Memo1.Lines.Add(StrPas(MediaString)); end else Memo1.Lines.Add(StrPas(MediaString)); mp.Close; Application.ProcessMessages; mp.free; end; end.

Вопрос:

Как вывести на элемент управления (Window control) текст, содержащий амперсанд — & ?


Используя два амперсанда подряд. Windows интерпритирует одиночный амперсанд как указание на то, что следующий символ — горячая клавиша (и поддчеркивает следующий символ вместо излбражения аперсанда).

Вопрос:

Как поместить bitmap в Metafile?

procedure TForm1.Button1Click(Sender: TObject); var m : TmetaFile; mc : TmetaFileCanvas; b : tbitmap; begin m := TMetaFile.Create; b := TBitmap.create; b.LoadFromFile(‘C:\SomePath\SomeBitmap.BMP’); m.Height := b.Height; m.W ); end;

Вопрос:

Как узнать, что курсор мыши над моей формой?

Можно использовать функцию GetCapture() из Windows API.

Cм. документацию Windows для информации об ограничениях функции GetCapture.

procedure TForm1.FormDeactivate(Sender: TObject); begin ReleaseCapture; end; procedure TForm1.FormMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin If GetCapture = 0 then SetCapture(Form1.Handle); if PtInRect(Rect(Form1.Left,Form1.Top,Form1.Left + Form1.W ; end;

Вопрос:

Как программно определить, что приложение работает под Windows NT?

function IsNT : bool; var osv : TOSVERSIONINFO; begin result := true; GetVersionEx(osv); if osv.dwPlatform ); end;

Вопрос:

Как создать bitmap из пиктогрммы (icon)?

Используя Bitmap.Canvas.Draw нарисуйте пиктограмму на Bitmap’е.

procedure TForm1.Button1Click(Sender: TObject); var TheIcon : TIcon; TheBitmap : TBitmap; begin TheIcon := TIcon.Create; TheIcon.LoadFromFile(‘C:\Program Files\Borland\IcoCur32\EARTH.ICO’); TheBitmap := TBitmap.Create; TheBitmap.Height := TheIcon.Height; TheBitmap.W >

Вопрос:

Как создать отдельную подсказку (hint) для каждой ячейки StringGrid?

В приведенном примере отслеживается движение курсора мыши — при перемещении между ячейками StringGrid’а — появляется окно подсказки(hint), показываеющее номер текущей строки и колонки.

type TForm1 = ; StringGr > r) or(Col <> c)) then begin Row := r; Col := c; Application.CancelHint; StringGr >

Вопрос:

Как внести изменения в код VCL?

Примечание: внесение изменений в VCL не поддерживается Borland или Borland Developer Support.
-Но если Вы решили сделать это.
Изменеия в код VCL никогда не должны вносится в секцию «interface» модуля — только в секцию «implimentation». Наиболее безопасный способ внести изменения в VCL — создать новый каталог названный «исправленный VCL». Скопируйте файл VCL который Вы хотите изменить в этот каталог. Внесите изменения (лучше прокомментировать их) в этот файл. Затем добавьте путь к Вашему каталогу «исправленный VCL» в самое начало «library path». Перезапустите Delphi/C++ Builder и перекомпилируйте Ваш проект. «library path» можно изменить в меню:
Delphi 1 : Options | Environment | Library
Delphi 2 : Tools | Options | Library
Delphi 3 : Tools | Environment Options | Library
Delphi 4 : Tools | Environment Options | Library
C++ Builder : Options | Environment | Library

Вопрос:

Как в Delphi реализовать функцию — эквивалент TwipsPerPixel из Visual Basic?

Функции TwipsPerPixelX и TwipsPerPixelY, приведенные в примере реализуют ту же функциональность в Delphi.

Прозрачность в BitMap

Как сделать некоторые части BitMap прозрачными? BitMap.Transparent не помогает

2 ответа 2

Bitmap вообще прозрачным не бывает. Св-во Transparent лишь даёт программе возможность отображать не всю картинку, а только её часть. Если нужны прозрачные и полупрозрачные картинки можно использовать png, но никак не bmp.

Это смотря какой цвет должен считаться прозрачным. Если, например, белый, то так:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками delphi или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.11.12.35403

Перевод прозрачности в bitmap

Tigrasha

Участник
Злобный юзер

Ответ: Перевод прозрачности в bitmap

2 основных пути:
1) Object->rasterize (для градиентов)
2) Object->Flatten Transperensy (для прозрачностей)

Tigrasha

Участник

Ответ: Перевод прозрачности в bitmap

Спасибо, вы просто спасли меня!

Dim Schief

Ответ: Перевод прозрачности в bitmap

Можно так ещё:Выделяете все объекты, что вы описал (кроме текста-он должен быть в кривых) Ctrl +C (Ill), Ctrl +V(ФШ).Сохраняйте это в Tiff, и снова вставляете в Ill (если конечно у Вас не линки)
Это старый дедовский метод. Надёжный! Проверенный!

Tigrasha

Участник

Ответ: Перевод прозрачности в bitmap

Залезла я в
Object->Flatten Transperensy (для прозрачностей)
или в
Object->rasterize (для градиентов)
и дальше что?

Злобный юзер

Ответ: Перевод прозрачности в bitmap

Согласно требованиям типографии.
Растеризовать на 300ppi, CMYK, без прозрачности и сжатий.
Для Flatten transperensy задаешь high quality и ок

Tigrasha

Участник

Ответ: Перевод прозрачности в bitmap

Спасибо, Dorg, большое, от сердца отлегло. И, если пошла такая пьянка, м.б. вы подскажете, как сделать такой градиент?
Что-то не прикрепляется файл

Злобный юзер

Ответ: Перевод прозрачности в bitmap


Боюсь тогда я не узнаю, какой градиент.

Черный

Ответ: Перевод прозрачности в bitmap

Почему выходит такая штука? Взял из палитры текстуру с градиентом, перевел в растр, сохранил в епс (сохраняю в епсе потому, что текстура часть рекламного макета с мелким текстом). Кидаю макет в индиз, а он помещается туда с белой плашкой по границе «Isolate selected group». А текстура с неровными краями, и мне надо чтобы за ее пределами ничего не было.

Прячем текст в Bitmap

Доброго времени суток, уважаемый хабрачеловек. На хабре уже проскакивали мысли о том, как спрятать текст в bitmap-изображении. К сожалению, топиков на эту тему я не нашел и решил восполнить данный пробел. Под катом Вы найдете способ сокрытия текста в bitmap’е, а также реализацию на C#.

Постановка задачи

Спрятать произвольный текст в кодировке windows-1251 в 24-разрядный bitmap рисунок и излвечь его обратно без искажений.

Структура bmp-файла

Идея алгоритма сокрытия текста

Наверное, Вы уже догадались в чем идея. Дело все в том, что глаз среднестатистического человека (не профессионального художника или фотографа) различает намного меньше цветов, чем было указано выше. Ни в одной книге нет четкого ответа на вопрос, сколько все же цветов различает глаз, но самая большая цифра, которую я встретил — 10 млн. Отсюда следует, что несколько младших битов из восьми, отводимых на каждую компоненту цвета, можно позаимствовать для наших корыстных целей.
Немного цифр: для примера возьмем и нагло отнимем у RGB компонент по два младщих бита. То есть из 24 бит у нас останется 18, которыми можно закодировать ровно 262144 цветов. Теперь возьмем текст в кодировке windows-1251, в которой каждый символ представляется 8ю битами. Путем несложных математический вычислений получаем, что 3 символа можно сохранить в 4 пикселах. Таким образом, в картинке 1024×768, где 786432 пикселов можно сохранить 589824 символа. Неплохо, да? Для наглядности приведу две картинки. На первой исходное изображение, а на второй изображение, у которого младшие два бита каждой компоненты цвета заполнены текстом. Сразу оговорюсь, что изображения сконвертированы в png, чтобы пожалеть траффик.

Если приглядется, то на втором изображении цвета кажутся тусклее. Да, это так. Но мы то с Вами знаем, что в представленном изображении что-то не так, а если бы не знали, то и не догадались бы, что в нем спрятан какой-то текст. Кстати, в изображении спрятана фраза «Hello World. =)» размноженная 100 раз.
Вот и все. Как Вы видите, идея предельно проста. Кстати говоря, представленный метод называется LSB (спасибо frol за подсказку). Напоследок, можете посмотреть реализацию на языке C#.

Как разместить прозрачную надпись на tbitmap?

Нужно наложить прозрачную надпись(рисунок) на объект, сделать это культурно и красиво.
Я всегда делаю это криво и не правильно:
-Создаю два map channel (1-й для общего материала объекта, второй — для надписи)
-В фотошопе — маску прозрачности делаем.
-Делаем два мата ( общий и для надписи (с отключённым тайлингом!))
-Делаем Мат blend с маской прозрачности.
-назначаем маске и надписи 2-й map channel.

Вроде всё выходит, но криво это. И как быть, если таких надписей много, штук 10-ть? Тут бы очень пригодилась многослойная карта, у которой каждому слою можно указывать свой map channel. Такого, как я понимаю нет?
В общем спасайте =) Стыдно признавать, но хотя максом пользуюсь не первый месяц, так и не знаю как делается по-человечески.

Прикладываю фаил примера и скрин результата вышеописаных действий

Как написал BEN`s — Берем стандартный материал, в Diffuse слот кидаем сначала Output Map (В нем выставляем Output Amount -1), далее закидываем в него Composite Map, далее в фотошопе делаем надпись белым по чёрному. После этого закидываем этот битмап в один из Composite слотов (надо в нём ещё выставить — брать альфа канал из интенсивности цвета). Далее назначаем для каждой надписи свои канал и т.д.

Можно без Output`а обойтись, но тогда надо в шопе делать надпись с альфа каналом, и сохранять надпись тоже в формате который держит альфу, ну и в максе выставлять в настройках этого битмапа — брать альфа канал из альфа канала. (ну или как там точно написано. не помню. )

А можно в Composite слоте вставлять не сразу битмап, а через карту Mask.

2 Dimazz: Маску надо иметь в том случае если надпись не монотонно ч/б, или в файле с надписью не альфа канала. Да и как я понял, теперь ему нужна надпись содержащаяся как-бы в отдельном мате.

2 random: Да, у VRay Mtl карты опасити вроде как нет, поэтому наша задача в этом случае немножечко усложняется, но всёравно всё достаточно просто реализуемо. Итак создаем Composite МАТЕРИАЛ, в Base Material ставим тот материал (основной) которым у нас покрыт например стол. Дальше в первом слоте (Mat.1:) вставляем Blend МАТЕРИАЛ. Дальше в первом слоте уже Blend МАТА ставим стандартный максовский мотериал и выставляем в нём значение Opacity в 0, далее во втором слоте этого Blend материала вставляем VRay Mtl который будет служить материалом краски для надписи. В Mask слот Blend материала вставляем ч/б вариант нашей надписи.
Вот вобщем-то и всё, на самом деле всё не так сложно, вобщем сматри файлик!
Когда надпись не одна, просто делай так-же надписи в другие слоты Composite материала.

500+ FAQ по Delphi

Перейти на: Главную | Индексную | Предыдущую | Следующую страницу

chanel chance 100

Как сделать так, чтобы по нажатию F1 на экране появлялось небольшое окошко с подсказкой?

WinProcs.function WinHelp(Wnd: HWnd; HelpFile: PChar; Command: Word; DatLongInt): Bool;

HELP_CONTEXTPOPUP
An unsigned long integer containing the context number for a topic.
Displays in a pop-up window a particular Help topic identified by a context
number that has been defined in the [MAP] section of the .HPJ file.
Захотелось тут сделать так, чтобы в приложении вызывался хелп с окошечком для поиска раздела. Hу короче макрос «Search()» для WinHelp-а.

procedure TForm1.HelpSearchFor;
var
S : String;
begin
S := »;
Application.HelpFile := ‘C:\MYAPPPATH\MYHELP.HLP’;
Application.HelpCommand(HELP_PARTIALKEY, LongInt(@S));
end;
Как заставить Help-файлы нормально отображать русский под Windows 3.x?

Удалось вылечить дописыванием в файл пpоекта в гpафу Options
стpочки FORCEFONT=Arial Cyr
пpичем HC31 pугается что нет такого шpифта, но зато хелп потом
ноpмально показывается на пpактически под любой pуссифициpованной виндой.
пpовеpял с [Win31+CyrWin] [Win311Rus] [Win95PE] [Win95Rus].
на NT не пpовеpял.
Пpичем шpифты в тексте ноpмально пеpеключаются и будутне только Arial.

Вот кусок котоpый надо вставить в HPJ файл пеpед компиляцией.

[OPTIONS]
FORCEFONT=Arial Cyr
Расскажите, please, как использовать ChartFX. Лyчше на пpостеньком пpимеpе.

end.
Подскажите способ обмена информацией между приложениями Win32 — Win16.

Пользуйтесь сообщением WM_COPYDATA.
Для Win16 константа определена как $004A, в Win32 смотрите в WinAPI Help.

#define WM_COPYDATA 0x004A
/*
* lParam of WM_COPYDATA message points to.
*/
typedef struct tagCOPYDATASTRUCT <
DWORD dwData;
DWORD cbData;
PVOID lpData;
> COPYDATASTRUCT, *PCOPYDATASTRUCT;
Как из программы выявить версию Windows, на кого зарегистрирована и т. п.?

Илон Маск рекомендует:  Выбираем выделенный сервер для ваших интернет-проектов

Вот тебе кyсочек Windows Registry, pазбиpайся:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion]
«InstallType»=hex:03,00
«SetupFlags»=hex:08,01,00,00
«DevicePath»=»C:\\WINDOWS\\INF»
«ProductType»=»9»
«RegisteredOwner»=»Jacky Shikerya»
«RegisteredOrganization»=»SigmaЩ Soft. Universal ltd.й»
«Product
«LicensingInfo»=»»
«SubVersionNumber»=» B»
«InventoryPath»=»C:\\WINDOWS\\SYSTEM\\PRODINV.DLL»
«ProgramFilesDir»=»C:\\Program Files»
«CommonFilesDir»=»C:\\Program Files\\Common Files»
«MediaPath»=»C:\\WINDOWS\\media»
«ConfigPath»=»C:\\WINDOWS\\config»
«SystemRoot»=»C:\\WINDOWS»
«OldWinDir»=»»
«ProductName»=»Microsoft Windows 95»
«FirstInstallDateTime»=hex:81,73,b0,22
«Version»=»Windows 95»
«VersionNumber»=»4.00.1111»
«BootCount»=»3»
«OtherDevicePath»=»C:\\WINDOWS\\INF\\OTHER»

В uses пpописываеш юнитy Registry и дальше так:
var R:TRegistry;
No:String;
begin
R:=TRegistry.Create;
R.RootKey:=HKEY_LOCAL_MACHINE;
R.OpenKey(‘. ‘, False) <если flase то пытается откpыть не создавая>
No:=R.ReadString(‘VersionNumber’);
if No=. then . else .
end;
Можно ли запустить OpenGL под Windows’95, и как поставлять его с программой?

Беpешь, к пpимеpy, из диcтpибyтива OSR2 GLU32.DLL и OPENGL32.DLL — и запycкай
на здоpовье.

Более эффективную реализацию OpenGL для Win32 от фирмы SGI я бы советовал
стянуть с www.sgi.com или www.opengl.org
Как работать с блоками памяти размером более 64K.

Так можно помещать в один блок памяти записи из TList (TCollection):

imlementation
< To use the value of AHIncr, use Ofs(AHIncr). >
procedure AHIncr; far; external ‘KERNEL’ index 114;

const
NEXT_SELECTOR: string[13] = ‘NEXT_SELECTOR’;

function WriteDatA>: THandle;
var
DataPtr: PChar;
i: Integer;
begin
Result := GlobalAlloc(GMEM_SHARE or GMEM_ZEROINIT, );
if Result = 0 then Exit;

for i := 0 to <некий>Count-1 do begin
if LongInt(PtrRec(DataPtr).Ofs) + >= $FFFF then begin
Move(NEXT_SELECTOR, DataPtr^, SizeOf(NEXT_SELECTOR)); <некая константа>
< коppекция сегмента >
PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg + Ofs(AHIncr);
PtrRec(DataPtr).Ofs := $0;
end;
Inc(DataPtr, );
end; < for i >
GlobalUnlock(Result);
end;

procedure ReadData(DataHdl: THandle);
var
DataPtr : PObjectCfgRec;
RecsCount, i: Integer;
begin
if DataHdl = 0 then Exit;
DataPtr := GlobalLock(DataHdl);
RecsCount := PInteger(DataPtr)^;
Inc(PInteger(DataPtr));
for i := 1 to RecsCount do begin
< обpаботать данные >
Inc(DataPtr);
if PString(DataPtr)^ = NEXT_SELECTOR then begin
PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg + Ofs(AHIncr);
PtrRec(DataPtr).Ofs := $0;
end;
end; < for i >
GlobalUnlock(DataHdl);
end;
Как создать клон (копию, достаточно близкую к оригиналу)

произвольного компонента?
<
Здесь пpоцедypа CreateClone, котоpая кpеатит компонентy ОЧЕHЬ ПОХОЖУЮ на
входнyю. С такими же значениями свойств. Пpисваивается все, кpоме методов.
>
function CreateClone(Src: TComponent): TComponent;
var
F: TStream;
begin
F := nil;
try
F := TMemoryStream.Create;
F.WriteComponent(Src);
RegisterClass(TComponentClass(Src.ClassType));
F.Position := 0;
Result := F.ReadComponent(nil);
finally
F.Free;
end;
end;
Как сказать VCL, чтобы клавиши shortcut пунктов главного меню главной формы действовали только в этой форме (но не в модальных окнах, к примеру)?

Знакомая проблема.
Лечится так:

function WindowHook(var Message: TMessage): Boolean;

procedure .FormCreate(Sender: TObject);
begin
// MainForm
Application.HookMainWindow(WindowHook);

function .WindowHook;
begin
Result := False;

with Message do
case Msg of
CM_APPKEYDOWN <. . .MainMenu . ?? _. _ .
. >, CM_APPSYSCOMMAND<. .MainMenu ?? . . . >: Msg :=
WM_NULL;
Как задать в качестве фона MDIForm картинку из TBitmap?

type . =class(TForm)
.
procedure FormCreate(Sender:TObject);
procedure FormDestroy(Sender:TObject);
.
private
FHBrush:HBRUSH;
FCover:TBitmap;
FNewClientInstance:TFarProc;
FOldClientInstance:TFarProc;
procedure NewClientWndProc(var Message:TMessage);
.
protected
.
procedure CreateWnd;override;
.
end;
.

<$R myRes.res>//pесуpс с битмапом фона

procedure .FormCreate(. );
var
LogBrush:TLogbrush;
begin
FCover:=TBitmap.Create;
FCover.LoadFromResourceName(hinstance,’BMPCOVER’);
With LogBrush do
begin
lbStyle:=BS_PATTERN;
lbHatch:=FCover.Handle;
end;
FHBrush:=CreateBrushIndirect(Logbrush);
end;

procedure .FormDestroy(. );
begin
DeleteObject(FHBrush);
FCover.Free;
end;

procedure .CreateWnd;
begin
inherited CreateWnd;
if (ClientHandle <> 0) then
begin
if NewStyleControls then
SetWindowLong(ClientHandle, GWL_EXSTYLE, WS_EX_CLIENTEDGE or
GetWindowLong(ClientHandle, GWL_EXSTYLE));

FNewClientInstance:=MakeObjectInstance(NewClientWndProc);
FOldClientInstance:=pointer(GetWindowLong(ClientHandle,GWL_WNDPROC));
SetWindowLong(ClientHandle,GWL_WNDPROC,longint(FNewClientInstance));
end;
end;

procedure .NewClientWndProc(var Message:TMessage);

procedure Default;
begin
with Message do
Result := CallWindowProc(FOldClientInstance, ClientHandle, Msg, wParam,
lParam);
end;

begin
with Message do
case Msg of
WM_ERASEBKGND:
begin
FillRect(TWMEraseBkGnd(Message).DC, ClientRect,FHBrush);
Result := 1;
end;
else
Default;
end;
end;
end;
Где найти описание формата файлов *.RTF?

Это довольно здоровый файл. Прилагается к последним ftsc-all.z93. Файл
называется fsc-0079.z02, топик rtf-mail. Ищи на http://www.blaze.net.auftsc
Как вывести на экран путь файла с «красивым» обрезанием по длине?

DrawTextEx; dwDTFormat = DT_PATH_ELLIPSIS
Как корректно перехватить сигнал выгрузки операционной системы, если в моей программе нет окна?

Используй GetMessage(), в качестве HWND окна пиши NULL.
Если в очереде сообщений следущее WM_QUIT, то функция фозвращает FALSE.

Если ты пишешь прогу для win32, то запихни это в отдельный поток, организующий
выход из програмы.
Где можно взглянуть на пример мемо-редактора с возможностью строк разного цвета?


http://www1.omnitel.net/proga/cmemo10.zip
Как разместить прозрачную надпись на TBitmap?

Пример:
procedure TForm1.Button1Click(Sender: TObject);
var
OldBkMode : integer;
begin
Image1.Picture.Bitmap.Canvas.Font.Color := clBlue;
OldBkMode := SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,TRANSPARENT);
Image1.Picture.Bitmap.Canvas.TextOut(10, 10, ‘Hello’);
SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,OldBkMode);
end;
Можно ли обратиться к колонке или строке grid’а по заголовку?

В следующем примере приведены две функции: GetGridColumnByName() и GetGridRowByName(), которые возвращают колонку или строку, имеющую заданный заголовок (caption).
Пример:
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGr ;
StringGr ;
end;

function GetGridColumnByName(Grid : TStringGrid; ColName : string): integer;
var
i : integer;
begin
for i := 0 to Grid.ColCount — 1 do
if Gr > begin
Result := i;
exit;
end;
Result := -1;
end;

function GetGridRowByName(Grid : TStringGrid; RowName : string): integer;
var
i : integer;
begin
for i := 0 to Grid.RowCount — 1 do
if Gr > begin
Result := i;
exit;
end;
Result := -1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Column : integer;
Row : integer;
begin
Column := GetGridColumnByName(StringGrid1, ‘This Column’);
if Column = -1 then
ShowMessage(‘Column not found’)
else
ShowMessage(‘Column found at ‘ + IntToStr(Column));
Row := GetGridRowByName(StringGrid1, ‘This Row’);
if Row = -1 then
ShowMessage(‘Row not found’)
else
ShowMessage(‘Row found at ‘ + IntToStr(Row));
end;
Как использовать клавишу-акселератор в TTabsheets? Я добавляю клавишу-акселератор в заголовок каждого Tabsheet моего PageControl, но при попытке переключать страницы этой клавишей программа пикает и ничего не происходит.

Можно перехватить сообщение CM_DIALOGCHAR.
Пример:
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
private

procedure CMDialogChar(var Msg:TCMDialogChar);
message CM_DIALOGCHAR;
public

end;

Пустой Bitmap на Android

Вопрос

x11 80

x11 80

  • Продвинутый пользователь
  • Пользователи
  • 80
  • 805 сообщений
  • Город Kharkiv

По совету krapotkin`a

Забросил LiveBinding при заполнении TListView и начал заполнять ручками.

Почти всё хорошо за исключением загрузки картинки из базы.

При использовании LiveBinding картинка грузилась, а теперь просто пустота.

На Windows картинки грузятся и отображаются, а на Андроиде не хотят.

Вот часть кода загрузки

К ListView прикреплен список картинок, где есть картинка-пустышка, которая грузится, если у записи нет картинки.

вот этой строкой ListItemImage.ImageIndex := 0

картинки-пустышки нормально отображаются и на Андроид-устройстве в том числе.

Ошибок нет, а просто пустой TListItemImage там, где должна быть картинка.

Может, я какое-то свойство забыл включить у TListItemImage?

При отладке видно, что картинка загружается из базы.

Изменено 24 декабря, 2020 пользователем x11

Поделиться сообщением

Ссылка на сообщение
Поделиться на другие сайты

3 ответа на этот вопрос

Рекомендуемые сообщения

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Похожий контент

Вопрос из серии «чего-то странного хочется».
Предположим, я хочу написать собственный ListView. Если я наследую от TListView, то всё нормально. Я его регистрирую с помощью процедуры Register
Примерно так:
procedure Register; begin RegisterComponents(‘ ‘, [TМойListView]); end; И всё работает.
Но, как показывает практика, в том числе пример Равиля Зарипова (https://github.com/rzaripov1990/ModernListView) для того, что бы написать полноценный ListView, наследоваться надо от предков TListView, едва ли не от TStyledControl.
Дальше возникает вопрос. Где и как правильно регистрировать вновь созданный компонент?
Если зарегистрировать компонент с помощью процедуры Register, то при размещении компонента на форме в окне Structure к вновь созданному компоненту не привязывается ItemAppearence.

Да и IDE падает.
Прилагаю файл с кастомным ListView. Сделан по аналогии с оригинальным, изменены только названия.

1. Почему кнопка располагается во время работы программы не так, как я её расположил в дизайне?
2. Как привязать кнопку к правому краю? Если установить «Trailing» в свойстве Align, то кнопка вообще исчезает.

Беда, совсем беда . Имеется на форме TListView (listviewEdit.jpg), в него динамически загружается список с картинками полученными через idhttp + TmemoryStream.

. private nowDrawed:string; . Item: TListViewItem; ImageObject: TListItemImage; TextObject: TListItemText; groups:array of Tgroups; . . procedure Tmain.drawGroups(); var i:integer; begin try loader.Show; loader.ProgressBar.Max:=high(groups); loader.ProgressBar.Value:=0; Application.ProcessMessages; nowDrawed:=’groups’; ListView.Items.Clear; ListView.BeginUpdate; for i := 0 to high(groups) do begin Item := ListView.Items.Add; TextObject:=Item.Objects.FindObjectT (‘Text’); TextObject.Text:=groups[i].caption; Item.Tag:=strtoint(groups[i]. >(‘Image’); if ImageObject.Bitmap=nil then ImageObject.bitmap:=TBitmap.Create; http.loadImage(url+groups[i].image,ImageObject.bitmap); loader.ProgressBar.Value:=i; Application.ProcessMessages; end; ListView.EndUpdate; loader.h > При этом, если на форму бросить TImage и передавать в функцию loadImage bitmap этого Timage, то всё отображается корректно.
P.S. Тестовое изображение в аттаче.

Последние посетители 0 пользователей онлайн

Ни одного зарегистрированного пользователя не просматривает данную страницу

Урок 31. Класс TBitmap

Рассмотрим класс TBitmap . Класс TBitmap предназначен для работы с растровыми картинками. Он, как и другие классы, рассмотренные на предыдущих уроках, используется на холсте ( Canvas ) с помощью метода Draw .

Вот пример его использования:

//Загружает изображение из файла

//Выводим размеры в заголовок формы

//Выводим катринку на форму

Form1.Canvas.Draw(0, 0, Bitmap);

//Устанавливаем черно-белый режим

//Выводим вторую картинку

Form1.Canvas.Draw(20, 0, Bitmap);

Первые два параметра метода Draw для холста — это координаты левого верхнего угла выводимой картинки. Первая картинка вывелась в цвете, вторая — черно-белой.

Bitmap может быть и прозрачным. В этом случае в нем пиксели определенного цвета будут считаться прозрачными, и вместо них будет показываться цвет фона нашей формы. Естественно, если форма поменяет цвет, то и цвет таких «прозрачных» пикселей тоже поменяется. Сделать это можно двумя способами. При первом способе мы определяем, что «прозрачным» цветом будет цвет левого верхнего пикселя нашего bitmap . При втором способе мы просто определяем, какой конкретный цвет у bitmap будет считаться прозрачным (за это отвечает свойство TransparentColor типа TColor ). Установка того или иного способа определения прозрачных пикселей задается свойством TransparentMode (возможные значения для него — tmAuto и tmFixed соответственно). И в том, и в другом случае надо установить свойство Transparent для нашего bitmap в true .

А вот и пример кода:

//Установка свойства прозрачности

//Установка цвета левого верхнего

//пиксела в качестве прозрачного


Form1.Canvas.Draw(0, 0, Bitmap);

//Установка конкретного цвета (красного)

//в качестве прозрачного

Bitmap.TransparentColor:=RGB(255, 0, 0);

Form1.Canvas.Draw(20, 0, Bitmap);

Для первой картинки прозрачный цвет — это цвет левого верхнего пискела, для второй — красный цвет.

BFon : TBitmap; // битмап для хранения фона

ЦВЕТ

В предыдущем примере для задания красного цвета пиксела мы использовали константу clRed. В модуле Graphics имеются следующие константы цветов:

Видно, что для определения цвета используется тип TColor. Данный тип содержит информацию о цвете, а также каким образом заменить цвет, если, к примеру, цветовая палитра системы не поддерживает данный цвет (например, установлено всего 256 цветов, а мы хотим назначить цвет, который выходит за пределы данного количества цветов).

Тип TColor состоит из четырех байт (рисунок 2).

Рисунок 2 – Описание указания цветов типа TColor

Цвет мы задаем в соответствии с цветовой моделью RGB (указываются первые буквы цветов Red, Green и Blue). Данная цветовая модель определяет цвет по яркости трех цветовых каналов:

— Red (красный): яркость красного цвета от 0 до 255 (от 00 до FF);

— Green (зеленый): яркость зеленого цвета от 0 до 255 (от 00 до FF);

— Blue (синий): яркость синего цвета от 0 до 255 (от 00 до FF).

Также одним из способов указания цвета является использование функции:

function RGB(r, g, b: Byte): COLORREF;

Данная функция имеет три параметра для задания красного, зеленого и синего цветов. Рассмотрим пример задания пикселу по координатам (x,y)=(24,35) желтого цвета. Для получения желтого цвета нам необходимо будет смешать красный цвет и зеленый:

Следует отметить, что помимо цветовой модели RGB существует другие цветовые модели, такие как:

— CMY (Cyan,Magetta,Yellow) – голубой, пурпурный и желтый цвета;

— CMYK (Cyan,Magetta,Yellow, blacK) – голубой, пурпурный, желтый и черный цвета;

— HSB (Hue, Saturation, Brightness) – тон, насыщенность, яркость;

— Lab (модель, основанная на восприятии глазом человека);

— HSV (Hue, Saturation, Value) – тон, насыщенность, значение;

— HLS (Hue, Lightness, Saturation) – тон, яркость, насыщенность;

— HSI (Hue, Saturation, Intensity) – тон, насыщенность, интенсивность;

КЛАСС TFONT

Класс TFont предназначен для описания шрифтов Windows. Методы канвы (Canvas) модуля Graphics позволяют рисовать только горизонтально расположенные шрифты.

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

Form1.Canvas.Font.Name := ‘Times New Roman’;

В данном примере мы задали для нашей канвы (Canvas) основной шрифт Times New Roman и указали размер шрифта, равный 12.

Разберем более подробно свойства данного класса (таблица 1).

Таблица 1 – Свойства класса TFont

Определяет набор символов шрифта.

Свойство Описание Пример использования
Name Содержит наименование шрифта. Можно указывать любые названия шрифтов, которые установлены в системе Form1.Canvas.Font.Name:=’Times New Roman’;
Style Содержит стиль начертания символов шрифта: — жирный (fsBold); — курсив (fsItalic); — подчеркнутый (fsUnderline); — перечеркнутый (fsStrikeOut). Одновременно можно указывать несколько стилей для шрифта. В примере мы устанавливаем для шрифта курсивное и жирное начертание Form1.Canvas.Font.Style := [fsItalic,fsBold];
Color Определяет цвет шрифта. В примере показан пример задания красного цвета шрифта двумя способами Form1.Canvas.Font.Color := clRed; Form1.Canvas.Font.Color := RGB(255,0,0);
Charset
Описание Знач-е Назначение
ANSI_CHARSET Символы ANSI
DEFAULT_CHARSET Шрифт по умолчанию
SYMBOL_CHARSET Установленные стандартные символы
MAC_CHARSET Macintosh-символы. Не доступно на NT3.51
SHIFTJIS_CHARSET Японские символы
HANGEUL_CHARSET Корейские символы (Wansung)
JOHAB_CHARSET Корейские символы (Johab). Не доступно на NT3.51
GB2312_CHARSET Упрощенные китайские символы (материковый Китай)
CHINESEBIG5_CHARSET Традиционные китайские символы (Тайвань)
GREEK_CHARSET Греческие буквы. Не доступно на NT3.51
TURKISH_CHARSET Турецкие символы. Не доступно на NT3.51
VIETNAMESE_CHARSET Вьетнамские символы. Не доступно на NT3.51
HEBREW_CHARSET Еврейские символы. Не доступно на NT3.51
ARABIC_CHARSET Арабские символы. Не доступно на NT3.51
BALTIC_CHARSET Балтийские символы. Не доступно на NT3.51
RUSSIAN_CHARSET Символы кириллицы. Не доступно на NT3.51
THAI_CHARSET Тайские символы. Не доступно на NT3.51
EASTEUROPE_CHARSET Включает диакритические маркеры для восточно европейских стран. Не доступно на NT3.51
OEM_CHARSET Зависит от кодовой страницы операционной системы

В примере справа мы установили набор символов шрифта на кириллицу двумя способами (указав константу и числовым значением).

Для того, чтобы быть уверенным, что будет использоваться именно русская часть таблицы символов, рекомендуется установить ее:

Form1.Canvas.Font.Charset := RUSSIAN_CHARSET; Form1.Canvas.Font.Charset := 204; Pitch Определяет ширину символов шрифта. Может иметь одно из трех значений: — fpFixed — соответствует моноширинным шрифтам; — fpVariable — соответствует шрифтам с переменной шириной символа; — fpDefault – принятие ширины символов, определенной начертанием. Равноширинных шрифтов совсем немного (MS Sans Serif и Courier). Но любой неравноширинный шрифт можно сделать равноширинным: Form1.Canvas.Font.Pitch := fpFixed; Form1.Canvas.Font.Pitch := fpFixed; Height Определяет высоту шрифта в пикселах Form1.Canvas.Font.Height := 30; PixelsPerInch Определяет число точек на дюйм. Данное свойство желательно не изменять, так как оно используется системой для приведения изображения на экране и принтере к одному виду Form1.Canvas.Font. PixelsPerInch := 78; Size Содержит размер шрифта в пунктах. Это свойство связано со свойством Height следующим соотношением: Font.Size := -Font.Height * 72 / Font. PixelsPerInch; Один пункт равен 1/72 дюйма. Form1.Canvas.Font.Size := 20;

ВЫВОД ТЕКСТА

Для вывода текста на канву используются два метода: TextOut и TextRect.

Рассмотрим пример вывода текста ‘ВЫВОД ТЕКСТА’ на канву по координатам (x,y)=(50,20) с помощью процедуры TextOut:

Данная процедура имеет три параметра: положение текста по координатам X, Y, а также третий параметр — сам текст.

Немного изменим наш предыдущий пример. Выведем две строки текста друг под другом. Первая строка будет иметь наклонное и жирное начертание, а вторая — жирное и зачеркнутое. Первая строка будет выведена зеленым цветом, а вторая — красным:

<1>Form1.Canvas.Font.Color := clGreen; // устанаваливаем цвет шрифта зеленым

<2>Form1.Canvas.Font.Style := [fsBold,fsItalic]; // жирный и наклонный текст

<3>Form1.Canvas.TextOut(50,10,’Первая строка’); // выводим строку

<4>Form1.Canvas.Font.Color := clRed; // устанаваливаем цвет шрифта красным

<5>Form1.Canvas.Font.Style := [fsBold,fsStrikeOut];// жирный и зачеркнутый текст

<6>Form1.Canvas.TextOut(50,30,’Первая строка’); // выводим строку

В первых двух строчках мы изменяем цвет шрифта и стиль его начертания. Любой текст на канве будет выводиться с этими параметрами, пока они не будут переназначены. В данном случае в третьей строке мы выводим на канву текст. В четвертой и пятой строках мы переназначаем установленные ранее параметры начертания текста. Это означает, что весь последующий вывод текста на данную канву будет использовать стиль начертания, установленный нами последним. Пример запуска приложения показан на рисунке 3.

Рисунок 3 – Вывод текста с помощью процедуры TextOut

Метод TextRect выводит текст с отсечением. Посмотрим на параметры процедуры:

procedure TextRect(Rect: TRect; X, Y: Integer; const Text: string);

Как и в TextOut, строка текста выводится с позиции (X,Y), при этом часть текста, лежащая вне пределов прямоугольника Rect, отсекается и не будет видна.

Приведем пример вывода текста, ограничивая его прямоугольником. В обработчике нажатия кнопки Button1 напишем следующий код:

procedure TForm1.Button1Click(Sender: TObject);

Первая строка изменяет цвет заливки на белый. Это сделано для выделения цветом ограничивающего прямоугольника выводимой текстовой строки.

Вторую строку разберем более подробно. Первым параметром является переменная типа TRect ограничивающего прямоугольника. Мы можем присвоить параметру заранее созданную переменную прямоугольника или создать эту переменную «налету» прямо при указании параметра (так было сделано в приведенном выше примере). В данном примере мы ограничивали текст прямоугольником с начальными координатами (x1,y1)=(10,10) и конечными координатами (x2,y2)=(100,100). Начальными координатами у прямоугольника являются координаты верхнего левого угла, а конечными – правого нижнего угла. Схематично расположение прямоугольника Rect(10,15,100,120) показано на рисунке 4.

Рисунок 4 – Схематичное представление прямоугольника Rect(10,15,100,120)

Вернемся к нашему примеру с выводом текста с помощью процедуры TextRect. Результат выполнения программы показан на рисунке 5.


Рисунок 5 – Пример использования процедуры TextRect

На рисунке 5 видно, что вывод текстовой строки был ограничен прямоугольником Rect(10,10,100,100). Та текстовая часть, которая не попала в рамки данного прямоугольника, была отсечена при выводе.

ОСНОВНЫЕ МЕТОДЫ, ИСПОЛЬЗУЕМЫЕ ДЛЯ РИСОВАНИЯ ПРИМИТИВОВ НА КАНВЕ

Данный метод рисует линию от текущей позиции до позиции (x,y). По умолчанию начальная позиция равна (0,0). После рисования линии текущая позиция станет равной (x,y).

Приведем пример рисования двух линий в компоненте TImage. Следовательно, будем рисовать не на самой форме, а на канве компонента Image, который расположен на вкладке Additional панели компонентов. Добавим данный компонент на форму и в обработчике события нажатия кнопки Button1 напишем следующий код:

Линия рисуется из текущей позиции пера на канве в позицию, заданную пользователем в параметрах. При запуске приложения перо будет находиться в левом верхнем углу канвы, то есть в координатах (0,0) канвы. Таким образом первая линия рисуется из координат (0,0) в координаты (100,90). После отрисовки линии текущей позицией пера становится конечная точка первой линии. Таким образом следующая линия будет рисоваться из координат (100,90) в координаты (120,150). Пример представлен на рисунке 6.

Рисунок 6 – Рисование двух линий

Данный метод изменяет текущую позицию на канве на позицию, заданную параметрами (x,y).

Рассмотрим пример, на котором рисуется две линии с использованием процедуры MoveTo:

image1.Canvas.MoveTo(40,40); // меняем начальную позицию на (40,40)

image1.Canvas.MoveTo(70,40); // меняем начальную позицию на (30,50)

Пример запуска программы показан на рисунке 7.

Рисунок 7 – Рисование двух линий из разных начальных точек с использованием метода MoveTo

Выводит на канву прямоугольник с начальными координатами (x1,y1) и конечными (x2,y2). Начальными координатами является верхний левый угол прямоугольника, а конечными – правый нижний угол (рисунок 4).

Приведем пример рисования прямоугольника на канве компонента image1:

Результат выполнения процедуры показан на рисунке 8.

Рисунок 8 – Рисование прямоугольника с помощью метода Rectangle

Рисует прямоугольник по координатам (x1,y1) и (x2,y2). Углы же скругляются с помощью эллипсов с шириной ex и высотой ey.

Листинг исходного кода (результат показан на рисунке 9):

Рисунок 9 – Рисование прямоугольника со скругленными углами

Рисует окружность или эллипс с помощью текущих параметров пера Pen. Фигура заполняется текущим значением Brush. Точки (x1,y1) и (x2,y2) определяют прямоугольник, описывающий эллипс.

Листинг исходного кода (пример показан на рисунке 10):

Рисунок 10 – Рисование эллипса

Метод Arc(x1,y1,x2,y2,x3,y3,x4,y4: Integer)

Рисует дугу. Точки (x1,y1) и (x2,y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x3,y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x4,y4). Дуга рисуется против часовой стрелки от начальной до конечной точки.

Листинг исходного кода (пример показан на рисунке 11):

Image1.Canvas.Arc(0,0, 200,200, 200,0, 0,0);

Image1.Canvas.Arc(210,0, 410,200, 210,0, 410,0);

Рисунок 11 – Рисование дуги

Метод Chord(x1,y1,x2,y2,x3,y3,x4,y4: Integer)

Метод Chord рисует замкнутую фигуру: дугу окружности или эллипса, замкнутую хордой, с помощью текущих параметров пера Pen. Фигура заполняется текущим значением Brush (рассмотрим чуть ниже). Точки (x1,y1) и (x2,y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x3,y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x4,y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Хорда соединяет точки(x3,y3) и (x4,y4).

Листинг исходного кода (пример показан на рисунке 12):

Image1.Canvas.Chord(0,0, 200,200, 200,0, 0,0);

Image1.Canvas.Chord(210,0, 410,200, 210,0, 410,0);

Рисунок 12 – Рисование дуги окружности или эллипса, замкнутой хордой

Метод Pie (x1,y1,x2,y2,x3,y3,x4,y4:Longint);

Метод Pie рисует замкнутую фигуру — сектор окружности или эллипса, с помощью текущих параметров пера Pen. Фигура заполняется текущим значением Brush. Точки (x1,y1) и (x2,y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x3,y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x4,y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Рисуются прямые, ограничивающие сегмент и проходящие через центр эллипса и точки (x3,y3) и (x4,y4).

Листинг исходного кода (результат показан на рисунке 13):

Image1.Canvas.Pie(0,0, 200,200, 200,0, 0,0);

Image1.Canvas.Pie(210,0, 410,200, 210,0, 410,0);

Рисунок 13 – Рисование сектора окружности или эллипса

Рисует на канве текущим пером кусочно-линейную кривую по заданному множеству точек.

Листинг исходного кода (результат показан на рисунке 14):

Image1.Canvas.Polyline( [ Point(10,10) , Point(200,30) , Point(100,80) ] )

Рисунок 14 – Вывод кусочно-линейной кривой по трем точкам

Рисует на канве текущим пером замкнутую фигуру по заданному множеству угловых точек.

Листинг исходного кода (результат показан на рисунке 15):

Image1.Canvas.Polygon([ Point(10,10) , Point(200,30) , Point(100,80) , Point(100,80)])

Рисунок 15 – Вывод замкнутой фигуры по множеству угловых точек

Предназначен для описания свойств пера (карандаша). Данный инструмент используется канвой для рисования линий (рамой фигур, таких как эллипс, прямоугольник и т.д.).

Основными свойствами данного класса являются:

− Color – задает цвет пера;

− Mode – описывает одну из бинарных растровых операций. Эти операции определяют взаимодействие цвета пера с цветом экрана и соответствуют стандартным операциям, определенным в Windows (таблица 2). По умолчанию установлен режим pmCopy;

Таблица 2 – Возможные значения свойства Mode

Mode (режим) Логическая операция перо-экран Результирующий цвет
pmBlack Black Всегда черный
pmWhite White Всегда белый
pmNop Нет Неизменный
pmNot Not Screen Инверсия цвета экрана
pmCopy Pen Цвет пера, указанный свойством Pen.Color
pmNotCopy Not Pen Инверсия цвета пера
pmMergePenNot Pen or not Screen Дизъюнкция цвета пера и инверсии цвета экрана
pmMaskPenNot Pen and not Screen Конъюнкция цвета пера и инверсии цвета экрана
pmMergeNotPen Not Pen or Screen Дизъюнкция цвета экрана и инверсии цвета пера
pmMaskNotPen Not Pen and Screen Конъюнкция цвета экрана и инверсии цвета пера
pmMerge Pen or Screen Дизъюнкция цвета пера и цвета экрана
pmNotMerge Not (Pen or Screen) Инверсия дизъюнкции цвета пера и цвета экрана
pmMask Pen and Screen Конъюнкция цветов пера и экрана
pmNotMask Not (Pen and Screen) Инверсия конъюнкции цветов пера и экрана
pmXor Pen xor Screen Цвета пера и экрана связаны операцией «исключающее или»
pmNotXor Not (Pen xor Screen) Инверсия операции «исключающее или» для цветов пера и экрана

− Style – определяет стиль линии, рисуемой пером:

Стиль Описание Отображение
psSolid Сплошная линия
psDash Штриховая линия
psDot Пунктирная линия
psDashDot Штрих-пунктирная линия
psDashDotDot Линия, чередующая штрих и два пунктира
psClear Отсутствующая линия
psInsideFrame Сплошная линия, но при width > 1 допускающая цвета, отличные от палитры windows.

− Width – содержит значение толщины пера в пикселах.

Приведем пример изменения свойств пера. Нарисуем эллипс и линию с разными свойствами пера для каждой фигуры.

Листинг исходного кода (результат показан на рисунке 16):

Форум программистов «Весельчак У»

Программирование => Borland C/C++ => Тема начата: oktonion от 04-03-2012 00:11

Название: Прозрачность в TBitmap
Отправлено: oktonion от 04-03-2012 00:11

Здравствуйте,
вопрос в следующем: Как получить на выходе из TBitmap картинку с прозрачным одноцветным фоном?

Пробую (в канве C находится изображение с кусками clGreen):

TPicture *p = new TPicture;
TCanvas *C = new TCanvas;

C->Handle = defHandle;
p->Bitmap->W > p->Bitmap->Height = 111;
p->Bitmap->PixelFormat = pf32bit;
p->Bitmap->Transparent = true;
p->Bitmap->TransparentColor = clGreen;
p->Bitmap->TransparentMode = tmFixed;
p->Bitmap->Canvas->CopyMode = cmSrcCopy;
p->Bitmap->Canvas->CopyRect(
TRect(0, 0, 222, 111),
C,
TRect(55, 55, 222, 111)
);
delete C;
p->Bitmap->SaveToFile(«test.bmp»);
delete p;

Тоесть сначала закрасить канву нужным «прозрачным» цветом, что то такое? :

Илон Маск рекомендует:  Фиксированный дизайн. Наложение слоев
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL