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

fersat

Участник
Топикстартер
Сообщения
40
Реакции
22
Может кто знает как программно получить 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), но внутренняя структура объекта зависит от версии компилятора, которым собран корел, так что этот вариант отпадает.
 

fersat

Участник
Топикстартер
Сообщения
40
Реакции
22
В ходе исследований наткнулся на оконное сообщение 0xB001, корел отсылает его всем дочерним окнам при изменении цветовой схемы. Также корел регистрирует сообщение 'CrlThemingThemeChangeMsg' через RegisterWindowMessageW, но его отловить не получилось. Может быть кому нибудь пригодится.
 

zollinger

Участник
Сообщения
619
Реакции
191
Просто из любопытства - а зачем?
 

dastin

Некромант-любитель
12 лет на форуме
Сообщения
2 234
Реакции
2 120
семафорить же ...
1721918162271.png
тыц
1721918190271.png
или
1721918267352.png
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 386
Реакции
10 891
А почему не через winApi прям с экрана?
 

fersat

Участник
Топикстартер
Сообщения
40
Реакции
22
Через GetPixel как-то не надёжно.

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

1.gif
 

zollinger

Участник
Сообщения
619
Реакции
191
А не логичнее в таком случае писать интерфейс на VBA, где есть нативные панели и доступ к элементам, а функционал выносить в dll, которую писать хоть на чём?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 386
Реакции
10 891
А не логичнее в таком случае писать интерфейс на VBA, где есть нативные панели и доступ к элементам, а функционал выносить в dll, которую писать хоть на чём?
По моему, вопрос топика и заключается в том, чтобы получить доступ к элементам, точнее, к их цветам.
 

zollinger

Участник
Сообщения
619
Реакции
191
По моему, вопрос топика и заключается в том, чтобы получить доступ к элементам, точнее, к их цветам.
Он на Delphi пишет, не на VBA. Вот я и предлагаю разделить функционал и интерфейс, и писать собственно обработку на Delphi, а интерфейс - на VBA, а не заморачиваться с такими низкоуровневыми задачами, как получение цвета кнопки через системные вызовы
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 386
Реакции
10 891
Он на Delphi пишет, не на VBA. Вот я и предлагаю разделить функционал и интерфейс, и писать собственно обработку на Delphi, а интерфейс - на VBA, а не заморачиваться с такими низкоуровневыми задачами, как получение цвета кнопки через системные вызовы
VBA - это неуклюжая надстройка над дотнетом, на котором сляпан кореловский интерфейс.
Ко всему, что реализовано на VBA можно получить доступ из натива и того же дотнета. Однако, как я понял, нужен доступ к произвольному кореловскому контролу.
 

dastin

Некромант-любитель
12 лет на форуме
Сообщения
2 234
Реакции
2 120
доступ к элементам, точнее, к их цветам.
так-то Corel в реестр пишет - чего у него пользователем настроено
Код:
[HKCU\SOFTWARE\Corel\CorelDRAW\25.0\Draw\Application Preferences\WindowScheme]
"Colors"="Scheme_02_MediumGrey"
"PageMatColor"="7237230"
"WindowBorderColor"="0"
 

dastin

Некромант-любитель
12 лет на форуме
Сообщения
2 234
Реакции
2 120
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%"
 
Последнее редактирование:

fersat

Участник
Топикстартер
Сообщения
40
Реакции
22
PageMatColor можно получить через COM-интерфейсы. Я выложил код в первом посте. Хотелось бы цвет текста и кнопок.

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

Да это RGB в десятичной системе.
 

fersat

Участник
Топикстартер
Сообщения
40
Реакции
22
писать интерфейс на VBA, где есть нативные панели
Там нет нативных панелей. Ну точнее формы не нативные. А так да - через AddCustomControl можно попробовать.
 
Последнее редактирование: