|
|
| Посл.отвђт | Сообщен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 |