· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Форматирование в RichEdit.

Посл.отвђт Сообщенiе


Дата: Авг 18, 2003 05:23:27

Помогите, спецы по Rich Edit контролу!

Есть множественное форматирование, полученное в структуру CHARFORMAT2 сообщением EM_GETCHARFORMAT.
Например я получил CHARFORMAT2.dwEffects=7h
Методом подбора вычислил что это CFE_BOLD Or CFE_ITALIC Or CFE_UNDERLINE, где
CFE_BOLD = &H1,CFE_ITALIC = &H2,CFE_UNDERLINE = &H4
Всё это форматирование соответственно равно 7h
Но это я знаю конкретно для этого примера, что 7h равно именно слиянию трёх эффектов.
Могу ли я определить каким нибудь способом из полученного числа одну из его составляющих?
К примеру, есть ли в данном форматировании CFM_UNDERLINE?

Или я должен перебирать все возможные варианты?

И ещё, иногда к форматированию добавляется &H40000000. Описания этой константы я не нашёл в АПИ-вьювере.

Спасибо.


Дата: Авг 18, 2003 10:36:30 · Поправил: Bog_

CyberRat

if (CHARFORMAT2.dwEffects & CFM_UNDERLINE) ...

Прочтите введение в булеву алгебру :)

0x40000000 - CFE_AUTOCOLOR
The text color is the return value of GetSysColor (COLOR_WINDOWTEXT). If this flag is set, the crTextColor member is ignored.


Дата: Авг 19, 2003 04:55:54

Спасибо, обязательно прочту, раз вы в ней ничего не поняли. :)
0x40000000 - это не только CFE_AUTOCOLOR, но и CFM_COLOR.
Но это так, к слову.
Маска получается множественная: CFM_ALL=&HF800003F=CFM_EFFECTS Or CFM_SIZE Or CFM_FACE Or CFM_OFFSET Or CFM_CHARSET
Если я вас правильно понял, то если маска CFM_ALL, то к эффектам прибавляется это самое CFE_AUTOCOLOR.
Получается что в люой маске, где одним из составляющих является CFM_EFFECTS и будет прибавляться этот автоколор?
Потому что CFM_EFFECTS тоже множественная маска. И она эквивалента CFM_BOLD Or CFM_ITALIC Or CFM_UNDERLINE Or CFM_COLOR Or CFM_STRIKEOUT Or CFE_PROTECTED Or CFM_LINK. А эффект CFE_AUTOCOLOR может быть использован только при маске CFM_COLOR
Тогда возвращаюсь к предыдущему вопросу. Как извлечь подмаску из множественной маски?
Потому как, бывает что выдаётся маска, которой вообще нет в API-декларациях.


Дата: Авг 19, 2003 05:05:40

CyberRat
Тогда возвращаюсь к предыдущему вопросу.
Bog_ уже ответил. Берёте маску и применяете битовую AND:
mov eax,mask
and eax,sub_mask
jnz _YES
_NO:
; . . .
_YES:
; . . .


Дата: Авг 19, 2003 05:11:51 · Поправил: CyberRat

Спасибо попробую


Дата: Авг 19, 2003 11:15:06

CyberRat

раз вы в ней ничего не поняли.
Довольно голословное заявление...
0x40000000 - это не только CFE_AUTOCOLOR, но и CFM_COLOR.
Вы не мешайте в одну кучу CFE_ и CFM_...
CFM_ - это флаги маски(dwMask), отвечающие за валидность определенного флага в dwEffects (кстати они также отвечают и за валидность других полей в CHARFORMAT2).
CFE_ - собственно сами флаги эффектов

Если я вас правильно понял, то если маска CFM_ALL, то к эффектам прибавляется это самое CFE_AUTOCOLOR.

Не правильно, в силу пиведенных выше причин! CFM_ALL лишь задает валидность всех полей, в том числе и бита, соответствующего CFE_AUTOCOLOR, а применение эффекта будет уже зависеть уже от самого флага CFE_AUTOCOLOR. Как его проверять я уже писал.


Дата: Авг 20, 2003 04:25:02

Quantum
Ещё раз спсибо. На бобуинском это будет выглядеть так:
MultiFormat AND SingleFormat = SingleFormat

Bog_
Вы были правы. Только Ваш ответ нес так мало информации для меня, что я в попыхах не сообразил, что конкретно вы имеете ввиду. Да и даёте вы мне только ту информацию которую я уже знаю. Про маски, эффекты и т.д. Если вы уж такой любитель придираться к словам, то я вам объясню: маска определяет над каким именно элементом типа CHARFORMAT2 будет производится действие. А эффект в данном случае является операндом. CFM_ - маска, CFE_ - её операнд. Если вы зададите например маску CFM_BOLD, а эффект, например CFE_ITALIC, то соответственно никакого BOLD не будет. Вы, кстати, взгляните значения масок для эффектов и самих эффектов - они идентичны.
А насчёт "введение в булеву алгебру" - Я уже подковался у програмера на Алголе'68 :) и теперь точно знаю что делают AND, OR и NOT. Ну а XOR я и так знал.

Как его проверять я уже писал.
К сожалению из нашего с вами разговора я не вынес для себя ничего полезного. Это очень печалит. Таким покровительственным тоном могут заявлять только те, кто хоть немного помог. В вашем случае это не так.

===

Мне кажется способ объединения значений оператором OR экономен и удобен, если не сказать гармоничен. Вот тебе и дЗен :)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.065