Диалоговое окно с вкладкой имеет цвет фона, отличный от элемента управления вкладкой
Я создаю диалог с вкладкой управления. На каждой вкладке должен отображаться различный набор элементов управления, поэтому я создал дочерние диалоговые окна в редакторе ресурсов, которые ведут себя как страницы.
Я использовал инструкции из этого поста, чтобы сделать это.
В редакторе ресурсов я сделал диалоговые окна без рамки, установив их стили 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)
и он должен идеально выровняться и больше не быть блочным.