2015-12-01 3 views
3

Я пишу плагин для Autodesk 3ds Max, родного, только для Windows-приложения. Плагин написан на C++ и использует необработанный API Win32 для создания своего пользовательского интерфейса, поскольку предполагается, что 3ds Max плагины должны.Изменить цвет элемента управления SysLink

Я хотел бы показать HTML-ссылку в пользовательском интерфейсе плагина, чтобы пользователь мог загрузить новую версию плагина из Интернета. Кажется, что это делает SysLink control.

Трудности: пользовательский интерфейс 3ds Max настраивается. Я бы хотел, чтобы мой плагин был хорошим гражданином, поэтому мне нужен элемент управления SysLink для использования того же цвета, что и другие статические метки.

К сожалению, прямо сейчас текст элемента управления SysLink всегда отображается синим цветом, что не так хорошо работает с темной цветовой темой 3ds Max. Более того, это не похоже, что я могу спросить 3ds Max для его цветовой палитры.

Как я могу использовать элемент управления SysLink того же цвета, что и другие статические метки?

The plugin's user interface with the light theme The plugin's user interface with the dark theme

+2

В весь пользовательский интерфейс оформлен на заказ. Windows означает, что управление внешним видом не поможет, потому что 3ds рисует. Я думаю, это означает, что вам нужно использовать элемент управления, который 3ds знает, как стилизовать. Похоже, он не распознает ссылки sys. Переключитесь на элемент управления, о котором знает 3ds. –

+0

Дело в том, что кнопки и элементы редактирования текста являются настраиваемыми элементами управления 3ds Max, все статические метки являются обычными элементами управления Windows. Это бесит, что SysLink выглядит прилично и работает так, как ожидалось, но просто не отображается в читаемом цвете при использовании темной темы. –

+0

Хотя они могут быть элементами управления окнами, кажется, что 3ds рисует их –

ответ

3

Edit:

Это то, что syslink контроль должен выглядеть по умолчанию:

syslinkControl

Примечание статическая часть черного цвета (такой же, как статические элементы управления) , Только часть ссылки синяя. В вашем случае все всегда синие, а цвет фона соответствует диалоговому цвету. Поэтому приложение уже внесло свои изменения.

Если есть нормальная обработка, то ниже код должен изменить все на красный сообщение:


Используйте WM_CTLCOLORSTATIC, но вы должны сказать syslink управления, чтобы принять изменения цвета:

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 

    case WM_CTLCOLORSTATIC: 
    { 
     HDC hdc = (HDC)wp; 
     SetTextColor(hdc, RGB(255, 0, 0)); 
     SetBkColor(hdc, GetSysColor(COLOR_BTNFACE)); 
     return (LRESULT)GetSysColorBrush(COLOR_BTNFACE); 
    } 

    case WM_INITDIALOG: 
    { 
     ... 
     LITEM item = { 0 }; 
     item.iLink = 0; 
     item.mask = LIF_ITEMINDEX | LIF_STATE; 
     item.state = LIS_DEFAULTCOLORS; 
     item.stateMask = LIS_DEFAULTCOLORS; 
     SendMessage(hsyslink, LM_SETITEM, 0, (LPARAM)&item); 
     ... 
     return TRUE; 
    } 
    ...  
    } 
... 
} 
+0

Спасибо за ваш ответ. Я пробовал ваш код, но по какой-то причине мой цикл сообщений не получает никакого события «WM_CTLCOLORSTATIC». Все еще расследует. –

+0

[Согласно MSDN] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb787524%28v=vs.85%29.aspx), 'WM_CTLCOLORSTATIC' используется только для статического или редактируемого управления. Включает ли SysLink в эту категорию? –

+0

* Как я могу заставить элемент управления SysLink использовать тот же цвет, что и другие статические метки? * С другой стороны, статическая часть элемента управления syslink должна иметь тот же цвет, что и другие статические элементы управления (даже если вы не делаете никаких изменения, которые я предложил). Фон кажется правильным цветом. Может быть, 'WM_CTLCOLORSTATIC' обрабатывается в другом месте. В простом окне или диалоговом окне вы сможете поймать 'WM_CTLCOLORSTATIC' –

Смежные вопросы