Похоже управлением редактированием не поддерживает владелец рисовать, но вы можете решить прямую задачу. Согласно the MSDN page for EDITTEXT, по умолчанию элементы управления редактирования в файле ресурсов имеют набор WS_BORDER
. Похоже, вы можете избавиться от него что-то вроде этого:
EDITTEXT IDC_EDIT1,17,51,136,14,ES_AUTOHSCROLL | NOT WS_BORDER
Для строки состояния, вы можете попробовать использовать статический контроль с настраиваемыми цветами вместо бара реального состояния. Или вы можете свернуть свой собственный, указать имя класса окна в файле ресурсов и убедиться, что вы зарегистрировали класс перед отображением диалога.
ОБНОВЛЕНО: Вау, документация для строки состояния ужасна. Тем не менее, вы можете привлечь его. Выполните следующие действия:
// where hStatus is the HWND of a status bar...
// You must set simple mode to false, because simple mode doesn't
// support owner draw.
SendMessage(hStatus, SB_SIMPLE, FALSE, 0);
// I'm assuming 1 status bar part for demonstration. Setting the right edge
// for the 1 part to -1 make it take up the whole status bar.
int partWidths[] = { -1 };
SendMessage(hStatus, SB_PARTS, 1, reinterpret_cast<LPARAM>(partWidths));
// There is background stuff that stays behind even with owner draw,
// so you have to set the background color to black, too, to get rid of
// any appearance of borders.
SendMessage(hStatus, SB_SETBKCOLOR, 0, RGB(0, 0, 0));
// There is still a slim border that stays behind, so you need to set
// SBT_NOBORDERS in addition to SBT_OWNERDRAW. The 0 is the index of the
// status bar part. It could be anything between 0 and 255.
SendMessage(
hStatus,
SB_SETTEXT,
SBT_NOBORDERS | SBT_OWNERDRAW | 0,
reinterpret_cast<LPARAM>(_T("Status")));
Оттуда, вы также должны обрабатывать WM_DRAWITEM
для строки состояния. Теперь о том, почему я говорю, что документация для строки состояния ужасна ...
Документы для SB_SETTEXT
говорят, что старший байт младшего слова слова WPARAM
может быть одним из следующих значений. Есть две проблемы:
Вы можете комбинировать их, и вы должны для этого работать. MFC делает это тоже. Я проверил.
Возможно, возникнет соблазн написать MAKEWPARAM(MAKEWORD(0, SBT_OWNERDRAW), 0)
. Это не будет работы. По внешнему виду стили SBT_
определены так, что они будут автоматически отображаться в высоком байте младшего слова, если вы просто OR их с вашим значением индекса.
То, что я должен был смотреть на исходный код MFC, чтобы выяснить, как использовать SB_SETTEXT
правильно говорит.
Имеет ли ваш контроль какой-либо шанс применить к нему стиль WS_EX_CLIENTEDGE? Кроме того, создаете ли вы это с помощью редактора ресурсов Visual Studio или вручную? – Joel
Я делаю файлы ресурсов вручную, и использовал кнопки BS_OWNERDRAW на кнопках, даже нарисовал состояние вверх/вниз. Я использую wxDev-CPP. EDITTEXT IDC_TIMEINPUT, 5, 135, 160, 12, ES_CENTER // | EMS_OWNERDRAW CONTROL «Status», IDC_STATUSBAR, STATUSCLASSNAME, 0, 0, 0, 0, SBT_OWNERDRAW Являются ли строки такими, как они есть в файле ресурсов. Я также пытался настроить строку состояния, но это как та же проблема с «поднятыми краями». Кроме того, у меня не было WS_EX_CLIENTEDGE, указанного где угодно. Спасибо за ответ. –
Похоже, что элементы управления редактирования в сценариях ресурсов имеют некоторые стили, установленные по умолчанию. Если я создам диалог в Visual Studio и выключу границу, код будет «EDITTEXT IDC_EDIT1,17,51,136,14, ES_AUTOHSCROLL | NOT WS_BORDER', а не включать 'WS_BORDER', когда граница включена. – Joel