Диалоговое окно с вкладкой имеет цвет фона, отличный от элемента управления вкладкой

Я создаю диалог с вкладкой управления. На каждой вкладке должен отображаться различный набор элементов управления, поэтому я создал дочерние диалоговые окна в редакторе ресурсов, которые ведут себя как страницы.

Я использовал инструкции из этого поста, чтобы сделать это.

В редакторе ресурсов я сделал диалоговые окна без рамки, установив их стили Child, убрал системное меню, и я установил флаги Control а также Control Parent в true,

В моем дочернем диалоговом окне процедуры, которые я обработал WM_INITDIALOG добавляя EnableThemeDialgTexture(handleOfmyDialog, ETDT_ENABLETAB); и возвращаясь TRUE, нет WM_ERASEBKGND, WM_PAINT или же WM_CTLCOLORDLG были отменены

В главном диалоговом окне, которое содержит вкладку, я создал "дочерние диалоги" с CreateDialog функция, и использовали MoveWindow правильно расположить их.

Я не пользовалась EndDialog уничтожить "дочерние диалоги" на IDCANCEL или же WM_CLOSEЯ думаю, что они будут уничтожены автоматически.

Я использовал Visual Studio 2013 на Windows 8.1, чтобы сделать все это.

Кажется, в Windows 7 и Windows 8.1 проблем нет, но, возможно, мои глаза со мной подшучивают, так как цвет фона элемента управления вкладкой аналогичен цвету фона по умолчанию для диалогового окна. Проблема лучше всего видна в Windows XP, как показано на рисунке ниже:

Как сделать цвет фона "дочерних диалогов" (и их дочерних элементов управления, таких как флажок / трекбар / радиокнопка / статический элемент управления) прозрачным (соответствовать цвету фона элемента управления вкладками)?

Спасибо.

1 ответ

Решение

Это довольно простая проблема. Вы не можете увидеть ошибку в более поздней версии Windows, потому что они больше не используют градиент для "текстуры". EnableThemeDialogTexture() работал нормально, ваш диалог, безусловно, имеет ту же текстуру, что и табулятор. Начало кисти начинается в верхнем левом углу диалога. Как и для tabcontrol. Но диалог не расположен правильно, теперь градиенты выровнены неправильно, и диалог больше не смешивается.

Вам нужно переместить диалоговое окно, чтобы оно правильно расположилось внутри области вкладки. Соответствующая строка кода из статьи MSDN:

// Size the dialog box. 
SetWindowPos(hwndDlg, NULL, 
    0, 0,                                                           // <=== here!
    rcTab.right + cyMargin + (2 * GetSystemMetrics(SM_CXDLGFRAME)), 
    rcTab.bottom + rcButton.bottom + (2 * cyMargin)
    + (2 * GetSystemMetrics(SM_CYDLGFRAME)) 
    + GetSystemMetrics(SM_CYCAPTION), 
    SWP_NOMOVE | SWP_NOZORDER); 

Расположенный в (0, 0) в клиентской области tabcontrol, теперь градиенты выравниваются.

Наблюдение Ганса правильное, но приводит к неверным выводам.

Действительно, EnableThemeDialogTexture()сработало: явно есть градиент на фоне элемента управления Slider. И действительно, он не совпадает с фоном вкладки.

Однако это не проблема центровки. Градиент, который вы видите на элементе управления Slider, является правильным градиентом в соответствии сEnableThemeDialogTexture(). Градиент на фоне на самом деле неправильный. Вы можете отчетливо видеть это с улучшенным контрастом - градиент фона блочный и грубый, а градиент слайдера совершенно хороший.

Я наблюдал это точное поведение, когда в главном окне был WS_CLIPCHILDRENстиль установлен при неправильном Z-порядке (вкладка над дочерним элементом). Переместите дочерние диалоговые окна в начало Z-порядка с помощьюSetWindowPos(child, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE) и он должен идеально выровняться и больше не быть блочным.

Другие вопросы по тегам