Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249

Загвоздка с Subclassing в RichEdit

04.07.2015, 22:45. Показов 1004. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Столкнулся со следующей проблемой - Subclassing в RichEdit.

Класс CColoredRichTextBox:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class CColoredRichTextBox
{
public:
    CColoredRichTextBox(){}
    CColoredRichTextBox(HWND hWndOwner, int x, int y, int width, int height, int iMenuId);
    
    void SetText(LPTSTR lpText);
    void SetText(std::basic_string<TCHAR> sText);
    std::basic_string<TCHAR> GetText();
    std::string GetTextAnsi();
    
    void SetFont(HFONT hFont);
    void SetReadOnly(BOOL bSet);
 
    void Highlight(UINT uStartPos, UINT uEndPos, COLORREF color);
    void HighlightClear();
 
    void Invalidate();
 
    HWND hEditWnd;
 
    WNDPROC wpOld;
    static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam);
};
Пытаюсь осуществить Subclassing:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifdef _WIN64
#define GWL_HINSTANCE GWLP_HINSTANCE
#define GWL_USERDATA GWLP_USERDATA
#define GWL_WNDPROC GWLP_WNDPROC
#endif /* _WIN64 */
 
LRESULT CALLBACK CColoredRichTextBox::WndProc(HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
    CColoredRichTextBox* lpEdit = (CColoredRichTextBox*)GetWindowLongPtr(hwnd, GWL_USERDATA);
    if(lpEdit)
    {
                //Тут потом напишу обработку сообщений
        return CallWindowProc(lpEdit->wpOld, lpEdit->hEditWnd, uMessage, wParam, lParam);
    }
    return 0;
}
 
CColoredRichTextBox::CColoredRichTextBox(HWND hWndOwner, int x, int y, int width, int height, int iMenuId)
{
    LoadLibrary(TEXT("Msftedit.dll"));
 
    hEditWnd = CreateWindowEx(0, MSFTEDIT_CLASS, TEXT(""), 
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_BORDER, 
        x, y, width, height, hWndOwner, (HMENU)iMenuId, GetModuleHandle(NULL), NULL);
 
    ULONG_PTR lExStyle = GetWindowLongPtr(hEditWnd, GWL_EXSTYLE);
    lExStyle &= ~WS_EX_CLIENTEDGE;
    SetWindowLongPtr(hEditWnd, GWL_EXSTYLE, lExStyle);
 
    SetWindowLongPtr(hEditWnd, GWL_USERDATA, (LONG_PTR)this);
    this->wpOld = (WNDPROC)SetWindowLongPtr(hEditWnd, GWL_WNDPROC, (LONG_PTR)(WNDPROC(this->WndProc))); 
}
Размещаю два RichEdit'а в главном окне, в обработке WM_CREATE:
C++
1
2
3
4
5
6
rtb1 = CColoredRichTextBox(hWnd, 280, 30, 330, 560, IDC_RTB_FIRST);
rtb2 = CColoredRichTextBox(hWnd, 620, 30, 330, 560, IDC_RTB_SECOND);
rtb1.SetFont(hFontConsolas);
rtb2.SetFont(hFontConsolas);
rtb1.SetReadOnly(TRUE);
rtb2.SetReadOnly(TRUE);
Компилирую (x64, Release), запускаю - и получаю ошибку(картинка во вложении).

Как это можно исправить?
Миниатюры
Загвоздка с Subclassing в RichEdit  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.07.2015, 22:45
Ответы с готовыми решениями:

Крах Access при Subclassing
Помогите, пожалуйста, разобраться, уже голову сломал: Мне надо управлять приложением Access 2007 при помощи внешней программы. Написал...

SendMessage в обход Subclassing'а
Столкнулся с проблемкой. Есть корявая корпоративная бд с убогим интерфейсом. Нужно фильтровать в SysTreeView32 элементы. Написал код на VBA...

В поле RichEdit удалить html-теги; при вставке в RichEdit замена старого текста на новый
Всем привет! помогите пожалуйста с написание кода на две процедуры : - В поле RichEdit удалить html-теги; - при вставке в RichEdit...

3
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.07.2015, 22:13
Цитата Сообщение от Cuellius Посмотреть сообщение
Как это можно исправить?
Реализуй обработку ошибок, выясни какая из функций не выполняется.
1
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
05.07.2015, 23:13  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Реализуй обработку ошибок, выясни какая из функций не выполняется.
Реализовал.
И увидел что сообщения от второго окна приходят к первому (рисунок во вложении).

