|
|
| Посл.отвђт | Сообщен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 |