Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: шрифт текста (also другие ?)  (Прочитано 22022 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 10-03-2004 19:31 » 

здесь сразу несколько вопросов, чтобы не создавать несколько тем  Улыбаюсь

1) :arrow: Как задать цвет, фонт и размер символа при выводе его на контекст устройства by TextOut()

2) :arrow: Как задать цвет, фонт и размер символа при выводе его в Edit (то есть обычный вывод вроде SetWindowText(), но с нужными цветами, шрифтами и размерами)

3) :arrow: например имеется на форме элемент, с классом, производным от CStatic. В классе я добавил обработчик
OnLButtonDown(UINT nFlags, CPoint point)
, но элемент на это не реагирует - как бороть? Может в обработчике вьюхи определять, что щёлкнули по окну элемента и имитировать нажатие для элемента? Но я чувствую,что есть более корректный путь...
Записан

ysv_
Помогающий

ua
Offline Offline

« Ответ #1 : 10-03-2004 21:48 » new

1) Цвет - через SetTextColor(), фонт и размер - CreateFont() - создаем фонт (в том числе и размер), SelectObject() - устанавливаем фонт для заданного HDC.
2) фонт и размер - CreateFont() (пример   font_=CreateFont(-22, 0, 0, 0, 0, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
       OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
       DEFAULT_PITCH | FF_DONTCARE, "Microsoft Sans Serif");
) и SendMessage() (пример   SendMessage(GetDlgItem(hwnd_, IDSHOWCONSUMPTION), WM_SETFONT,
       reinterpret_cast<WPARAM>(font_), TRUE);
) цвет - SetTextColor(GetDC(), color).
3) не знаю. Не использую MFC.
Записан
Serega
Гость
« Ответ #2 : 10-03-2004 21:59 » 

Все функции вывода текста используют текущий фонт контекста, изменить можно его можно так:
Код:
CFont* oldFont = pDC->SelectObject(new Font(...));
...
pDC->SelectObject(oldFont);
фонт это имя, размер, цвет, подчеркивание и т.п.
как изменить один символ в edit'е я знаю (пожалуй нужно самому его отрисовывать), можно изменить шрифт контрола, с помощью SetFont
Код:
void SetFont(CFont* pFont, BOOL bRedraw = TRUE);
что за вьюхи ?
возможно контрол получает не WM_LBUTTONDOWN, а WM_NOTIFY от родительского окна (хотя по идее NOTIFY приходит от дочернего к родительскому)
« Последнее редактирование: 25-11-2007 12:40 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 14-03-2004 11:44 » 

ysv_, Serega, спасибо за ответы.
Но.

 :arrow:
Цитата
2)  Как задать цвет, фонт и размер символа при выводе его в Edit (то есть обычный вывод вроде SetWindowText(), но с нужными цветами, шрифтами и размерами)

- имелось в виду =>
мне, собственно, для текущей задачи нужно выставить шрифт и его размер токмо один раз, а цвет менять.  То есть, я ставлю цвет №1 - вывожу символ, ставлю цвет №2 - вывожу след символ...
То есть в случае Edit не пришлось бы устанавливать и следить за положением каретки - а только выводить символы др за др

Как это же сделать через TextOut() ? Как узнать ширину и высоту выводимого символа?

 :arrow:
Цитата
что за вьюхи ?
- класс , производный от CView (в моём случае - CFormView)

пока я сделал так

Код:
//В КЛАССЕ CFormView
void CShelekToyView::OnLButtonDown(UINT nFlags, CPoint point)
{
CFormView::OnLButtonDown(nFlags, point);
//point - координаты щёлкнутого пиксела экрана
//ОТНОСИТЕЛЬНО прямоугольника CFormView

CRect ElemRect,ViewRect;

//получаем абсолютные координаты прямоугольника CFormView
GetWindowRect(&ViewRect);

//получаем абсолютные координаты прямоугольника CstatPICT
GetDlgItem(IDC_statPICT)->GetWindowRect(&ElemRect);

//смещаем point к абсолютным координатам
point+=ViewRect.TopLeft();

//проверяем, что точка внутри прямоугольника элемента
if(TRUE==ElemRect.PtInRect(point))
{
//вызываем обработчик WM_LBUTTONDOWN элемента
//через его public-функцию OnLBD(), приведя
//сначала координаты точки к относительным
//координатам прямоугольника элемента
m_statPICT.OnLBD(nFlags,point-ElemRect.TopLeft());
}
}

//m_statPICT - переменная класса CstatPICT

//В КЛАССЕ ЭЛЕМЕНТА "Трамплин" для сообщения WM_LBUTTONDOWN
void CstatPICT::OnLBD(UINT nFlags, CPoint point)
{
//перенаправляем сообщение WM_LBUTTONDOWN
OnLButtonDown(nFlags,point);
}
« Последнее редактирование: 25-11-2007 12:41 от Алексей1153++ » Записан

SOS
Гость
« Ответ #4 : 24-03-2004 14:31 » 

Привет всем!!!

Ответ на вопрос 2:

Код:
//////////////////////////////////////////////////////
// SDPreviewEdit.h

class CSDPreviewEdit : public CEdit
{
// Construction
public:
CSDPreviewEdit();
virtual ~CSDPreviewEdit();

// Attributes
private:
COLORREF m_clrText;
COLORREF m_clrBkgnd;
CBrush m_brBkgnd;
CFont m_Font;

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSDPreviewEdit)
public:
//}}AFX_VIRTUAL

// Implementation
public:
void SetFont();
void SetFont(CFont* font);
void SetBkColor( COLORREF clColor);
void SetTextColor( COLORREF clColor);

// Generated message map functions
protected:
//{{AFX_MSG(CSDPreviewEdit)
afx_msg HBRUSH CtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg void OnFontChange();
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

//////////////////////////////////////////////////////
// SDPreviewEdit.cpp

/////////////////////////////////////////////////////////////////////////////
// CSDPreviewEdit

CSDPreviewEdit::CSDPreviewEdit()
{
m_clrText = ::GetSysColor(COLOR_WINDOWTEXT);
m_clrBkgnd = ::GetSysColor(COLOR_WINDOW);//RGB( 225, 225, 0 );

LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));       // Zero out the structure.
lf.lfHeight = 13;                      // Request a 12-pixel-height font.
lstrcpy(lf.lfFaceName, _T("Courier New"));   // Request a face name "Arial".Fixedsys
VERIFY(m_Font.CreateFontIndirect(&lf));  // Create the font.
}

CSDPreviewEdit::~CSDPreviewEdit()
{
}


BEGIN_MESSAGE_MAP(CSDPreviewEdit, CEdit)
//{{AFX_MSG_MAP(CSDPreviewEdit)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_FONTCHANGE()
ON_WM_CHAR()
ON_WM_CREATE()
ON_WM_ACTIVATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSDPreviewEdit message handlers

void CSDPreviewEdit::SetBkColor(COLORREF clColor)
{
if( m_clrBkgnd != clColor )
{
m_clrBkgnd = clColor;
RedrawWindow();
}
}

void CSDPreviewEdit::SetTextColor(COLORREF clColor)
{
if( m_clrText != clColor )
{
m_clrText = clColor;
RedrawWindow();
}
}

HBRUSH CSDPreviewEdit::CtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
CString str1, str2;

pDC->SetTextColor( m_clrText );   // text
pDC->SetBkColor( m_clrBkgnd );   // text bkgnd

if((HFONT)m_Font != NULL)
{
pDC->SelectObject( &m_Font );
}

if( (HBRUSH)m_brBkgnd != NULL )
m_brBkgnd.DeleteObject();

m_brBkgnd.CreateSolidBrush( m_clrBkgnd );


return m_brBkgnd;            // ctl bkgnd

}

void CSDPreviewEdit::OnFontChange()
{
CEdit::OnFontChange();
}

void CSDPreviewEdit::SetFont()
{
CEdit::SetFont( &m_Font );
}

void CSDPreviewEdit::SetFont(CFont* font)
{
CEdit::SetFont( font );
}


void CSDPreviewEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}


Ответ на вопрос 3:
Всё просто Улыбаюсь, создаёш class MyStatic : pablic CStatic
и в этом классе отлавливаешь любые сообщения

Надеюсь помог Отлично
« Последнее редактирование: 25-11-2007 12:44 от Алексей1153++ » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 24-03-2004 15:18 » 

SOS,  Ты предлагаешь решение для установки цвета всего контрола CEdit.
Речь идёт об управлении цветом для каждого отдельного символа (или группы символов). Если я правильно понял, то вопрос был в связи с отсутствием функции просмотра в проге ShelkToy https://forum.shelek.ru/index.php/topic,885.0.html

Т.е. надо примерно так:

88888888888888888888888888888888888
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 24-03-2004 16:56 » 

:arrow:
SOS, спасибо, конечно, но. Уже. Решилось. Джон помог

 :arrow: только class MyStatic : pablic CStatic - я же так и делал, однако - ничего...
Цитата

например имеется на форме элемент, с классом, производным от CStatic. В классе я добавил обработчик
OnLButtonDown(UINT nFlags, CPoint point)
, но элемент на это не реагирует


 :arrow:
Джон, я вставлю тою процедуру - лепота будет
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 25-03-2004 08:37 » 

Цитата: Алексей1153
Уже. Решилось. Джон помог


Ничего не решилось, народ с толку не сбивай! Проблему обошли,  а не решили. Отображение отдельных символов с разными параметрами в одном девайс-контексте осталось не решённым. Так что, деразайте.

Лёха, а ты не торопись. У меня ещё одна идейка есть. Надо только обмозговать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
SOS
Гость
« Ответ #8 : 25-03-2004 15:05 » 

Мужики, может я чего то не понял, но тот код который
я дал предпологает и разноцветную надпись тоже Улыбаюсь
Так, не мудрствуя лукаво, я переписал:

1. функцию OnChar(...) таким образом:

Код:
void CSDPreviewEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
const DWORD r = RGB(255,0,0);
const DWORD g = RGB(0,255,0);
const DWORD b = RGB(0,0,255);
const DWORD bl = RGB(0,0,0);

switch( m_clrText )
{
case bl:
SetTextColor(r);
break;
case r:
SetTextColor(g);
break;
case g:
SetTextColor(b);
break;
case b:
SetTextColor(bl);
break;

default:
SetTextColor(bl);
}
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
// цвета можно и динамически ставить.

2. убрал RedrawWindow() из функции
SetTextColor(COLORREF clColor)
теперь она выглядит так:

Код:
void CSDPreviewEdit::SetTextColor(COLORREF clColor)
{
if( m_clrText != clColor )
{
m_clrText = clColor;
// RedrawWindow();
}
}


И всё работает Улыбаюсь
« Последнее редактирование: 25-11-2007 12:48 от Алексей1153++ » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 25-03-2004 15:54 » 

SOS,   Улыбаюсь  Нет не работает, вернее как надо не работает.  Жаль

Ты по прежнему рисуешь всё одним цветом. Убрав RedrawWindow() ты просто выключил прорисовку сразу и эта часть "картинки" у тебя не обновляется и в первый момент это выглядит как надо. Открой какое нить окно поверх своей проги, а потом вернись к ней и ты увидишь, что весь текст станет одного цвета.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Daniloff
Помогающий

ru
Offline Offline

« Ответ #10 : 03-04-2004 13:59 » 

А может ну их нафиг? Сделать окошко RichText и посылать туда в формате RTF. Дешево, красиво, а заодно и RTF выучишь.
Записан
Anonymous
Гость
« Ответ #11 : 06-04-2004 09:09 » 

Алексей1153, вот пример:
resourse.rc
===========
Код:
ABOUTBOX DIALOG DISCARDABLE  117, 56, 197, 70
STYLE DS_MODALFRAME | DS_3DLOOK | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog!"
FONT 8, "Comic Sans MS"
BEGIN
    PUSHBUTTON      "OK",IDOK,142,49,48,16
    GROUPBOX        "О программе",102,3,2,191,65
    CONTROL         "ME",100,"Static",SS_BITMAP,7,12,13,11
    CONTROL         "",IDC_RICHEDIT1,"RichEdit20A",WS_HSCROLL | WS_TABSTOP | 0x1804,140,8,52,35,WS_EX_STATICEDGE
END
example.cpp
===========================
Код:
BOOL FAR PASCAL AboutProc( HWND hwnd, UINT msg,UINT wparam, LONG lparam )
{
    int cmd;
    HWND rec;
    lparam = lparam;
    switch( msg ) {
    case WM_INITDIALOG:
rec=GetDlgItem(hwnd,IDC_RICHEDIT1);
SetWindowText(rec,"|\\rtf1\\ansi\\deff0"
"|\\colortbl ;\\red255\\green128\\blue128;""
"|\\fonttbl|\\f0\\fswiss\\fcharset0 Arial;""
"|\\f1\\fswiss\\fcharset204 Times;"""
"\\viewkind4\\uc1\\pard\\cf1\\b\\f1\\fs20 ICQ:\\cf0\\b0  keep out \\i\\'ea\\'ee\\'ec\\i0\\'e0"");
dlg1_active=1;
     return(TRUE);

Это конечно не полный текст, но зато все необходимые для контрола кусочки... А теперь открою секрет, как я кодирую текст в RTF. Я набираю его в wordpad-е, (word генерит ужасно большой код) Красоту навожу, ну, там, цвет-размер, форматирование - а потом это файл блокнотиком открываю - и готово.
« Последнее редактирование: 25-11-2007 12:53 от Алексей1153++ » Записан
Anonymous
Гость
« Ответ #12 : 06-04-2004 22:53 » 

Держи может это подойдет

void CTestFontView::OnDraw(CDC* pDC)
{
   CTestFontDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   
   LOGFONT lf;
    lf.lfHeight = 8;
   lf.lfWidth = 0;
    lf.lfEscapement = 0;
    lf.lfOrientation = 0;
   lf.lfWeight = FW_NORMAL;
    lf.lfItalic = 0;
    lf.lfUnderline = 0;
   lf.lfStrikeOut = 0;
   lf.lfCharSet = ANSI_CHARSET;
    lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
   lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf.lfQuality = PROOF_QUALITY;
    lf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;  
   strcpy(lf.lfFaceName,"Times New Roman");

   int pos=0;

   for (int x=0;x<8;++x)
   {
      lf.lfHeight= 8 + (x*8);
      CFont ft;
      ft.CreateFontIndirect(&lf);
      CFont* oldf=pDC->SelectObject(&ft);
      pDC->SetTextColor(RGB(0,rand()%128, 255 ));
      pos=pos + lf.lfHeight;
      pDC->TextOut(10,pos,"Font samples");

      pDC->SelectObject(oldf);
   }

}
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines