Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 10-03-2004 19:31 » |
|
здесь сразу несколько вопросов, чтобы не создавать несколько тем 1) :arrow: Как задать цвет, фонт и размер символа при выводе его на контекст устройства by TextOut() 2) :arrow: Как задать цвет, фонт и размер символа при выводе его в Edit (то есть обычный вывод вроде SetWindowText(), но с нужными цветами, шрифтами и размерами) 3) :arrow: например имеется на форме элемент, с классом, производным от CStatic. В классе я добавил обработчик OnLButtonDown(UINT nFlags, CPoint point) , но элемент на это не реагирует - как бороть? Может в обработчике вьюхи определять, что щёлкнули по окну элемента и имитировать нажатие для элемента? Но я чувствую,что есть более корректный путь...
|
|
|
Записан
|
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #1 : 10-03-2004 21:48 » |
|
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++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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++ »
|
Записан
|
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 24-03-2004 16:56 » |
|
:arrow: SOS, спасибо, конечно, но. Уже. Решилось. Джон помог :arrow: только class MyStatic : pablic CStatic - я же так и делал, однако - ничего... например имеется на форме элемент, с классом, производным от CStatic. В классе я добавил обработчик OnLButtonDown(UINT nFlags, CPoint point) , но элемент на это не реагирует
:arrow: Джон, я вставлю тою процедуру - лепота будет
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #7 : 25-03-2004 08:37 » |
|
Уже. Решилось. Джон помог Ничего не решилось, народ с толку не сбивай! Проблему обошли, а не решили. Отображение отдельных символов с разными параметрами в одном девайс-контексте осталось не решённым. Так что, деразайте. Лёха, а ты не торопись. У меня ещё одна идейка есть. Надо только обмозговать.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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++ »
|
Записан
|
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #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
Помогающий
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); }
}
|
|
|
Записан
|
|
|
|
|