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

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Каретка пропадает

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


Дата: Ноя 3, 2003 04:30:16

После вот такого кода:
;cfg.DefFont - LOGFONT
        invoke FontDialog,hWnd,addr cfg.DefFont,CF_BOTH
        invoke CreateFontIndirect,addr cfg.DefFont
        invoke SelectObject,hDC,eax
        invoke GetCharWidth,hDC,32,255,addr AZWidth
        invoke SetBkColor,hDC,cfg.WWc

в окне не видно каретки. Все функции возвращают 1, GetCaretPos дает видимые координаты (текст там выводится - видно), но не видно каретки, и все тут! Я её даже удалял перед вышеприведенным, потом снова создавал - та же плюшка. Как мне дальше жить?


Дата: Ноя 3, 2003 13:36:28

так попробуй по одной строчке добавлять и смотри когда курсок исчезнет, потом в этой строке, которая курсор гасит, смотри какие параметры его гасят.


Дата: Ноя 3, 2003 18:36:39

Курсор убивается в момент появления диалога на экране. Причем так плдучается только для фонтового диалога, About'ы, и пр. без проблем. Думал, Винда убивает, потому что There is one caret in system, а диалог содержит каретку (он принадлежал моему окну). Так нет же, в поле Owner пишу NULL, и ничего не меняется, разве что убедиться в отсутствии каретки можно убедиться, не закрывая ChooseFont. :((


Дата: Ноя 3, 2003 18:58:09

При работе с кареткой надо учитывать где сейчас находится фокус.
Попробуйте такой код:
.DATA
strClass db 64 dup (0)
strCaption db 64 dup (0)

.CODE
invoke GetFocus
mov ebx, eax
invoke GetClassName,eax,addr strClass,64
invoke GetWindowText,ebx,addr strCaption,64

Это даст представление о том, где фокус сейчас.


Дата: Ноя 4, 2003 08:59:13

Не проходит... Загвоздка в том, что все нормально до самого вызова ChooseFont, а сразу после уже все плохо. Вроде никаких действий с кареткой я произвести не успеваю.


Дата: Ноя 4, 2003 09:18:28

Ну никак не могу сам разобраться.
Вот в качестве примера: если каким-нибудь Prostart (из пакета MASM32) соорудить приложение, вставить после CreateWindow в WinMain
    invoke CreateCaret,hWnd,NULL,8,8
    invoke SetCaretPos,55,55

, а в WndProc записать что-то вроде
    .if uMsg == WM_COMMAND
    ;======== toolbar commands ========
        .if wParam == 50
            invoke ShowCaret,hWnd

        .elseif wParam == 51
            invoke HideCaret,hWnd
        .elseif wParam == 52
            invoke FontDialog,hWnd,addr lf,CF_BOTH

, то же самое: ничего сделать не успеваешь, а каретки уже нет! Обидно до слез...


Дата: Ноя 4, 2003 18:20:53

Ну теперь то проблема ясно видна!
CreateCaret() можно вызывать только в ответ на WM_SETFOCUS.
DestroyCaret() вызывается только в ответ на WM_KILLFOCUS.

Причём это надо только если Вы разрабатываете какой либо редактор, которомы нужна каретка. Кстати, вопрос, а что именно Вы разрабатываете?


Дата: Ноя 4, 2003 22:34:10

AsmGuru62
а что именно Вы разрабатываете?
Это пока страшная тайна ;)
DestroyCaret() вызывается только в ответ на WM_KILLFOCUS
Так каретку надо периодически уничтожать? Я на WM_ACTIVATE с wParam==INACTIVE её по-ламерски прятал, а потом обратно показывал. Потерял трое суток на этой идиотской трабле. Плохо быть кретином :((( Спасибо за информацию!


Дата: Ноя 4, 2003 23:00:36

Вот ещё один подводный камешек: надо не забыть 'переправить' фокус на своё собственное окно при получении WM_LBUTTONDOWN:
case WM_LBUTTONDOWN:
  if (GetFocus () != YourHWND) {
    SetFocus (YourHWND);
    }
  break;

Конечно, надо перевести это на ASM.


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