Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   вопрос по VC++ 7. как отобразить выделенный текст в строке состояния? (http://forum.oszone.net/showthread.php?t=44371)

ThereIsNoName 24-01-2005 20:27 291736

вопрос по VC++ 7. как отобразить выделенный текст в строке состояния?
 

подскажите, пожалуйста, как отобразить выделенный текст в строке состояния?

создаю проект MFC Application, базовый класс указываю CRichEdit.


hasherfrog 25-01-2005 09:13 291870

RichTextBox-> events-> SelectionChanged (This event is sent when the selection changes) -> StatusBar-> setText

ThereIsNoName 25-01-2005 11:23 291902

сгенерировал я обработчик CRichView::OnEnSelchange() на сообщение EN_SELCHANGE. а как сделать, что бы этот обработчик отображал текст на строке состояния?



в классе CMainFrm существет член m_wndStatusBar типа CStatusBar, он же является строкой состояния, но как к нему подступиться в обработчике CRichView::OnEnSelchange()?


hasherfrog 25-01-2005 13:08 291924

В примитиве - через родителя CRichView (CMainFrm или кто там это будет) CRichView->(CMyView)parent->wndStatusBar->setText(strWhat)

ThereIsNoName 26-01-2005 08:34 292183

вы имеете в виду через указатель на общего родителя?

hasherfrog 26-01-2005 09:06 292194

ThereIsNoName
Да. Но я думаю, что ещё проще вот что: Ведь это родитель CMainFrm (наверняка) получает и обрабатывает OnEnSelchange, случившийся у CRichView? Ну и пусть сразу же спросит у него текст из выделения, а потом выставит в свой wndStatusBar.

Ранее же (про общего родителя) я имел в виду немного другой случай: если Вы делаете абстрактный класс CRichView, который неизвестно к какому CMainFrm будет относится (Вы не знаете даже имя класса CMainFrm - CMyMainFrm, CCoolMainFrm и т.д.), то он сам (CRichView) может делать _сам_себе_ обработку своего же OnEnSelchange, а к родителю обращатся (с предварительной проверкой, является ли родитель классом, унаследованным от CMainFrm) как к обычному CMainFrm простым приведением типа.

Короче, решений много :)

ThereIsNoName 26-01-2005 13:21 292257

Ведь это родитель CMainFrm (наверняка) получает и обрабатывает OnEnSelchange, случившийся у CRichView?

это хорошее решение, но где это посмотреть, что CMainFrm обрабатывает OnEnSelchange?

hasherfrog 26-01-2005 14:20 292273

Я не совсем понима, в чём проблема-то?

Пример. Делаем mfc-проект, диалоговый. На диалог кладём richedit. Заходим в класс-визард. Там выбираем IDC_RICHEDIT1 и говорим, что будем обрабатывать его EN_CHANGE. На тут же создают:
Код:

void CTestDlg::OnChangeRichedit1()
{
        // TODO: If this is a RICHEDIT control, the control will not
        // send this notification unless you override the CDialog::OnInitDialog()
        // function and call CRichEditCtrl().SetEventMask()
        // with the ENM_CHANGE flag ORed into the mask.
       
        // TODO: Add your control notification handler code here
       
}

Пишите там, что угодно.

Можно отследить, что и где прописывает класс-визард при этом.

А именно он делает:
Код:

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
        //{{AFX_MSG_MAP(CTestDlg)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_EN_CHANGE(IDC_RICHEDIT1, OnChangeRichedit1)    <------------ в имплементейшене
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

и
Код:

        // Generated message map functions
        //{{AFX_MSG(CTestDlg)
        virtual BOOL OnInitDialog();
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
        afx_msg void OnPaint();
        afx_msg HCURSOR OnQueryDragIcon();
        afx_msg void OnChangeRichedit1();        <------------ в хидере
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()

Что не понятно?


Время: 07:41.

Время: 07:41.
© OSzone.net 2001-