[CDR 2017-2021] Получить цвета элементов управления

  • Автор темы Автор темы fersat
  • Дата начала Дата начала

fersat

Участник
Топикстартер
Сообщения
40
Реакции
23
Может кто знает как программно получить RGB значения цветов элементов управления Corel?

На данный момент я знаю как получить цвета CommandBar, заголовка окна, рабочей области и TreeView:
Код:
{$APPTYPE CONSOLE}
uses
  Windows,ActiveX,VGCore_TLB,SysUtils;
var
  CorelCLSID:      TGUID;
  CorelApp:        IVGApplication;
  CorelCUIApp:     ICUIApplication;
  CustomizationDS: ICUIDataSourceProxy;
begin
  CoInitialize(0);
  CLSIDFromProgID('CorelDRAW.Application.20',CorelCLSID);
  CoCreateInstance(CorelCLSID,nil,CLSCTX_LOCAL_SERVER,IVGApplication,CorelApp);
  CorelApp.QueryInterface(IID_ICUIApplication,CorelCUIApp);
  CustomizationDS:=CorelCUIApp.DataContext.GetDataSource('CustomizationDS');
  writeln('Panel Color','0x':9,IntToHex(SendMessageW(GetParent(CorelApp.ActiveWindow.Handle),$B451,$136,0),8)); //принимает параметры в диапазоне 0x132 - 0x138, если ошибка, то альфа-канал будет равен 0
  writeln('Border color','0x':8,IntToHex(CustomizationDS.GetProperty('WindowBorderColor'),8));
  writeln('Workspace color','0x':5,IntToHex(CustomizationDS.GetProperty('PageMatColor'),8)); //есть ещё ImageMatColor - не знаю что это
  readln;
end.

Не могу найти цвет кнопок. Ну точнее я понял, что все цвета хранит объект WindowSchemeManager (указатель можно получить через функцию WindowPainter::WindowSchemeManager::Instance библиотеки WindowPainter.dll), но внутренняя структура объекта зависит от версии компилятора, которым собран корел, так что этот вариант отпадает.
 
В ходе исследований наткнулся на оконное сообщение 0xB001, корел отсылает его всем дочерним окнам при изменении цветовой схемы. Также корел регистрирует сообщение 'CrlThemingThemeChangeMsg' через RegisterWindowMessageW, но его отловить не получилось. Может быть кому нибудь пригодится.
 
Просто из любопытства - а зачем?
 
семафорить же ...
1721918162271.png
тыц
1721918190271.png
или
1721918267352.png
 
А почему не через winApi прям с экрана?
 
Через GetPixel как-то не надёжно.

Построил весь интерфейс на 2 цветах, которые получаю через SendMessage. Если SendMessage вернуло ошибку - беру цвета из системы через GetSysColor. Цвет текста либо чёрный либо серый исходя из яркости фона (brightness=r or g or b).

1.gif
 
  • Огонь
Реакции: hdzzz
А не логичнее в таком случае писать интерфейс на VBA, где есть нативные панели и доступ к элементам, а функционал выносить в dll, которую писать хоть на чём?
 
А не логичнее в таком случае писать интерфейс на VBA, где есть нативные панели и доступ к элементам, а функционал выносить в dll, которую писать хоть на чём?
По моему, вопрос топика и заключается в том, чтобы получить доступ к элементам, точнее, к их цветам.
 
По моему, вопрос топика и заключается в том, чтобы получить доступ к элементам, точнее, к их цветам.
Он на Delphi пишет, не на VBA. Вот я и предлагаю разделить функционал и интерфейс, и писать собственно обработку на Delphi, а интерфейс - на VBA, а не заморачиваться с такими низкоуровневыми задачами, как получение цвета кнопки через системные вызовы
 
Он на Delphi пишет, не на VBA. Вот я и предлагаю разделить функционал и интерфейс, и писать собственно обработку на Delphi, а интерфейс - на VBA, а не заморачиваться с такими низкоуровневыми задачами, как получение цвета кнопки через системные вызовы
VBA - это неуклюжая надстройка над дотнетом, на котором сляпан кореловский интерфейс.
Ко всему, что реализовано на VBA можно получить доступ из натива и того же дотнета. Однако, как я понял, нужен доступ к произвольному кореловскому контролу.
 
доступ к элементам, точнее, к их цветам.
так-то Corel в реестр пишет - чего у него пользователем настроено
Код:
[HKCU\SOFTWARE\Corel\CorelDRAW\25.0\Draw\Application Preferences\WindowScheme]
"Colors"="Scheme_02_MediumGrey"
"PageMatColor"="7237230"
"WindowBorderColor"="0"
 
pagematcolor в неведомых попугаях
- скорее всего значения RGB в HEX переведенные в decimal
Код:
Case 15987699 col = "Gray 5%"

Case 15132390 col = "Gray 10%"

Case 14737632 col = "Gray 12.5%"

Case 14277081 col = "Gray 15%"

Case 13421772 col = "Gray 20%"

Case 12632256 col = "Gray 25%"

Case 11776947 col = "Gray 30%"

Case 10921638 col = "Gray 35%"

Case 10526880 col = "Gray 37.5%"

Case 10066329 col = "Gray 40%"

Case 9211020 col = "Gray 45%"

Case 8421504 col = "Gray 50%"

Case 7566195 col = "Gray 55%"

Case 6710886 col = "Gray 60%"

Case 6316128 col = "Gray 62.5%"

Case 5855577 col = "Gray 65%"

Case 5000268 col = "Gray 70%"

Case 4210752 col = "Gray 75%"

Case 3355443 col = "Gray 80%"

Case 2500134 col = "Gray 85%"

Case 2105376 col = "Gray 87.5%"

Case 1644825 col = "Gray 90%"

Case 789516 col = "Gray 95%"
 
Последнее редактирование:
PageMatColor можно получить через COM-интерфейсы. Я выложил код в первом посте. Хотелось бы цвет текста и кнопок.

скорее всего значения RGB

Да это RGB в десятичной системе.
 
писать интерфейс на VBA, где есть нативные панели
Там нет нативных панелей. Ну точнее формы не нативные. А так да - через AddCustomControl можно попробовать.
 
Последнее редактирование: