· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› PropertySheets

. 1 . 2 . >>

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


Дата: Авг 2, 2004 15:48:19 · Поправил: lazari

Помогите центрировать обычный визард на экране...
Почему не получается таким образом:
PropSheetProc proc hWnd:dword, uMsg:dword, lParam:dword
mov eax,uMsg
.if eax == PSCB_INITIALIZED
invoke GetDesktopWindow
invoke CenterWindow,eax,hWnd ; моя (рабочая) функция
.endif
ret
PropSheetProc endp
Модно конечно его цетрировать, если создать как PSH_MODELESS, но тогда окно "моргает", а я бы хотел, что бы оно центрировалось до отображения...

Да, и еще один вопросик: знает ли кто как убрать кнопку Cancel из визарда, например на последней страничке, т.к. какой в ней смысл, если там кнопка FINISH...


Дата: Авг 3, 2004 05:37:59 · Поправил: q_q

lazari
И где собственно центрирование? Может быть в твоей (рабочей) функции CenterWindow один retn 8.

... убрать кнопку Cancel ... какой в ней смысл, если там кнопка FINISH
Ты считаешь нормальным, что пользователь должен возвращаться на предпоследний шаг, чтобы отменить все шаги?


Дата: Авг 3, 2004 10:55:14

q_q
Я имел ввиду, что Финиш на последней страничке, когда уже ВСЕ проинсталировано, и чтобы унинсталить надо вызывать Унинсталл ... Я такое часто видел в других прогах (при инталле)
; CenterWindow ============================================================
CenterWindow PROC hMWnd:DWORD, hWnd:dword
LOCAL r:RECT
LOCAL r1:RECT
invoke GetWindowRect,hMWnd,ADDR r
invoke GetWindowRect,hWnd,ADDR r1
mov eax,r.right
add eax,r.left
sub eax,r1.right
add eax,r1.left
shr eax,1 ; / 2
mov edx,r.bottom
add edx,r.top
sub edx,r1.bottom
add edx,r1.top
shr edx,1 ; / 2
.if !(eax & 040000000h) && !(edx & 040000000h) ; ? SIGN BITS
invoke SetWindowPos,hWnd,HWND_TOP,eax,edx,0,0,SWP_NOSIZE + SWP_ASYNCWINDOWPOS
.endif
ret
CenterWindow ENDP
; ====================================================================== ===


Дата: Авг 3, 2004 13:19:09 · Поправил: q_q

lazari
центрировать обычный визард на экране
Похоже в рамках PROPSHEETHEADER.pfnCallback этого сделать не удастся.
Размеры диалога в момент PSCB_INITIALIZED - не такие, как когда диалог виден на экране. Плюс заметил, что координата левого верхнего угла почти постоянна относительно левого верхнего левого угла окна указанного в качестве PROPSHEETHEADER.hwndParent, если там указать NULL, то afak это равносильно рабочему столу. Почти, потому что, если специально утащить родительское окно в правый нижний угол экрана, то диалог расположится максимально близко к левому верхнему углу родителя, но так, чтобы быть полностью на экране. Из этих двух фактов вывод - после PSCB_INITIALIZED происходит еще что-то, что изменяет размеры и положение результирующего диалога.

Можно попробовать subclass.

Кнопку Cancel можно поискать в диалоговой процедуре последней страницы, только придется тестироваться на разных версиях win'ды, чтобы определить правильный алгоритм ее поиска, а потом делать ей SW_HIDE.


Дата: Авг 3, 2004 17:11:24

Ну чтож, спасибо!!!
Хоть я и надеялся на какое-нибудь не слишком "заумное" решение, но видимо придется искать, ковыряться и извращаться как обычно в винде ;)...


Дата: Авг 4, 2004 03:54:14

lazari
Есть идея. Перед Вызовом PropertySheet создать невидимое (т.е. без WS_VISIBLE и не делать ему ShowWindow) окно и указать его в качестве родителя. Координату его левого верхнего угла рассчитать так, чтобы PropertySheet расположился в центре экрана, правда остается вопрос - как определить размеры будущего PropertySheet. По поводу решения этого вопроса есть мысли. Попробую, если получится, сообщу.


Дата: Авг 4, 2004 04:13:55

FindWindowEx для поиска кнопки Cancel, если находит возвращает хэндл.
Я только не пойму, чего такой сложняк, приложение чужое что-ли?


Дата: Авг 4, 2004 05:27:14 · Поправил: AsmGuru62

Эта проблема (MoveWindow() не работает в CALLBACK-е PropertySheet-а) также встретилась мне в AsmDev 1.0. Решил я её так (плохо наверное, но не было времени для исследований):

- В объекте PropertySheet объявляем флаг (BOOL bCentered;)
- В том же PropertySheet делаем функцию:
void sheet::center (HWND h)
{
  if (! bCentered) {
    // Find coordinates relative to center of 'h'...
    // In case 'h' is NULL - use GetSystemMetrics() to
    // center it on the desktop

    MoveWindow (hSheet, ...);
    bCentered = TRUE;
  }
}

- Эта функция доступна из PropertyPage (базовый класс). Таким образом,
каждый наследованный PropertyPage может её вызвать.
- В ответе на WM_INITDIALOG (в PropertyPage) все вызывают эту функцию.

Работает без проблем.
Только надо перевести на ASM...


Дата: Авг 4, 2004 08:02:28 · Поправил: q_q

Asterix
По каким критериям поиск? Заголовок и класс окна?

AsmGuru62
Т.е. в WM_INITDIALOG первой, получившей его, страницы центрировать родителя?


Дата: Авг 4, 2004 08:20:40

q_q
Про заголовок я не подумал, класс - "Button".


Дата: Авг 4, 2004 09:05:15

Asterix
Там несколько кнопок. Как определить конкретно Cancel/Отменить?


Дата: Авг 4, 2004 09:15:36 · Поправил: lazari

q_q
Во как:
; FindCancel ==============================================================
FindPSButton proc hPS:dword, dwId:dword
LOCAL hBtn:dword
mov hBtn,0 ; start from first control
.while TRUE
invoke FindWindowEx,hPS,hBtn,addr szButtonClass,0
mov hBtn,eax
.break .if !eax
invoke GetWindowLong,eax,GWL_ID
.break .if eax == dwId ; if control found
.endw
mov eax,hBtn
ret
FindPSButton endp

и вызаваешь когда активируется соответсвующая под страница:
invoke FindPSButton,hPSheet,IDCANCEL
invoke EnableWindow,eax,FALSE

Asterix
Спасибо за идею... В принцепе сам примерно о том же подумывал, но надеялся на стандартные решение, хотя чем это не стандартно ? ...

AsmGuru62
Все работает как часы! Прими мои благодарности.

От себя могу добавить, если кому надо:
; PropSheetProc ===========================================================
PropSheetProc proc hWnd:dword, uMsg:dword, lParam:dword
mov eax,uMsg
.if eax == PSCB_INITIALIZED
m2m hPSheet,hWnd
invoke GetWindowLong,hWnd,GWL_STYLE
or eax,WS_MINIMIZEBOX
invoke SetWindowLong,hWnd,GWL_STYLE,eax
.else
mov eax,TRUE
ret
.endif
xor eax,eax ; FALSE
ret
PropSheetProc endp

Добавляет Minimize кнопку на главное окно...
Теперь оно выглядет боллее или менее "нормально" - со всеми атрибутами, как я и хотел.


Дата: Авг 4, 2004 10:14:44

lazari
А кнопка точно IDCANCEL?
Почему не попробывать GetDlgItem(hPS, IDCANCEL)?


Дата: Авг 4, 2004 12:14:15

q_q
Гениально !!!
И чего я стормозил? Видимо спать хотелось...
Кнопка ТОЧНО с ИД 2, а это, как я заметил, и есть IDCANCEL (случайное совпадение, а может и нет).
Это работает также и под 98 и под Хр, значит скорее всего и под всеми остальными окнами, вот проверю еще на 95 и все будет ясно...


Дата: Авг 4, 2004 12:57:49

lazari
А под w2k?

. 1 . 2 . >>


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