Форум: Форум C++Разное
Новые темы: 00
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: цвет текста в окне
 
 автор: AlMag   (26.11.2008 в 23:16)   письмо автору
 
 

Привет. Как мне изменить цвет выводимого текста в окне? ну и бэкграунда?
тоесть, что бы не использовать WM_PAINT, просто в эдите, к примеру, что бы другим цветом текст печатался?

  Ответить  
 
 автор: bronenos   (27.11.2008 в 01:10)   письмо автору
 
   для: 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);
}

  Ответить  
 
 автор: AlMag   (27.11.2008 в 01:19)   письмо автору
 
   для: bronenos   (27.11.2008 в 01:10)
 

Виноват, не сказал, что это надо на чистом WinApi :)
как вообще это без WM_PAINT сделать?

  Ответить  
 
 автор: GeorgeIV   (27.11.2008 в 09:59)   письмо автору
 
   для: AlMag   (27.11.2008 в 01:19)
 

WM_ERASEBKGND
Обрабатывайте это сообщение и устанавливайте свой цвет фона. Я так делал.

  Ответить  
 
 автор: AlMag   (27.11.2008 в 16:58)   письмо автору
 
   для: GeorgeIV   (27.11.2008 в 09:59)
 

не выходит у меня. можете кусок кода привести, как установить, например, в эдите крассный цвет фона

  Ответить  
 
 автор: GeorgeIV   (28.11.2008 в 09:41)   письмо автору
 
   для: 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;
}

  Ответить  
 
 автор: AlMag   (29.11.2008 в 23:35)   письмо автору
 
   для: GeorgeIV   (28.11.2008 в 09:41)
 

спасибо. Хорошо, а если делать построчную закраску? например, что бы выделить строчку в эдите другим цветом, можно так?

  Ответить  
 
 автор: bronenos   (30.11.2008 в 01:36)   письмо автору
 
   для: AlMag   (29.11.2008 в 23:35)
 

В смысле так (цвета к примеру)?

черный
серый
черный
серый

  Ответить  
 
 автор: AlMag   (30.11.2008 в 03:20)   письмо автору
 
   для: bronenos   (30.11.2008 в 01:36)
 

ну да. черный, крассный, все равно, главное, принцып

  Ответить  
 
 автор: GeorgeIV   (30.11.2008 в 09:56)   письмо автору
 
   для: AlMag   (29.11.2008 в 23:35)
 

Очень советую разобраться с обработчиком M_PAINT. Я когда его освоил, жизнь стала гораздо легче, именно тут решается бОльшая часть отобразительных вопросов.

Общий принцип цветовой раскраски едита таков:
1. Заливаете фон (потому что едит может быть не полностью заполнен строками)
2. Вычисляете высоту строки по известному вам шрифту (если не установили сами, значит по системному)
3. Последовательно идете сверху вниз, формируете прямоугольные области каждой строки, заливаете ее фон нужным цветом, устанавливаете бэкграунд текста таким же, устанавливаете цвет текста в нужный и выводите текст. (Можно еще делать фон текста прозрачным, но, мне кажется, это дело вкуса) .И так в цикле, пока не закончатся строчки. При этом, естественно, у вас для каждой строки должен быть задан цвет фона и цвет текста.

  Ответить  
 
 автор: bronenos   (30.11.2008 в 10:05)   письмо автору
 
   для: GeorgeIV   (30.11.2008 в 09:56)
 

Ну да, и через инкремент статической переменной через
(i & 1) - это вместо (i % 2), только побыстрее пашет
Переключаете цвет нанужный

  Ответить  
 
 автор: GeorgeIV   (30.11.2008 в 10:08)   письмо автору
 
   для: bronenos   (30.11.2008 в 10:05)
 

Ну это если зебра нужна, описывал вариант в общем, с произвольной раскраской фона.
Если зебра, то согласен.

  Ответить  
 
 автор: AlMag   (30.11.2008 в 12:50)   письмо автору
 
   для: GeorgeIV   (30.11.2008 в 10:08)
 

Спасибо, сейчас попробую

  Ответить  
 
 автор: bronenos   (28.11.2008 в 20:51)   письмо автору
 
   для: AlMag   (27.11.2008 в 01:19)
 

А это и был чистый

  Ответить  
 
 автор: GeorgeIV   (30.11.2008 в 09:58)   письмо автору
 
   для: bronenos   (28.11.2008 в 20:51)
 

Я думаю, товарища немного стиь смутил, применение :: насколько здесь необходимо?

  Ответить  
 
 автор: AlMag   (30.11.2008 в 12:50)   письмо автору
 
   для: GeorgeIV   (30.11.2008 в 09:58)
 

Да, Вы правы, немного смутил :)

  Ответить  
 
 автор: bronenos   (02.12.2008 в 00:27)   письмо автору
 
   для: GeorgeIV   (30.11.2008 в 09:58)
 

Лично для себя, чтобы видеть, какие переменные внутренние, а какие глобальные (по обращению к namespace)

  Ответить  
 
 автор: GeorgeIV   (02.12.2008 в 09:44)   письмо автору
 
   для: bronenos   (02.12.2008 в 00:27)
 

Понятно. Я обычно именованием переменных разделяю для себя. Но это, как говорится, дело вкуса и привычки.

  Ответить  
 
 автор: AlMag   (02.12.2008 в 15:15)   письмо автору
 
   для: GeorgeIV   (02.12.2008 в 09:44)
 

Понятно тогда :)

И еще, в диалоговом окне, если я не ошибаюсь, не обрабатывается сообщение WM_PAINT?
как там тогда фон менять? или нельзя вообще?

  Ответить  
 
 автор: GeorgeIV   (03.12.2008 в 09:55)   письмо автору
 
   для: AlMag   (02.12.2008 в 15:15)
 

Отрабатывается, как в любом другом окне, имеющем оконную процедуру.
Для проверки перенес кусок кода из оконной процедуры главного окна в диалоговое, цвет диалогового окна поменялся. Аналогично можно поменять прорисовку элементов диалогового окна, только у них соответственно надо указывать оконную процедуру этого диалогового окна

  Ответить  
 
 автор: AlMag   (04.12.2008 в 14:59)   письмо автору
 
   для: GeorgeIV   (03.12.2008 в 09:55)
 

круто! спасибо большое всем за ответы!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования