|
|
| Посл.отвђт | Сообщен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? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071 |