Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работает функция SelectObject? / 25 сообщений из 36, страница 1 из 2
05.04.2018, 20:09
    #39626368
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
Здравствуйте,

Font назначить канвасу можно так oldfont := selectobject(canvas.handle,MyFont.handle);
В OldFont вернется при этом Handle замененного Font, который можно ему тем же макаром вернуть взад после употребления.
Но почему тогда canvas.font показывает старые значения? Казалось бы, должен показать значения нового фонта, его имя, его размер... Хотя, если попросить canvas нарисовать чего-нибудь, рисует новым фонтом.

Спасибо.
...
Рейтинг: 0 / 0
05.04.2018, 20:51
    #39626389
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
canvas.font ничего не знает о ваших манипуляциях с WinAPI напрямую.
...
Рейтинг: 0 / 0
06.04.2018, 12:05
    #39626708
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
oldFont := canvas.Font;
canvas.Font := MyFont;
try
  ..........
finally
  canvas.Font := oldFont;
end;
...
Рейтинг: 0 / 0
06.04.2018, 14:23
    #39626823
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
_Vasilisk_
Код: pascal
1.
2.
oldFont := canvas.Font; -- здесь назначение ссылки
canvas.Font := MyFont; -- а здесь назначение свойств через assign



Уверены в коде?
...
Рейтинг: 0 / 0
06.04.2018, 15:24
    #39626862
LoneFast
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
Как уже верно сказали - нежелательно смешивать WinAPI и VCL. Обычно будут только глюки.
Максимум что можно попробовать:
Код: pascal
1.
Canvas.Font.Handle:=MyFont;

Но об старом/бывшем думаю можно уже забыть.

А почему вы не хотите хранить нужные экземпляры в виде объектов TFont?
...
Рейтинг: 0 / 0
06.04.2018, 15:53
    #39626887
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
LoneFastА почему вы не хотите хранить нужные экземпляры в виде объектов TFont?

Я не сказал, что не хочу. Я лишь спросил, почему так, как есть. Ответ насчет смешивания - вполне устраивает. VCL и API не надо путать и ожидать от них синхронизации. Смешивать-то можно, но надо понимать последствия.

В отдельных случаях использую сейчас первый вариант, SelectObject, так как он максимально быстро решает задачу замещения и сохранения старого варианта, а во всех остальных - уже через VCL, через canvas.font :=. Пример с OldFont некорректен, так как Tfont - это объект, поэтому, если после работы хотим вернуться к старому объекту, то надо сначала обеспечить объект-приемник, а потом присваивать через Assign его свойствам свойства сохраняемого, потом - обратно. Поэтому canvas.font := не всегда удобен с точки зрения скорости. Само по себе присваивание ничем не медленнее, но если требуется восстановить предыдущее, то накладные расходы слишком велики.
...
Рейтинг: 0 / 0
06.04.2018, 16:05
    #39626898
LoneFast
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
эм... У меня не так:
Код: pascal
1.
2.
3.
var MyFont: TFont;
...
Canvas.Font:=MyFont;

а вот так:
Код: pascal
1.
2.
3.
var MyFont: HFONT;
...
Canvas.Font.Handle:=MyFont;

Можете попытаться даже так:
Код: pascal
1.
2.
3.
4.
5.
6.
var OldFont, NewFont: HFONT;
...
OldFont:=Canvas.Font.Handle;
Canvas.Font.Handle:=NewFont;
...
Canvas.Font.Handle:=OldFont;

Но тут уже без гарантий, не могу просчитать - вдруг VCL некстати полностью очистит Old...


А накладных расходов там практически нету.
Кстати, ещё бывает SaveDC() .
...
Рейтинг: 0 / 0
06.04.2018, 16:48
    #39626922
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
V.Borzov_Vasilisk_
Код: pascal
1.
2.
oldFont := canvas.Font; -- здесь назначение ссылки
canvas.Font := MyFont; -- а здесь назначение свойств через assign


Уверены в коде?У программиста не должно возникнуть сложностей, чтобы переписать
_Vasilisk_
Код: pascal
1.
oldFont := canvas.Font;

на
Код: pascal
1.
2.
3.
4.
5.
6.
oldFont := TFont.Create;
try
  oldFont.Assing(canvas.Font);
finally
  oldFont.Free;
end;
...
Рейтинг: 0 / 0
06.04.2018, 16:56
    #39626924
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
_Vasilisk_У программиста не должно возникнуть сложностей, чтобы переписать
_Vasilisk_
Код: pascal
1.
oldFont := canvas.Font;

на
Код: pascal
1.
2.
3.
4.
5.
6.
oldFont := TFont.Create;
try
  oldFont.Assing(canvas.Font);
finally
  oldFont.Free;
end;



Конечно, сложностей нет. Сложности со скоростью, скорость такой функции падает в полтора раза.
...
Рейтинг: 0 / 0
06.04.2018, 17:31
    #39626936
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
V.BorzovКонечно, сложностей нет. Сложности со скоростью, скорость такой функции падает в полтора раза.
Если так принципиально важна скорость, то имеет смысл вообще отказаться от Canvas и рисовать всё через WinApi.
...
Рейтинг: 0 / 0
06.04.2018, 17:36
    #39626941
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
alekcvpЕсли так принципиально важна скорость, то имеет смысл вообще отказаться от Canvas и рисовать всё через WinApi. Отказаться от canvas? Что предлагаете конкретно?
...
Рейтинг: 0 / 0
06.04.2018, 17:51
    #39626949
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
V.BorzovalekcvpЕсли так принципиально важна скорость, то имеет смысл вообще отказаться от Canvas и рисовать всё через WinApi. Отказаться от canvas? Что предлагаете конкретно?
Что может быть конкретнее?
...
Рейтинг: 0 / 0
06.04.2018, 18:34
    #39626967
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
YuRockV.Borzovпропущено...
Отказаться от canvas? Что предлагаете конкретно?
Что может быть конкретнее?
Здесь непонятно, как значит "отказаться от canvas".

SelectObject - это как раз и есть функция API, и она задействована для максимальной скорости.
...
Рейтинг: 0 / 0
06.04.2018, 18:45
    #39626971
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
LoneFastКстати, ещё бывает SaveDC() . Она для других целей, инструментами холста не оперирует.
...
Рейтинг: 0 / 0
06.04.2018, 18:51
    #39626975
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
Соколинский БорисLoneFastКстати, ещё бывает SaveDC() . Она для других целей, инструментами холста не оперирует.
Ну так она сохраняет состояние сразу всех инструментов. Чтобы, после того, как что-то там поменяли, всё восстановить функцией RestoreDC. Не так?

Только зачем сохранять все инструменты, если нам нужен только один Font, поэтому чаще всего это излишне.
...
Рейтинг: 0 / 0
06.04.2018, 18:54
    #39626976
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
V.BorzovЗдесь непонятно, как значит "отказаться от canvas".Это значит не использовать Canvas. WM_PAINT, BeginPaint...
...
Рейтинг: 0 / 0
06.04.2018, 19:01
    #39626983
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
V.BorzovСоколинский Бориспропущено...
Она для других целей, инструментами холста не оперирует.
Ну так она сохраняет состояние сразу всех инструментов. Чтобы, после того, как что-то там поменяли, всё восстановить функцией RestoreDC. Не так? Не так.
Иногда полезно читать доки.
...
Рейтинг: 0 / 0
06.04.2018, 19:04
    #39626988
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
Соколинский БорисV.Borzovпропущено...

Ну так она сохраняет состояние сразу всех инструментов. Чтобы, после того, как что-то там поменяли, всё восстановить функцией RestoreDC. Не так? Не так.
Иногда полезно читать доки.

"Функция SaveDC сохраняет текущее состояние указанного контекста устройства (DC) путем копирования данных, описывающих выбранные объекты и графические режимы (например, растровое изображение, кисть, палитру, шрифт, ручку, область, режим рисования и режим отображения) в контекст стек."

Что здесь не так?
...
Рейтинг: 0 / 0
06.04.2018, 19:07
    #39626990
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
YuRockV.BorzovЗдесь непонятно, как значит "отказаться от canvas".Это значит не использовать Canvas. WM_PAINT, BeginPaint...
Раскрыть-то мысль свою можете? Непонятно всё равно, как это "не использовать canvas и рисовать всё через winapi". winapi не пользуется canvas? та же selectobject? или это не функция winapi?
...
Рейтинг: 0 / 0
06.04.2018, 19:08
    #39626991
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
V.Borzovwinapi не пользуется canvas?Конечно не пользуется.
Это canvas пользуется winapi.
...
Рейтинг: 0 / 0
06.04.2018, 19:17
    #39626996
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
YuRockV.Borzovwinapi не пользуется canvas?Конечно не пользуется.
Это canvas пользуется winapi.
Хорошо, тогда конкретно: функция

function DrawText(hDC: HDC; lpString: PWideChar; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; external user32 name 'DrawTextW';

использует canvas или не использует? или это не функция winapi?
...
Рейтинг: 0 / 0
06.04.2018, 19:23
    #39626998
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
Ты где-то там видишь в параметрах TCanvas?

Вот и ответ.
...
Рейтинг: 0 / 0
06.04.2018, 19:29
    #39627000
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
rgreatТы где-то там видишь в параметрах TCanvas?

Вот и ответ.

а первый параметр этой функции? туда же передается canvas.handle
...
Рейтинг: 0 / 0
06.04.2018, 19:32
    #39627002
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
Ты уж определись, у канваса есть хендл или у хендла есть канвас.
...
Рейтинг: 0 / 0
06.04.2018, 19:42
    #39627005
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает функция SelectObject?
rgreatТы уж определись, у канваса есть хендл или у хендла есть канвас.
Функции DrawText в любом случае придется передать хендл какого-нибудь канваса, поэтому не понимаю, как можно обойтись тут без канваса.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работает функция SelectObject? / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]