|
|
|
| Привет. Как мне изменить цвет выводимого текста в окне? ну и бэкграунда?
тоесть, что бы не использовать WM_PAINT, просто в эдите, к примеру, что бы другим цветом текст печатался? | |
|
|
|
|
|
|
|
для: AlMag
(26.11.2008 в 23:16)
| | Вырезка из моего WM Today плагина, может чем поможет
UPD: Виноват, не дочитал про контрол в окне.. но все равно :)
/* Прорисовка всего */
void DrawAll()
{
PAINTSTRUCT ps;
HDC dc;
HBITMAP hbmMem, hbmOld;
RECT rc;
/* Подготовки к рисованию */
GetClientRect(::hWnd, &rc);
dc = BeginPaint(::hWnd, &ps);
::hDC = CreateCompatibleDC(dc);
hbmMem = CreateCompatibleBitmap(dc, rc.right, ::ScrHeight);
hbmOld = (HBITMAP) SelectObject(::hDC, hbmMem);
/* Придаем плагину прозрачность */
if (!::selected)
{
TODAYDRAWWATERMARKINFO dwi;
dwi.hdc = ::hDC;
dwi.hwnd = ::hWnd;
dwi.rc = rc;
SendMessage(::hDesktop, TODAYM_DRAWWATERMARK, 0, (LPARAM) &dwi);
}
/* Если плагин выделен - закрашиваем его */
else
{
FillRect(::hDC, &rc, ::hbrHl);
}
/* Фон букв прозрачный */
SetBkMode(::hDC, TRANSPARENT);
/* Цвет текста, в зависимости от состояния выделения плагина */
SetTextColor(::hDC, !::selected ? ::cText : ::cHlText);
/* Прорисовка времени */
if (!::editor)
{
DrawTime();
}
/* Или даты для описания */
else
{
rc.left = _(3);
rc.top = _(3);
TCHAR date[MAX_PATH];
wsprintf(date, L"%d %s %d", ::editing+1, _e(::months[::month_now], ::e_months[::month_now]), ::year_now);
DrawText(::hDC, date, -1, &rc, DT_SINGLELINE);
}
/* Завершение рисования и удаление временных объектов */
BitBlt(dc, 0, 0, rc.right, ::ScrHeight, ::hDC, 0, 0, SRCCOPY);
SelectObject(::hDC, hbmOld);
DeleteObject(hbmMem);
DeleteDC(::hDC);
EndPaint(::hWnd, &ps);
}
|
| |
|
|
|
|
|
|
|
для: bronenos
(27.11.2008 в 01:10)
| | Виноват, не сказал, что это надо на чистом WinApi :)
как вообще это без WM_PAINT сделать? | |
|
|
|
|
|
|
|
для: AlMag
(27.11.2008 в 01:19)
| | WM_ERASEBKGND
Обрабатывайте это сообщение и устанавливайте свой цвет фона. Я так делал. | |
|
|
|
|
|
|
|
для: GeorgeIV
(27.11.2008 в 09:59)
| | не выходит у меня. можете кусок кода привести, как установить, например, в эдите крассный цвет фона | |
|
|
|
|
|
|
|
для: AlMag
(27.11.2008 в 16:58)
| | Если хотитет "типовому" окну добавить какие то нестандартные свойства или поведение, лучше использовать сабклассинг. Но без обработки WM_PAINT все равно не обойтись, по моему.
Можно еще попробовать получить DC едита и использовать ф-цию Set BkColor, но я не пробовал ни разу использовать ее вне обработчика WM_PAINT, поэтому не уверен.
вот кусок кода, который красит едит в красный цвет
WNDPROC old_proc;
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
hEdit = CreateWindow(_T("EDIT"), _T("Edit"), WS_CHILD | WS_VISIBLE,
10,10, 120, 20, hWnd, NULL, hInstance, NULL);
old_proc = (WNDPROC)SetWindowLong(hEdit, GWL_WNDPROC, (LONG) WndProc);
// сохраним указатель на себя
SetWindowLong(hEdit,GWL_USERDATA,(LONG) hEdit);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
BOOL IsEdit = FALSE;
COLORREF m_BackColor = RGB(255, 255, 255);
RECT rect;
HBRUSH brh;
HWND hEWnd = (HWND) GetWindowLong(hWnd,GWL_USERDATA);
if (hWnd == hEWnd)
{
IsEdit = TRUE;
m_BackColor = RGB(255, 0,0);
}
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rect);
brh = CreateSolidBrush(m_BackColor);// фон заливки окна
FillRect(hdc, &ps.rcPaint, brh);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
|
| |
|
|
|
|
|
|
|
для: GeorgeIV
(28.11.2008 в 09:41)
| | спасибо. Хорошо, а если делать построчную закраску? например, что бы выделить строчку в эдите другим цветом, можно так? | |
|
|
|
|
|
|
|
для: AlMag
(29.11.2008 в 23:35)
| | В смысле так (цвета к примеру)?
черный
серый
черный
серый | |
|
|
|
|
|
|
|
для: bronenos
(30.11.2008 в 01:36)
| | ну да. черный, крассный, все равно, главное, принцып | |
|
|
|
|
|
|
|
для: AlMag
(29.11.2008 в 23:35)
| | Очень советую разобраться с обработчиком M_PAINT. Я когда его освоил, жизнь стала гораздо легче, именно тут решается бОльшая часть отобразительных вопросов.
Общий принцип цветовой раскраски едита таков:
1. Заливаете фон (потому что едит может быть не полностью заполнен строками)
2. Вычисляете высоту строки по известному вам шрифту (если не установили сами, значит по системному)
3. Последовательно идете сверху вниз, формируете прямоугольные области каждой строки, заливаете ее фон нужным цветом, устанавливаете бэкграунд текста таким же, устанавливаете цвет текста в нужный и выводите текст. (Можно еще делать фон текста прозрачным, но, мне кажется, это дело вкуса) .И так в цикле, пока не закончатся строчки. При этом, естественно, у вас для каждой строки должен быть задан цвет фона и цвет текста. | |
|
|
|
|
|
|
|
для: GeorgeIV
(30.11.2008 в 09:56)
| | Ну да, и через инкремент статической переменной через
(i & 1) - это вместо (i % 2), только побыстрее пашет
Переключаете цвет нанужный | |
|
|
|
|
|
|
|
для: bronenos
(30.11.2008 в 10:05)
| | Ну это если зебра нужна, описывал вариант в общем, с произвольной раскраской фона.
Если зебра, то согласен. | |
|
|
|
|
|
|
|
для: GeorgeIV
(30.11.2008 в 10:08)
| | Спасибо, сейчас попробую | |
|
|
|
|
|
|
|
для: AlMag
(27.11.2008 в 01:19)
| | А это и был чистый | |
|
|
|
|
|
|
|
для: bronenos
(28.11.2008 в 20:51)
| | Я думаю, товарища немного стиь смутил, применение :: насколько здесь необходимо? | |
|
|
|
|
|
|
|
для: GeorgeIV
(30.11.2008 в 09:58)
| | Да, Вы правы, немного смутил :) | |
|
|
|
|
|
|
|
для: GeorgeIV
(30.11.2008 в 09:58)
| | Лично для себя, чтобы видеть, какие переменные внутренние, а какие глобальные (по обращению к namespace) | |
|
|
|
|
|
|
|
для: bronenos
(02.12.2008 в 00:27)
| | Понятно. Я обычно именованием переменных разделяю для себя. Но это, как говорится, дело вкуса и привычки. | |
|
|
|
|
|
|
|
для: GeorgeIV
(02.12.2008 в 09:44)
| | Понятно тогда :)
И еще, в диалоговом окне, если я не ошибаюсь, не обрабатывается сообщение WM_PAINT?
как там тогда фон менять? или нельзя вообще? | |
|
|
|
|
|
|
|
для: AlMag
(02.12.2008 в 15:15)
| | Отрабатывается, как в любом другом окне, имеющем оконную процедуру.
Для проверки перенес кусок кода из оконной процедуры главного окна в диалоговое, цвет диалогового окна поменялся. Аналогично можно поменять прорисовку элементов диалогового окна, только у них соответственно надо указывать оконную процедуру этого диалогового окна | |
|
|
|
|
|
|
|
для: GeorgeIV
(03.12.2008 в 09:55)
| | круто! спасибо большое всем за ответы! | |
|
|
|
|