· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Установка цвета шрифта и фона в Edit

Посл.отвђт Сообщенiе


Дата: Июн 20, 2003 10:34:05

Нужно сделать вожможность установки цвета шрифта и цвета фона для стандартного EDIT'а.

Размер, название, кодировка, стиль шрифта устанавливаются прекрасно. А вот цвет - нет :( Флаг CF_EFFECTS для структуры CHOOSEFONT установлен.

Цвет фона получается установить только при обработке события WM_CTLCOLOREDIT. При обработке других событий цвет не ставится :( Причем цвет фона устанавливается очень странно - только для той части окна, в которой есть текст :( А мне надо чтобы окно было залито полностью.

Как установить цвет фона в ЛЮБОЙ нужный момент, а не только при обработке WM_CTLCOLOREDIT?

Заранее большое спасибо!


Дата: Июн 20, 2003 11:17:13

SetBkColor() и возращение кисти для заднего фона, но только при WM_CTLCOLOREDIT.


Дата: Июн 20, 2003 12:13:15

comrade
Так я и устанавливаю шрифт фона с помощью SetBkColor. Но устанавливается цвет криво (см. выше) и только при событии WM_CTLCOLOREDIT. При попытке вызвать SetBkColor в любой момент времени не могу получить правильный хенлд контрола (HDC) и поэтому цвет не устанавливается. Хенлд пробовал получать с помощью функций GetDC и GetWindowDC - ни одна не возвращает правильный хендл :(
Устанавливать цвет так же как при событии WM_CTLCOLOREDIT

invoke SetBkColor,wParam,00aabbcch

тоже не могу, потому что в wParam лежит не хендл контрола, а индентификатор пункта меню, кликая по которому я хочу сменить цвет.


Дата: Июн 20, 2003 12:30:42

В общем задача такова: я сделал главное меню в котором есть пункты выбора шрифта и цвета фона. Я хочу, чтобы при нажатии на пункт "Шрифт" у меня устанавливался шрифт (причем обязательно и выбранный цвет шрифта тоже) и при нажании на пукнт "Цвет фона" устанавливался цвет фона.

Вот теперь вроде бы задачи ясны :)


Дата: Июн 20, 2003 12:34:39

Gloomy
WM_CTLCOLOREDIT приходит перед каждой отрисовкой edit-control'а.
Если делать, как показал Quantum Июн 20, 2003 02:23:10 на второй странице темы Плавная минимизация окна, то все ok. Разве что он не показал, откуда брать hBrush неужели не догадываетесь?


Дата: Июн 20, 2003 12:49:18

P2M
Сорри, не заметил поста Quantum
А как сделать чтобы шрифт цветной был?


Дата: Июн 20, 2003 13:09:33

Gloomy
Для установки шрифта надо послать edit'у сообщение WM_SETFONT с wParam равным HFONT'у.

А как сделать чтобы шрифт цветной был?
Разве цвет не меняется в ответ на SetTextColor в ответ на WM_CTLCOLOREDIT?


Дата: Июн 20, 2003 14:17:12

P2M
надо послать edit'у сообщение WM_SETFONT
Я так и делаю ;)

Разве цвет не меняется в ответ на SetTextColor в ответ на WM_CTLCOLOREDIT?
Меняется. А как прикрутить его к диалогу выбора шрифта?

Нашел на WASM.RU небольшой пример установки цвета фона:

.ELSEIF uMsg==WM_CTLCOLOREDIT
mov eax,lParam
.if eax==hwndEdit
invoke CreateSolidBrush,color
mov hBrush,eax
ret
.endif

; при нажатии на пунккт меню
.ELSEIF wParam==MENU_BG_COLOR
mov cc.lStructSize,sizeof cc
push hwnd
pop cc.hwndOwner
mov cc.rgbResult,0
mov cc.Flags,CC_FULLOPEN+CC_RGBINIT
mov cc.lpCustColors,offset rgb
invoke ChooseColor, ADDR cc
.if eax==TRUE
push cc.rgbResult
pop color
invoke InvalidateRect,hwndEdit,NULL,TRUE
.endif

Все работает, цвет фона устанавливается. Но опять как-то странно - устанавливается

он только на ну часть контрола, где нет текста :( Где текст есть - все остается белым :(


Дата: Июн 20, 2003 14:36:39

он только на ну часть контрола, где нет текста :( Где текст есть - все остается белым :(

SetBkMode(hDC,TRANSPARENT) - будет рисоваться только текст, без фона


Дата: Июн 20, 2003 16:08:02

Black_mirror
Почитайте пожалуйста мои выше написанные посты - я не могу получить HDC, т.к. в нем в момент вызова диалога лежит не хендл окна, а индентификатор пункта меню.


Дата: Июн 20, 2003 19:42:05

Плюнул на EDIT, решил использовать RichEdit. И опять проблемы: никак не ставится цвет шрифта :( Цвет фона устанавливается просто превосходно, а вот цвет шрифта - никак :(
Написал такую функцию:

SetColor proc TextColor:DWORD, BackGroundColor:DWORD
LOCAL cfm:CHARFORMAT
mov eax,BackGroundColor
.if eax!=0
invoke SendMessage,hwndRichEdit,EM_SETBKGNDCOLOR,0,BackGroundColor
.endif
mov eax,TextColor
.if eax!=0
invoke RtlZeroMemory,addr cfm,sizeof cfm
mov cfm.cbSize,sizeof cfm
mov cfm.dwMask,CFM_COLOR
push TextColor
pop cfm.crTextColor
invoke SendMessage,hwndRichEdit,EM_SETCHARFORMAT,4,addr cfm
.endif
ret
SetColor endp

Вроде бы все стандартно - пример скачал с WASM.RU. Но не работает :( Цвет фона ставится замечательно, а вот шрифта - никак :(


Дата: Июн 21, 2003 05:30:49 · Поправил: Quantum

Gloomy
Плюнул на EDIT, решил использовать RichEdit
Плюньте и на RichEdit. Не дзенский это контрол.

Нашел на WASM.RU небольшой пример установки цвета фона:
Почти то что вам надо, но лучше так:

.ELSEIF uMsg == WM_CTLCOLOREDIT
mov eax,lParam
.IF eax == hwndEdit
; согласно совету Black_mirror
invoke SetBkMode,wParam,TRANSPARENT
invoke CreateSolidBrush,color
mov hBrush,eax
ret
.ENDIF
.ELSEIF wParam == MENU_BG_COLOR
mov cc.lStructSize,sizeof cc
push hwnd
pop cc.hwndOwner
mov cc.rgbResult,0
mov cc.Flags,CC_FULLOPEN+CC_RGBINIT
mov cc.lpCustColors,OFFSET rgb
invoke ChooseColor, ADDR cc
.IF eax == TRUE
push cc.rgbResult
pop color
invoke InvalidateRect,hwndEdit,NULL,TRUE
.ENDIF


Дата: Июн 23, 2003 05:46:02

Gloomy
Плюнул на EDIT, решил использовать RichEdit. И опять проблемы
У меня с edit'ом проблем нет.
1. При старте программы, например, в WM_CREATE:
[code]
case WM_CREATE:
clrText = RGB(0x00, 0x00, 0x00);
clrBack = RGB(0xFF, 0xFF, 0xFF);
hbrBack = CreateSolidBrush(clrBack);
hwndEdit = CreateWindow("edit", ...
...
[/code]

2. Обработчик WM_CTLCOLOREDIT:
[code]
case: WM_CTLCOLOREDIT:
if ( NULL != hwndEdit && (HWND)lParam == hwndEdit)
{
SetBkColor((HDC)wParam, clrBack);
SetTextColor((HDC)wParam, clrText);
return (LRESULT) hbrBack;
}
break;
[/code]

3. Обработчики пунктов меню для установки цвета текста, фона и шрифта:
[code]
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDM_CLRTEXT:
if (NULL != hwndEdit && FALSE != MyChooseColor(hwnd, &clrText))
InvalidateRect(hwndEdit, NULL, TRUE);
return 0;

case IDM_CLRBACK:
if (NULL != hwndEdit && FALSE != MyChooseColor(hwnd, &clrBack))
{
if (NULL != hbrBack) DeleteObject(hbrBack);
hbrBack = CreateSolidBrush(clrBack);
InvalidateRect(hwndEdit, NULL, TRUE);
}
return 0;

case IDM_FONT:
if (NULL != hwndEdit && FALSE != MyChooseFont(hwnd, &hFont))
{
SendMessage (hwndEdit, WM_SETFONT, (WPARAM) hFont, 0);
InvalidateRect(hwndEdit, NULL, TRUE);
}
return 0;
...
[/code]

4. Не забыть по завершению работы уничтожить GDI-объекты:
[code]
case WM_DESTROY:
if (NULL != hFont) DeleteObject(hFont);
if (NULL != hbrBack) DeleteObject(hbrBack);
...
[/code]

PS Внутри MyChooseFont для исключения утечки старый hFont удаляется.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.073