Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› загадочный глюк с RichEdit |
Посл.ответ | Сообщение |
|
Создано: 22 декабря 2006 23:00 · Личное сообщение · #1 Добрый день! В своей программе я использую RichEdit (от 2.0, в зависимости от версии установленного в системе файла Riched20.dll), обращаясь к нему через интерфейсы TOM (Text Object Model). При этом обнаружился следующий глюк: метод SetName интерфейса ITextFont работает некорректно - шрифт Times New Roman не выставляется. Сохраняю содержимое RichEdit'а в RTF-файле посредством посыла ему сообщения EM_STREAMOUT. При этом сторонние программы, использующие RichEdit, отображают текст некорректно, а MS Word корректно. Обнаружив это обстоятельство, стал пробовать заменить файл Riched20.dll. С файлом от Windows 98 проблемы нет, но в нем отсутствуют те возможности, которые есть в аналогичном файле от Windows XP. Со всеми остальными версиями этой библиотеки та же проблема. Более того, в штатном WordPad'е при создании нового документ и выборе шрифта Times New Roman набиваемый текст выглядит, как MS Sans Serif! Выяснил в MSDN, что схожая проблема описана в KB884047, однако хот-фикс по этой теме удалось найти только для английской XP (KB884047-x86-ENU.exe), а у меня она русская. В этой связи просьба, если кто-либо сталкивался с подобной ситуацией, поделиться опытом ее решения. Или просто поделиться хотфиксом (ориентировочно он должен будет войти в XP SP3) или даже готовым пропатченным файлом Riched20.dll (или Msftedit.dll) или этими же файлами от русской Vista (может, там пропатчено). ![]() |
|
Создано: 22 декабря 2006 23:19 · Личное сообщение · #2 |
|
Создано: 22 декабря 2006 23:53 · Личное сообщение · #3 |
|
Создано: 23 декабря 2006 00:16 · Личное сообщение · #4 |
|
Создано: 23 декабря 2006 00:42 · Поправил: Wolfgang · Личное сообщение · #5 |
|
Создано: 23 декабря 2006 00:53 · Личное сообщение · #6 Wolfgang пишет: Более того, в штатном WordPad'е при создании нового документ и выборе шрифта Times New Roman набиваемый текст выглядит, как MS Sans Serif! Хм… Сейчас попробовал все нормально работает, класс RICHEDIT50W следы ведут в mfc42u.dll вернее подвешенная PROC находиться там - ИМХО. Может эта PROC и исправляет этот баг, но не факт что поможет! Смотреть самому влом… Так как ошибка в твоем коде! Давай сделаем так, ты скачай урок 34 Iczelion'a на русском! Запусти IczEdit.exe из архива напиши в WordPad в разных шрифтах слова скопируй и вставь в RichEdit20A (IczEdit.exe), у меня разные шрифты и размеры и все работает нормально – ИМХО P. S. XP SP2 ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 23 декабря 2006 01:05 · Поправил: back_analys · Личное сообщение · #7 |
|
Создано: 23 декабря 2006 01:08 · Личное сообщение · #8 Так как ошибка в твоем коде! Давай сделаем так, ты скачай урок 34 Iczelion'a на русском! тогда почему с Riched20.dll от Win98 все нормаьлно? Давай сделаем так, ты скачай урок 34 Iczelion'a на русском! А там есть что-либо про TOM? EM_SETCHARFORMAT работает нормально, но я не могу его использовать, потому что в моем случае нельзя трогать выделение текста. Могу предоставить файл, который Ричедит отображает одним шрифтом, а Ворд - другим ![]() |
|
Создано: 23 декабря 2006 01:09 · Личное сообщение · #9 |
|
Создано: 23 декабря 2006 01:13 · Личное сообщение · #10 |
|
Создано: 23 декабря 2006 01:30 · Личное сообщение · #11 back_analys Поискал, не нашел ничего. Кстати, файлы совершенно разные, хоть и содержат одинаковый функцинал. В аттаче пример файла, криво отображаемого ричедитом, если интересно XP SP2 ru ![]() ![]() |
|
Создано: 23 декабря 2006 01:42 · Личное сообщение · #12 |
|
Создано: 23 декабря 2006 02:02 · Личное сообщение · #13 |
|
Создано: 23 декабря 2006 02:12 · Личное сообщение · #14 |
|
Создано: 23 декабря 2006 02:20 · Личное сообщение · #15 Wolfgang Исследуемые мной проги, которые продают за деньги, не исползают это EM_STREAMOUT/EM_STREAMIN, потому что полно ошибок, забегая вперед, скажу, что следующий баг тебя ждет такой, при открытии файла больше 1mb будешь очень долго ждать ;) Обычно создается свой класс, помещается в свою библиотеку вся обработка сообщений и у каждой программы своя такая библиотека. (Вот так и патчат профи баги из Riched20.dll) Для примера чтобы понятнее было, класс RICHEDIT находится в riched32.dll, но юзается Riched20.dll Вместо EM_STREAMOUT/EM_STREAMIN используют связку CreateFileMapping(W) и т. д. Даже если ты найдешь патченный Riched20.dll не факт что тебе поможет! Возьми CodeHi.dll из пакета WinAsm Studio 5.1.3.0 там и описание есть всех сообщений, какие параметры нужно передавать и т. д. Это тебе пригодиться, если ты собираешься серьезное что-то написать!? ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 24 декабря 2006 21:15 · Личное сообщение · #16 |
|
Создано: 24 декабря 2006 23:48 · Личное сообщение · #17 Wolfgang пишет: А EM_STREAMOUT и не создает никаких файлов Wolfgang пишет: Сохраняю содержимое RichEdit'а в RTF-файле посредством посыла ему сообщения EM_STREAMOUT. LOL! Читай внимательнее стоя и вслух, что сам написал!!! Или объясняй конкретнее свои действия!? Тем более почитай The EM_STREAMOUT message causes a rich edit control to pass its contents to an application–defined EditStreamCallback callback function. The callback function can then write the stream of data to a file or any other location that it chooses. MSDN © ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 25 декабря 2006 00:52 · Личное сообщение · #18 Сохраняю содержимое RichEdit'а в RTF-файле посредством посыла ему сообщения EM_STREAMOUT. Да, но при этом МОЯ функция сохраняет содержимое в файл, это не очевидно? Demon666 LOL! Читай внимательнее стоя и вслух, что сам написал!!! Или объясняй конкретнее свои действия!? не можешь помочь, не замусоривай форум ![]() |
|
Создано: 25 декабря 2006 01:36 · Личное сообщение · #19 Wolfgang пишет: сохраняет содержимое в файл, это не очевидно? Дык, естественно я знаю, что ты будешь сохранять содержимое RichEdit'а после EM_STREAMOUT, но вижу, что ты не понял о чем я тебе писал. Demon666 пишет: связку CreateFileMapping(W) и т. д. File Management Functions CreateFileMapping FlushViewOfFile MapViewOfFile MapViewOfFileEx OpenFileMapping UnmapViewOfFile CloseHandle ReadFile VirtualAlloc WriteFile… и т. д. Это функции, которые надо использовать вместо EM_STREAMOUT/EM_STREAMIN, чтобы сохранять или записывать в файл из RichEdit'а данные напрямую.(без проблем!) Wolfgang пишет: не замусоривай форум Но думаю тебе бесполезно объяснять, что-либо ты уперся и думаешь, что во всем прав и к советам прислушиваться не хочешь - ИМХО. P. S. Твой файл вернее то, что в нем отображается, синим у меня все OK! :P =))) ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 25 декабря 2006 01:48 · Личное сообщение · #20 я не уперся, просто проблема моя в другом - корректное отображение фонтов ричедитом, в частности -выставление чарсета. Вот оно как... и как не используя EM_STREAMOUT получить содержимое ричедита в ртф-виде? P.s. Созданная мной тема не подразумевает рассматривание или оценивание чьих-либо личных качеств. ![]() |
![]() |
eXeL@B —› Программирование —› загадочный глюк с RichEdit |