2013-07-31 3 views
3

Я пытаюсь настроить свое диалоговое окно. Я прошел через Google, случайное тестирование и т. Д., Даже прочитал некоторые места, которые он не может сделать.C++ Win32, Can Edit Элементы управления могут быть обработаны владельцем?

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

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

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

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

+0

Имеет ли ваш контроль какой-либо шанс применить к нему стиль WS_EX_CLIENTEDGE? Кроме того, создаете ли вы это с помощью редактора ресурсов Visual Studio или вручную? – Joel

+0

Я делаю файлы ресурсов вручную, и использовал кнопки 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, указанного где угодно. Спасибо за ответ. –

+1

Похоже, что элементы управления редактирования в сценариях ресурсов имеют некоторые стили, установленные по умолчанию. Если я создам диалог в Visual Studio и выключу границу, код будет «EDITTEXT IDC_EDIT1,17,51,136,14, ES_AUTOHSCROLL | NOT WS_BORDER', а не включать 'WS_BORDER', когда граница включена. – Joel

ответ

2

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

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

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

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

+0

Спасибо! Это привело к некоторому прогрессу в строке состояния, как я хочу. Все еще работаю с ним. Назад к редактированию, я нахожу все, кроме возможности вертикального выравнивания текста. У меня есть googled все, и самое близкое, что я мог найти, это TextAlign(), который изменит выравнивание на фиксированные позиции и не будет вертикально центрировано. Я потратил пару часов на это, все делается через WM_CTLCOLOREDIT, никакого прогресса. Есть идеи по этому поводу? –

+0

Возможно, вы сможете поиграть с некоторой комбинацией 'EM_SETRECT' и' EM_SETLIMITTEXT', но поскольку 'EM_SETRECT', по-видимому, работает только на многострочных элементах управления редактирования, которые кажутся мне довольно взломанными (хотя это часть API). Я на самом деле не пробовал, поэтому я не могу гарантировать, что это сработает. – Joel

1

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

+1

Это тоже не работает, элемент управления Edit частично перерисовывается без использования WM_PAINT. Очень, очень непослушный, но необходимый взлом, когда он должен был работать на машине 386SUX. –

0

Ответ на часть 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); 

Has быть многострочным, и вы действительно должны играть с разными номерами, чтобы сохранить его сингл морщинами, и поддерживать вертикальное выравнивание.EMS_SETRECTNP позволяет указать, где вы хотите, чтобы текст был, позволяя Edit иметь большую высоту.

Смежные вопросы