У меня есть пользовательский элемент управления, созданный с помощью CreateWindowEx со стилем WS_BORDER. Все работает отлично, за исключением того, что границы отображаются другим цветом в диалоговом окне. Граница моего элемента управления черная, остальные элементы управления имеют синюю рамку. Я попытался вызвать EnableThemeDialogTexture (_dialogHandle, ETDT_ENABLE) после создания элемента управления, а также логику из http://www.patchou.com/projects/richedit/ но безрезультатно. Я использую C ++ и Winapi. то есть. нет MFC, нет .Net. Любое руководство очень ценится.
РЕДАКТИРОВАТЬ: Вот логика, которая работала для меня:
HDC hdc = GetWindowDC(hwnd);
HTHEME themeHandle = OpenThemeData(hwnd, L"Edit");
if(themeHandle)
{
int cxBorder = GetSystemMetrics(SM_CXBORDER);
int cyBorder = GetSystemMetrics(SM_CYBORDER);
RECT rc;
GetClientRect(hwnd, &rc);
OffsetRect(&rc, cxBorder, cyBorder);
ExcludeClipRect(hdc, rc.left, rc.top, rc.right, rc.bottom);
InflateRect(&rc, cxBorder, cyBorder);
DrawThemeBackground(themeHandle, hdc, 0, 0, &rc, NULL);
CloseThemeData(themeHandle);
}
ReleaseDC(hwnd, hdc);
Вы должны нарисовать границу самостоятельно, используя тему из другого элемента управления (например, элемента управления listview или treeview). Для пользовательского дочернего элемента управления нарисовать границу довольно просто — просто обработайте сообщение WM_NCPAINT. Идентификатор детали и идентификатор состояния при рисовании границы должны быть равны 0.
Других решений пока нет …