api — C ++ Win32, могут ли элементы управления редактирования быть нарисованы владельцем?

Я пытаюсь настроить диалоговое окно. Я прошел через Google, случайное тестирование и т. Д., Даже читал некоторые места, где это невозможно.

Что я смог сделать, так это использовать одно из сообщений для установки шрифта и цвета, но нигде не про рисование.

Я думаю, что это должно быть в состоянии сделать …

У кого-нибудь есть какие-либо идеи? Или знаете что-нибудь об этом?

http://imageshack.com/a/img832/5955/91m.png

3

Решение

Похоже, что элементы управления редактированием не поддерживают рисование владельца, но вы все равно можете решить свою прямую проблему. В соответствии с страница 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 может быть одним из следующих значений. Есть две проблемы с этим:

  1. Вы можете объединить их, и вы должны для этого работать. MFC тоже это делает. Я проверил.

  2. Вы могли бы написать MAKEWPARAM(MAKEWORD(0, SBT_OWNERDRAW), 0), это не буду Работа. По всей видимости, SBT_ стили определены так, чтобы они автоматически появлялись в старшем байте младшего слова, если вы просто ИЛИ их со своим значением индекса.

Что я должен был взглянуть на исходный код MFC, чтобы выяснить, как использовать SB_SETTEXT правильно говорит.

2

Другие решения

Элементы управления Edit не имеют режима рисования владельцем, однако вы можете создать подкласс элемента управления Edit и обрабатывать такие сообщения, как WM_ERASEBKGND, WM_NCPAINT, WM_PAINTи т. д., а также WM_CTLCOLOREDIT сообщение отправлено в родительское окно редактирования.

1

Ответ для части 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 позволяет вам указать, где вы хотите разместить текст, позволяя редактору иметь большую высоту.

0
По вопросам рекламы [email protected]