01:50

C++

100 бед - 1 ресет
Здравствуйте.. Такой вопрос: я пишу текст в форму Edit Box, программа на MFC. Как можно подсветить только определенные слова, например, "КОЛЕСО", другим цветом, чтоб остальные слова не изменялись..

Комментарии
09.10.2006 в 07:56

WAAAAAAAAAGH!!!!!!1111ONEONE
а оно разве такое поддерживает?
09.10.2006 в 14:24

100 бед - 1 ресет
Vj_o-oy Ок.. Тогда как можно такое реализовать, чтоб некоторые введеные мной слова отображались другим цветом?
09.10.2006 в 17:19

А ты уже научился заряжать левой ногой свой телефон?
RichEdit это может. Подробности в MSDN.
17.10.2006 в 18:35

100 бед - 1 ресет
Так.. следующий вопрос. Как мне сделать для RichEdit контекстное меню, чтоб им производить какие-то действия над словом, на которое нажал?
17.10.2006 в 21:00

WAAAAAAAAAGH!!!!!!1111ONEONE
FRikaZOid либо ищи стандартное решение в msdn, либо отлавливай правый клик и развлекайся на здоровье
17.10.2006 в 23:55

100 бед - 1 ресет
Vj_o-oy Правый клик отловил так:



BOOL CSynDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)

{

// TODO: Add your specialized code here and/or call the base class



NMHDR *pNMHDP = (NMHDR*) lParam;



if(wParam == IDC_RICHEDIT1

&& pNMHDP->code == EN_MSGFILTER)

{

MSGFILTER *lpMsgFilter = (MSGFILTER *)lParam;

if(lpMsgFilter->msg == WM_RBUTTONDOWN)

{

// ... вывод контекстного меню с поз. курсора мыши

}

}

return TRUE;

}





А что дальше? Как мне узнать, на какое слово из текста кликнул?
17.10.2006 в 23:58

WAAAAAAAAAGH!!!!!!1111ONEONE
FRikaZOid по позиции курсора.
18.10.2006 в 01:21

100 бед - 1 ресет
Vj_o-oy Позицию курсора узнаем через



CPoint point;

GetCursorPos(&point);



Объясни, как именно создается контекстное меню? Я делаю курсовую, под СИ нас научили писать только консольные приложения. У меня программа проверки орфографии, мне нужно, чтоб при нажатии на неправильное слово мне предлагались варианты ответов (которые я храню в связанном списке), а при нажатии на них, слово исправлялось. Саму проверку на орфографию я сделал, а вот с меню проблемы..
18.10.2006 в 07:15

WAAAAAAAAAGH!!!!!!1111ONEONE
FRikaZOid с использованием MFC я написал аж целую одну прогу, и та была не большой, поэтому за каждой подобной ерундой я отсылаю в msdn, а про MFC забыл как про страшный сон. Ну а вообще самый дубовый вариант создания контекстного меню: создаешь окно, без заголовка и прочих обрамлений (в т.ч. без кнопок "закрыть", "развернуть", etc) - получишь окно внешне напоминающее эти самые меню, соответственно накидываешь туда внопки с нужными вариантамии.



А ещё минутное гугление выдало такой интересный результат: http://www.firststeps.ru/mfc/winapi/menu/r.php?38
18.10.2006 в 17:29

А ты уже научился заряжать левой ногой свой телефон?
Vj_o-oy

От этого человек возненавидет MFC на всю жизнь ))



FRikaZOid

CMenu m;

m.CreatePopupMenu();



//добавляешь элементы

m.AppendMenu(MF_STRING,609,"ТЕкст");



//Собственно показать меню

m.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);





Чтобы обрабоать клик по добавленному элементу то нужно добавить в карту сообщений

ON_COMMAND(609,EditOpenBlocnot)

где EditOpenBlocnot - функция ничего не берущая и не возвращающая
19.10.2006 в 00:45

100 бед - 1 ресет
SonicCat Это уже более понятно, спасибо. Только скажи, как мне добавить эту самую EditOpenBlocnot, а то без нее ошибка. И как мне можно по координамат point.x и point.y вычислить, на какое слово нажал, чтобы добавить соответствующие элементы в меню?
19.10.2006 в 01:45

100 бед - 1 ресет
C функцией все в порядке, вопрос остался, как мне узнать слово, на которое кликнул?
19.10.2006 в 12:56

А ты уже научился заряжать левой ногой свой телефон?
эх.. Ну если msdn нет то сюда:

http://msdn2.microsoft.com/zh-tw/library/y4bx8s3h.aspx



там вот я и нашел функцию CharFromPos - дает позицию символа по координате

дальше уже читаешь все словов
19.10.2006 в 18:30

100 бед - 1 ресет
SonicCat Спасибо за помощь. Попробую, что получится..
21.10.2006 в 01:22

100 бед - 1 ресет
SonicCat Пишет, что 'CharFromPos' : is not a member of 'CRichEditCtrl'. Зато CharFromPos есть в CEdit. И как же мне воспользоваться этой функцией?
23.10.2006 в 05:08

100 бед - 1 ресет
Кстати, решение нашел таким способом:





int CharFromPos(POINT pt) const

{

ATLASSERT(::IsWindow(m_hWnd));

return (int)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0,

MAKELPARAM(pt.x, pt.y));

}
28.10.2006 в 22:41

100 бед - 1 ресет
А как можно в CRichEditCtrl прочитать текстовый файл txt?
31.10.2006 в 15:30

А ты уже научился заряжать левой ногой свой телефон?
Ну читать файлы можно наверно любым способом

1) С-ый - FILE*

2) C++-ый - istream ostream

3) MFC-ый - CFile



Оное все сохранить в строку и CRichEditCtrl::SetWindowText(строка)
31.10.2006 в 19:15

100 бед - 1 ресет
Я это сделал примерно так:






static DWORD CALLBACK
MyStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)

{

CFile* pFile = (CFile*) dwCookie;

*pcb = pFile->Read(pbBuff, cb);

return 0;

}




CFile cFile("Filename", CFile::modeRead);

EDITSTREAM es;

es.dwCookie = (DWORD) &cFile;

es.pfnCallback = MyStreamInCallback;

RichEdit.StreamIn(SF_TEXT, es);



Зы: а как табуляцию ставить на дневниках и в HTML?