dnekrasov

Пользователи
  • Публикаций

    232
  • Зарегистрирован

  • Посещение

  • Победитель дней

    31

Весь контент dnekrasov

  1. dnekrasov

    Перехват сообщений в Windows

    Именно перенос в CreateHandle и решает проблему, описанную @kami
  2. dnekrasov

    Перехват сообщений в Windows

    Ну это нормально - теперь все сообщения окну обрабатываются в NewWndProc А вот это странно - я этот механизм использую еще начиная с XE4 и везде отрабатывал без проблем. Единственное, что мог бы посоветовать - попробуйте перенести переопределение WndProc в CreateHandle. WinHook.zip UPD Поднял старые проекты - именно в CreateHandle я это и делал.
  3. dnekrasov

    Перехват сообщений в Windows

    За счет строчки MainForm.Dispatch(Mess);
  4. dnekrasov

    Перехват сообщений в Windows

    Делаем как обычно, если надо переопределить какое-то событие окна interface uses {$IFDEF MSWINDOWS} Winapi.Windows, Winapi.Messages, FMX.Platform.Win, {$ENDIF} System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs; type TMainForm = class(TForm) private procedure CreateHandle; override; {$IFDEF MSWINDOWS} procedure WMIMENotify(var Msg: TMessage); message WM_IME_NOTIFY; {$ENDIF} public end; var MainForm: TMainForm; implementation {$R *.fmx} {$IFDEF MSWINDOWS} var OldWndProc: Pointer = nil; function NewWndProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; var Mess : TMessage; begin case Msg of WM_IME_NOTIFY: begin Mess.Msg := Msg; Mess.WParam := wParam; Mess.lParam := lParam; Mess.Result := 0; MainForm.Dispatch(Mess); Result := Mess.Result; end; else Result := CallWindowProc(OldWndProc, Wnd, Msg, WParam, LParam); end; end; {$ENDIF} { TMainForm } procedure TMainForm.CreateHandle; begin inherited CreateHandle; {$IFDEF MSWINDOWS} OldWndProc:= Pointer(SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_WNDPROC, Integer(@NewWndProc))); {$ENDIF} end; {$IFDEF MSWINDOWS} procedure TMainForm.WMIMENotify(var Msg: TMessage); begin {что-то делаем} end; {$ENDIF}
  5. Ещё как работает, во всяком случае под винду. Но именно курсора (cur) а не изображения (bmp). CustomCursor.zip
  6. dnekrasov

    TAlphaTrackBar - Настройка цвета.

    Примерно так: var cl: TAlphaColor; begin cl := Rectangle1.Fill.Color; TAlphaColorRec(cl).A := Round(AlphaTrackBar1.Value * 255); Rectangle1.Fill.Color := cl; end;
  7. В файле проекта, до Application.Initialize вставьте GlobalUseDirect2D := False
  8. Да. После изменения масштаба отображаться начинает вроде нормально, даже без перезагрузки приложения, а вот многие API-шные функции, относящиеся к работе с масштабом возвращают старые значения.
  9. Да нет. Это вполне серьёзно. Это настройка и особенность винды и Delphi тут ни при чём. Так что для отладки используйте способ, описанный мною чуть выше. Без перелогина после изменения масштаба Вы ничего не увидите. Заранее сочувствую - я помню как сам намучался, когда отлаживал подобное.
  10. Для отладки - заведите в винде нового пользователя, у него установите масштаб побольше и, переключаясь между основным и ним, отлаживайтесь. Немного геморно но... за неимением гербовой... и т.д. по тексту
  11. Система? Версия Delphi? У меня проблемы возникают только если подключено 2 монитора и на одном мониторе 125, а на другом 100. Кстати - после изменения масштаба обязательно перелогиниться, иначе не всё подхватывается.
  12. Это олдскул. Есть FMX.Platform.IFMXScreenService.GetScreenScale, FMX.Helpers.Win.GetDCScale и FMX.Helpers.Win.GetWndScale
  13. Если правильно помню - у меня проблема была в том, что при расчете использовал как размеры и положение контролов на форме, так и самой формы (как и у Вас). Где-то они уже преобразованы в соответствии с масштабом, а где-то - нет. Для начала попробуйте вычислять координаты с помощью функций ScreenToClient и ClientToScreen, не используя Left, Top, Width и Height формы Я не знаю - баг это был или нет (если баг - то может уже исправлен), но в конечном итоге, умножая то одно то другое на Scale винды, я добился нормального отображения. Замечу, что многое зависит от системы, на которой запускалось приложение - разное поведение на Win7, Win8, Win8.1 и Win10. Так же проверьте - выставлен ли параметр Enable High DPI в параметрах проекта - в зависимости от него API-шные функции винды возвращают разные значения.
  14. Покажите код. У меня когда-то была похожая проблема - может чё посоветую.
  15. Создайте стиль с одним элементом editstyle. После применения его TEdit-ы будут поднимать этот стиль, а остальные контролы будут со стилем по умолчанию.
  16. dnekrasov

    Свой редактор стилей.

    Все ссылки вроде рабочие fmx_decoder.zip fmxStyleEditor.zip
  17. А Вы попробуйте "Link with runtime packages = True", а Runtime packages сделайте пустым. Хотя, конечно, лучше разобраться из-за чего Exception возникает.
  18. В свойствах проекта укажите "Link with runtime packages = False"
  19. Чёт я совсем не понял что Вы делаете в Вашем примере. Зачем использовать маски при сдвиге и совмещении. Просто берёте нужный кусок битмапки (srcRect) и рисуете его там где Вам нужно (dstRect). Если размеры srcRect и dstRect не будут совпадать, то будет еще и масштабирование.
  20. Прежде чем рисовать на канве просто задайте размер результирующей битмапки. В Вашем случае: ... image2.Bitmap.SetSize(300, 300); image2.Bitmap.Canvas.BeginScene; ...
  21. dnekrasov

    FMX Form

    Не за что. Маленькое уточнение - это хорошо работает только если один монитор. Вообще правильнее эмулировать максимизацию окна следующим образом: SetBounds(Screen.DisplayFromRect(Bounds).WorkAreaRect);
  22. dnekrasov

    FMX Form

    А Вы вместо присвоения WindowState сделайте SetBounds(Screen.WorkAreaRect)
  23. dnekrasov

    HueTrackBar

    С помощью одного трэкбара - не получится. Нужно как минимум 2: 1-ый - HuewTrackBar, 2 -ой - BWTrackBar. Далее, с помощью функции HSLToRGB получить RGB: HSLToRGB(HuewTrackBar.Value, 0.5, BWTrackBar.Value). Обычно этого хватает. Если нет - добавьте еще один BWTrackBar для выбора S.
  24. Попробуйте указать полный путь к шрифту, а не только его имя файла.