Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по RichEdit. Непонятное с ф-цией SetSel(...). 
:(
    Опции темы
AndreySol
Дата 13.7.2005, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



Есть RichEditCtrl, в него загружается текст через StreamIn(...). И вот что я заметил: если размер текста небольшой, то используя SetSel(...) выделение устанавливается нормально, но если текст побольше (я примерно высчитал - где-то начиная с 350...400 символов) не работает ф-ция, по крайней мере визуально выделение не устанавливается.
В MSDN нашел что-то на тему LimitText, но не смог разобраться.
Подскажите как правильно делать выделение для текстов большого размера ?
PM MAIL   Вверх
AndreySol
Дата 15.7.2005, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



Ну что же молчим, господа программисты ?
PM MAIL   Вверх
AndreySol
Дата 22.7.2005, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



Отзовитесь кто нить !
PM MAIL   Вверх
chaos
Дата 22.7.2005, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 4
Всего: 44



по поводу SetSel, проверил у меня SetSel все нормально выделяет и 1000 и 2000 символов, те проблем ни каких не орбнаружил. создавал так
Код

m_memo->Create(ES_MULTILINE | ES_SUNKEN | ES_NOHIDESEL, 
                       r, this, ID_MEMO);

те из всех этих флагов необходим ES_NOHIDESEL (сохраняем выделение когда CRichEditCtrl теряет фокус) что бы текст выделялся.


а выделял так
Код

void CTrytryDlg::OnButton1() 
{
    UpdateData(TRUE);
    m_memo->SetSel(m_startpos, m_endpos);
    m_memo->GetSelText(s);
    AfxMessageBox(s);
}



а по поводу LimitText так я думаю она тебе вряд ли поможет, тк она служит для ограничения длины текста вводимого в CRichEditCtrl пользователем
Добавлено @ 07:19
у тебя установлен флажок ES_NOHIDESEL ?
Добавлено @ 07:23
хотя блин, ты же говоришь что при маленькой длине текста все ок. хм smile

Это сообщение отредактировал(а) chaos - 22.7.2005, 07:18
PM WWW   Вверх
chaos
Дата 22.7.2005, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 4
Всего: 44



не все проверил, все сделал как ты сказал: прочитал файл с помошью StramIn размером пару килобайт и все у меня выделяется нормально!
PM WWW   Вверх
chaos
Дата 22.7.2005, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 4
Всего: 44



да пощадят меня модераторы за выкладывание такого большого кода smile

вот посмотри, черкнул тебе небольшой пример
Код

#include <afxwin.h>
#include <afxcmn.h>

#include "resource.h"

//Класс приложения
class CMainApp : public CWinApp
{
public:
    virtual BOOL InitInstance();
};

CMainApp app;

//на основе диалога
class CMyDlg : public CDialog
{
    long m_l__spos, m_l__epos;
    CRichEditCtrl *m_op__memo;
public:
    CMyDlg();
    ~CMyDlg();

    virtual BOOL OnInitDialog();
    virtual void PostNcDestroy();
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    virtual void DoDataExchange(CDataExchange* pDX);

    afx_msg void OnClose();
    afx_msg void OnSelText();
    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    ON_WM_CLOSE()
    ON_COMMAND(IDC_BUTTON1, OnSelText)
END_MESSAGE_MAP()


//--------------------------------------

BOOL CMainApp::InitInstance()
{
    CMyDlg *op__dlg = new CMyDlg;
    this->m_pMainWnd = op__dlg;

    op__dlg->Create(IDD_DIALOG);
    op__dlg->ShowWindow(SW_SHOW);
                
    return TRUE;
}

CMyDlg::CMyDlg()
{
    m_op__memo = new CRichEditCtrl;
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    DDX_Text(pDX, IDC_EDIT1, m_l__spos);
    DDX_Text(pDX, IDC_EDIT2, m_l__epos);
}

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
    if (WM_KEYDOWN == pMsg->message)
        if (27 == pMsg->wParam)
            return TRUE;
    return CDialog::PreTranslateMessage(pMsg);
}


DWORD CALLBACK myCallBack(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb,LONG *pcb) 
{ 
    CFile *f=(CFile*)dwCookie; 
    *pcb = f->Read(pbBuff, cb);
    return 0;
} 

BOOL CMyDlg::OnInitDialog()
{
    RECT rect;
    GetClientRect(&rect);
    rect.bottom -= 50;
    m_op__memo->Create(
                    ES_MULTILINE|ES_SUNKEN|
                    ES_NOHIDESEL|ES_AUTOHSCROLL|ES_AUTOVSCROLL,
                    rect, this, ID_MEMO);

    m_op__memo->ShowWindow(SW_SHOW);

    CFile o__f("richedit.txt", CFile::modeRead); 
    EDITSTREAM ed; 
 
    ed.dwCookie=(DWORD_PTR)&o__f; 
    ed.dwError=0; 
    ed.pfnCallback=&myCallBack; 
    m_op__memo->StreamIn(SF_TEXT, ed);
    
    SendMessage(EM_STREAMIN,SF_TEXT, (WPARAM)&ed); 
    o__f.Close(); 

    return TRUE;
}

CMyDlg::~CMyDlg()
{
    delete m_op__memo;
}

void CMyDlg::OnClose()
{
    DestroyWindow();
}

void CMyDlg::PostNcDestroy()
{
    delete this;
}

void CMyDlg::OnSelText()
{
    UpdateData(TRUE);
    m_op__memo->SetSel(m_l__spos, m_l__epos);
}


че не понятно задавай вопросы!
PM WWW   Вверх
AndreySol
Дата 23.7.2005, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



Во как - то пусто, то густо !
Стиль ES_NOHIDESEL не стоит напрямую, он задан в свойствах окна в редакторе ресурсов.
Chaos
Спасибо за пример кода, щас попробую обязательно.
Еще возникла тут мысль - могут быть эти глюки связаны с вызовами UpdateData(FALSE) и UpdateData(TRUE) после установки выделения (у меня есть эти вызовы, нужны по ходу дела) ?
PM MAIL   Вверх
chaos
Дата 25.7.2005, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 4
Всего: 44



Цитата(AndreySol @ 23.7.2005, 06:44)
Еще возникла тут мысль - могут быть эти глюки связаны с вызовами UpdateData(FALSE) и UpdateData(TRUE) после установки выделения (у меня есть эти вызовы, нужны по ходу дела) ?

не могут
PM WWW   Вверх
AndreySol
Дата 12.8.2005, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



Разобрался я с этим SetSel.
Оказалось, что если создать RichEdit в редакторе ресурсов, перетащив его с панели "Controls" на форму, то какие бы я стили ему потом не устанавливал - выделение работает по дурному.
А вот если создать RichEdit через Create(...) то выделение работает нормально, при этом даже без флага ES_NOHIDESELECT.
Вот только почему так происходит ?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.