Я пытаюсь настроить диалоговое окно. Я прошел через Google, случайное тестирование и т. Д., Даже читал некоторые места, где это невозможно.
Что я смог сделать, так это использовать одно из сообщений для установки шрифта и цвета, но нигде не про рисование.
Я думаю, что это должно быть в состоянии сделать …
У кого-нибудь есть какие-либо идеи? Или знаете что-нибудь об этом?
Похоже, что элементы управления редактированием не поддерживают рисование владельца, но вы все равно можете решить свою прямую проблему. В соответствии с страница MSDN для 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_
стили определены так, чтобы они автоматически появлялись в старшем байте младшего слова, если вы просто ИЛИ их со своим значением индекса.
Что я должен был взглянуть на исходный код MFC, чтобы выяснить, как использовать SB_SETTEXT
правильно говорит.
Элементы управления Edit не имеют режима рисования владельцем, однако вы можете создать подкласс элемента управления Edit и обрабатывать такие сообщения, как WM_ERASEBKGND
, WM_NCPAINT
, WM_PAINT
и т. д., а также WM_CTLCOLOREDIT
сообщение отправлено в родительское окно редактирования.
Ответ для части 2, выравнивание текста по вертикали в редактировании:
RECT rect;
GetClientRect(GetDlgItem(hwnd, IDC_TIMEINPUT),&rect);
Rectangle(hdcEdit, rect.left, rect.top, rect.right, rect.bottom);
rect.left+=5; rect.top+=5; rect.right+=5; //rect.bottom+=5;
SendMessage(GetDlgItem(hwnd, IDC_TIMEINPUT), EM_SETRECTNP, 0, (LPARAM)&rect);
Должно быть многострочным, и вам действительно нужно поиграться с разными числами, чтобы сохранить его на одной линии, и поддерживать вертикальное выравнивание. EMS_SETRECTNP позволяет вам указать, где вы хотите разместить текст, позволяя редактору иметь большую высоту.