Чуть-чуть переделал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CColoredRichTextBox::CColoredRichTextBox(HWND hWndOwner, int x, int y, int width, int height, int iMenuId)
{
    LoadLibrary(TEXT("Msftedit.dll"));
 
    hEditWnd = CreateWindowEx(0, MSFTEDIT_CLASS, TEXT(""), 
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_BORDER, 
        x, y, width, height, hWndOwner, (HMENU)iMenuId, GetModuleHandle(NULL), NULL);
 
    ULONG_PTR lExStyle = GetWindowLongPtr(hEditWnd, GWL_EXSTYLE);
    lExStyle &= ~WS_EX_CLIENTEDGE;
    SetWindowLongPtr(hEditWnd, GWL_EXSTYLE, lExStyle);
 
    this->SubClass();
}
 
void CColoredRichTextBox::SubClass()
{
    SetWindowLongPtr(this->hEditWnd, GWL_USERDATA, (LONG_PTR)this);
    this->wpOld = (WNDPROC)SetWindowLongPtr(hEditWnd, GWL_WNDPROC, (LONG_PTR)(WNDPROC(this->WndProc))); 
}
Та же ситуация.

Попробовал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CColoredRichTextBox::CColoredRichTextBox(HWND hWndOwner, int x, int y, int width, int height, int iMenuId)
{
    LoadLibrary(TEXT("Msftedit.dll"));
 
    hEditWnd = CreateWindowEx(0, MSFTEDIT_CLASS, TEXT(""), 
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_BORDER, 
        x, y, width, height, hWndOwner, (HMENU)iMenuId, GetModuleHandle(NULL), NULL);
 
    ULONG_PTR lExStyle = GetWindowLongPtr(hEditWnd, GWL_EXSTYLE);
    lExStyle &= ~WS_EX_CLIENTEDGE;
    SetWindowLongPtr(hEditWnd, GWL_EXSTYLE, lExStyle);
}
 
void CColoredRichTextBox::SubClass()
{
    SetWindowLongPtr(this->hEditWnd, GWL_USERDATA, (LONG_PTR)this);
    this->wpOld = (WNDPROC)SetWindowLongPtr(hEditWnd, GWL_WNDPROC, (LONG_PTR)(WNDPROC(this->WndProc))); 
}
C++
1
2
3
4
5
6
7
8
rtb1 = CColoredRichTextBox(hWnd, 280, 30, 330, 560, IDC_RTB_FIRST);
rtb2 = CColoredRichTextBox(hWnd, 620, 30, 330, 560, IDC_RTB_SECOND);
rtb1.SubClass();
rtb2.SubClass();
rtb1.SetFont(hFontConsolas);
rtb2.SetFont(hFontConsolas);
rtb1.SetReadOnly(TRUE);
rtb2.SetReadOnly(TRUE);
Заработало!

Но теперь вопрос в другом - почему заработало только так. Я ведь ничего принципиально не изменил?
Миниатюры
Загвоздка с Subclassing в RichEdit  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.07.2015, 23:17
Цитата Сообщение от Cuellius Посмотреть сообщение
Реализовал.
Где?
Цитата Сообщение от Cuellius Посмотреть сообщение
Но теперь вопрос в другом - почему заработало только так. Я ведь ничего принципиально не изменил?
Так - это как? Обработки ошибок я не вижу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.07.2015, 23:17
Помогаю со студенческими работами здесь

Из RichEdit в RichEdit без потери форматирования
Есть RichEdit1 с форматированным текстом(цвет, стиль и тп.) нужно передать этот текст в переменную а затем в RichEdit2 чтобы при вставке в...

Загвоздка
Знаю что темы есть и бла-бла-бла ... Но у меня среда разработки Visual Studio , проблема вот в чем , текст чтобы русский вводился с клавы и...

Загвоздка С++
в общем Начнем с того что что рассмотрим простейшию Задачу) Короч написать прогу что бы выводило числа от 1 до 10 в столбик...ну Вот..и там...

Загвоздка в else
Учу урок по php. Все составил как по учебнику, пытаюсь откомпилировать и просмотреть в браузере код. Но PhpDesigner7 жалуется на строку...

Загвоздка по JComboBox
Приветствую коллеги! Пишу программу для заполнения формы документа. Реализовал вывод данных на форму документа из фрейма для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru