Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 11.01.2021, 13:14   #11
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 25
По умолчанию

Скомпилировалось только после некоторых изменений:

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  IconSizeX : integer;
  IconSizeY : integer;
  AndMask : Graphics.TBitmap;
  XOrMask : Graphics.TBitmap;
  IconInfo : TIconInfo;
  icons : TIcon;

begin

{Получаем размер иконки}
IconSizeX := GetSystemMetrics(SM_CXICON);
IconSizeY := GetSystemMetrics(SM_CYICON);

{Создаём маску "And"}
AndMask := Graphics.TBitmap.Create;
AndMask.Monochrome := true;
AndMask.Width := IconSizeX;
AndMask.Height := IconSizeY;

{Рисуем на маске "And"}
AndMask.Canvas.Brush.Color := clWhite;
AndMask.Canvas.FillRect(0, 0, IconSizeX, IconSizeY);
AndMask.Canvas.Brush.Color := clBlack;
AndMask.Canvas.Ellipse(4, 4, IconSizeX - 4, IconSizeY - 4);
AndMask.Mask(clWhite);

{Рисуем для теста}
Form1.Canvas.Draw(IconSizeX * 2, IconSizeY, AndMask);

{Создаём маску "XOr"}
XOrMask := Graphics.TBitmap.Create;
XOrMask.Width := IconSizeX;
XOrMask.Height := IconSizeY;

{Рисуем на маске "XOr"}
XOrMask.Canvas.Brush.Color := clBlack;
XOrMask.Canvas.FillRect(0, 0, IconSizeX, IconSizeY);
XOrMask.Canvas.Pen.Color := clRed;
XOrMask.Canvas.Brush.Color := clRed;
XOrMask.Canvas.Ellipse(4, 4, IconSizeX - 4, IconSizeY - 4);

{Рисуем в качестве теста}
Form1.Canvas.Draw(IconSizeX * 4, IconSizeY, XOrMask);

{Создаём иконку}
icons := TIcon.Create;
IconInfo.fIcon := true;
IconInfo.xHotspot := 0;
IconInfo.yHotspot := 0;
IconInfo.hbmMask := AndMask.MaskHandle;
IconInfo.hbmColor := XOrMask.Handle;
icons.Handle := CreateIconIndirect(IconInfo);

{Уничтожаем временные битмапы}
AndMask.Free;
XOrMask.Free;

{Рисуем в качестве теста}
Form1.Canvas.Draw(IconSizeX * 6, IconSizeY, icons);

{Объявляем иконку в качестве иконки приложения}
Application.Icon := icons;

{генерируем перерисовку}
InvalidateRect(Application.Handle, nil, true);

{Освобождаем иконку}
icons.Free;

end;
Но результат какой-то не такой
IvaNoff2020 вне форума Ответить с цитированием
Старый 11.01.2021, 13:21   #12
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,248
По умолчанию

Цитата:
Сообщение от IvaNoff2020 Посмотреть сообщение
Но результат какой-то не такой
Что значит не такой? Принскрин приложите. Можно залить на http://postimages.org
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 11.01.2021, 14:28   #13
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 25
По умолчанию

Pavia, Результат не такой, потому что у меня задача другая.
Выше kvitaliy, мне посоветовал почитать о win API функции CreateIconIndirect. Сказал, примеров в сети полно. Я искал, искал - не нашлось. Видимо плохо искал.
В итоге, что и нашел совсем не то, что нужно. И это "не то" сначала у меня не работало, теперь работает. Но мне нужно не иконку Form.Caption менять, а сам курсор.
Ниже скину то, что на данный момент я сделал. Там все косячно, но принцип работы должен стать понятен.
На примере круга: задаем его размер в пикселях. выбираем его цвет. сохраняем в *.bmp.
Затем конвертируем в *.ico.
И меняем курсор на свой.
Вложения
Тип файла: 7z курсор.7z (178.9 Кб, 5 просмотров)
IvaNoff2020 вне форума Ответить с цитированием
Старый 13.01.2021, 09:31   #14
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 25
По умолчанию

IvaNoff2020,
Господа, можете подсказать с некоторым вопросом?
Проблема в том, что .*bmp не поддерживает прозрачность.
И замена курсора после конвертирования не дает возможности (или просто у меня не вышло) изменения размера. Т.е. он масштабируется в меньшую сторону под размер стандартного курсора. Ну, да ладно.

Решил воспользоваться советом MihalNik: "с перемещением изоображения ("курсора"), показывать на соответствующем месте".
Но и тут трудность возникла - потому что если я скрываю курсор, то снова включить его проблематично. Нужно скрыть стандартный курсор при наведении на границах Image и снова показать его за пределами Image.
Вариант с ShowCursor(false) ShowCursor(true) не совсем подходит т.к. не могу указать границы Image2.
Координаты отсчитываются от верхнего левого угла монитора. И смещая окно координаты меняются.
Есть какие аналоги ShowCursor(false)?
Вложения
Тип файла: 7z курсор_вер2.7z (776.9 Кб, 1 просмотров)
IvaNoff2020 вне форума Ответить с цитированием
Старый 13.01.2021, 23:05   #15
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 25
По умолчанию

IvaNoff2020, Уже не надо. Сделал что хотел
IvaNoff2020 вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение изображения с ФРАГМЕНТОМ другого изображения egorka2134 Общие вопросы Delphi 8 13.08.2013 18:04
Классы. Чтение и создание .bmp изображения. Пропадает 1 пиксел при создании изображения. s-mumrik Visual C++ 3 12.04.2013 20:21
Сохранить текущий курсор в файл .cur Тоба Win Api 9 17.05.2011 05:41
Загрузка курсора из фаила *.cur и/или *.res Ciberal Общие вопросы Delphi 2 29.10.2008 19:25
конвертер KORT Свободное общение 3 27.08.2007 00:47


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS