powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
13 сообщений из 13, страница 1 из 1
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38672523
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь идет об этом:

How to Create Wizards

16172907

Задача - убрать крестик из заголовка.

Я не нашел как это легально сделать,
хотя есть живой пример:
Add Hadware Wizard.

Вариант ниже не устраивает. Он не убирает, а дизейблит, и не работает на aerowizard-е
Код: plaintext
1.
2.
3.
4.
    Case WM_INITDIALOG
...
      hMenu = GetSystemMenu(GetParent(hwndDlg), False)
      DeleteMenu hMenu, SC_CLOSE, MF_BYCOMMAND



Плюс - есть еще Alt+F4, ESC, Ctrl+Break их также желательно задавить.

Если говорить о форме, то в нек. системах програмирования есть понятие ControlBox=False (убирает крестик и не закрывает форму при указанных комбинациях).

Но я не знаю как это перевести в API и применить к GetParent(hwndDlg).

Ну, т.е. я считаю нормальным способом закрыть Wizard кнопку Cancel, состоянием которой я могу управлять (делать disable если визард делает что-то что нельзя прерывать, отображая например Progress при этом). Про Progress упомянул не случайно, т.к. чтобы он отображал, форма визарда должна быть "разморожена" (а не находиться в состоянии "не отвечает"), а в размороженном состоянии юзеру ничего не стоит тыкнуться в крестик при его наличии.
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38672558
Дмитрий77, вы не должны этого хотеть. Если юзер не сможет закрыть вашу программу крестиком, он прибьет ее через диспетчер задач, или на самом деле выключит питание, если не умеет диспетчером задач пользоваться.
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38672564
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант: обрабатывать нажатие крестика (событие WM_CLOSE если не ошибаюсь) и там спрашивать пользователя действительно он хочет все прервать или подождет еще.
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38672576
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКак вариант: обрабатывать нажатие крестика (событие WM_CLOSE если не ошибаюсь) и там спрашивать...
Этот метод я знаю, можно и не спрашивать.
Но крестик при этом нарисован.
Не пойдет.

Но я хочу чтоб крестика вообще не было нарисовано.
Примеры:
1) Панель Управления -> Установка оборудования
Хотя там подвох - можно закрыть "с клавиатуры".
2) Приложил exe-шник. Стандартная форма VB6 со свойством ControlBox=false. Закрывается только кнопкой на ней.
И вот как это на API понимать?

всё запретить,
несерьезные возражения. Конечно можно и кувалдой по компу, но речь не об этом.
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38673723
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вот так готовится.

Чтобы убрать крестик, надо снять стиль WS_SYSMENU с родительского диалога Wizard-а (не те, которые в ресурсах, т.е не страницы визарда, а генерируемая оболочка).
Делается это через документированную процедуру PropSheetProc callback function
Здесь два способа:
1) Ковырять PSCB_PRECREATE и структуры DLGTEMPLATE structure и DLGTEMPLATEEX structure (причем последняя видимо никогда не при делах -для визарда, но тем не менее).
Этот метод не работает для PSH_AEROWIZARD.

2) Но к счастью можно воспользоваться PSCB_INITIALIZED и просто убрать WS_SYSMENU через SetWindowLong/GetWindowLong/GWL_STYLE
И это работает как для PSH_WIZARD97 так и для PSH_AEROWIZARD

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
Public Const PSH_USECALLBACK = &H100 'Calls the function specified by the pfnCallback member

'Dialog Box Structures

Public Type DLGTEMPLATE
  style As Long
  dwExtendedStyle As Long
  cdit As Integer
  x As Integer
  y As Integer
  cx As Integer
  cy As Integer
End Type

Public Type DLGTEMPLATEEX
  dlgVer As Integer
  signature As Integer ' If signature is 0xFFFF, this is an extended dialog box template
  helpID As Long
  exStyle As Long
  style As Long
  cDlgItems As Integer
  x As Integer
  y As Integer
  cx As Integer
  cy As Integer
  '...ХЗ
End Type

'PropSheetProc callback function
'uMsg -Message being received.
Public Const PSCB_INITIALIZED = 1
Public Const PSCB_PRECREATE = 2 'not applicable if Aero wizard

...
  Dim psh As PROPSHEETHEADER
  With psh
...
    If sys_WinVista Then
      .dwFlags = PSH_WIZARD Or PSH_AEROWIZARD Or PSH_USEICONID Or PSH_USECALLBACK
...
    Else
      .dwFlags = PSH_WIZARD97 Or PSH_HEADER Or PSH_WATERMARK Or PSH_USECALLBACK
...
    End If
    .pfnCallback = FARPROC(AddressOf PropSheetProc)
...
  End With
  PropertySheet psh
End Sub


Private Function PropSheetProc(ByVal hwndDlg As Long, ByVal uMsg As Long, _
 ByVal lParam As Long) As Long
  Dim IntSignature As Integer 'pDlgTemplateEx->signature
  Dim pDlgTemplate As DLGTEMPLATE
  Dim dwStyle As Long
  
  Debug.Print uMsg
  Select Case uMsg
    Case PSCB_PRECREATE
      'способ #1:это не работает на PSH_AEROWIZARD!!!
      'Debug.Print "PSCB_PRECREATE"
      Call CopyMemory(IntSignature, ByVal (lParam + 2), 2)
      Debug.Print IntSignature
      If IntSignature <> &HFFFF Then 'if (pDlgTemplateEx->signature != 0xFFFF)
        Call CopyMemory(pDlgTemplate, ByVal lParam, Len(pDlgTemplate))
        pDlgTemplate.style = pDlgTemplate.style And Not WS_SYSMENU
        Call CopyMemory(ByVal lParam, pDlgTemplate, Len(pDlgTemplate))
        'Call CopyMemory(dwStyle, ByVal lParam, 4) 'pDlgTemplate->style
        'dwStyle = dwStyle And Not WS_SYSMENU
        'Call CopyMemory(ByVal lParam, dwStyle, 4)
      Else 'хотя это вряд ли понадобится
        Call CopyMemory(dwStyle, ByVal (lParam + 12), 4) 'pDlgTemplateEx->style
        dwStyle = dwStyle And Not WS_SYSMENU
        Call CopyMemory(ByVal (lParam + 12), dwStyle, 4)
      End If
    Case PSCB_INITIALIZED
      'способ #2:а вот это работает и на PSH_AEROWIZARD, и на PSH_WIZARD97
      'Debug.Print "PSCB_INITIALIZED"
      If sys_WinVista Then 'ну не дважды же его устанавливать (для PSH_WIZARD97)
        Call SetWindowLong(hwndDlg, GWL_STYLE, GetWindowLong(hwndDlg, GWL_STYLE) And Not WS_SYSMENU)
      End If
    Case Else
  End Select
End Function


всё запретитьДмитрий77Плюс - есть еще Alt+F4, ESC, Ctrl+Break их также желательно задавить.
...Дмитрий77, вы не должны этого хотеть....
Здесь пожалуй соглашусь. Кстати мастера от MS горячие клавиши не давят, а только скрывают крестик.
Можно конечно пытаться обрабатывать WM_CLOSE и т.п., но я это делать не буду.
Красный крестик - это та красная тряпка что бросается в глаза и то на чего у юзера руки чешутся нажать.
Чтоб использовать горячие клавиши, надо мозги немного включать (как минимум).
В мастере повторюсь для закрытия есть кнопка Cancel, всегда доступная тогда когда ее безобидно нажать.
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38673728
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, большая часть нормальных пользователей классифицируют
это окно Adware и постараются очень быстро избавиться от вашего
софта.

Очень быстро.
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38673736
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Это вот так готовится.я вот давно спросить хотел: меня одного раздражает в форуме С++ видеть код на VBA?
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38673741
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychя вот давно спросить хотел: меня одного раздражает в форуме С++ видеть код на VBA?
Во первых код не VBA, а VB.
Во вторых речь идет об API из MSDN которые больше C++ ориентированы, т.е. здесь дело не в языке кода.
Переписать его на C++ довольно просто.
Единственное что может раздражать, это то что на VB можно делать достаточно хитрые веши, кот. по общепринятому мнению обычно делают на C++.
И именно потому что обычно делают на C++, я и рассчитываю получить какую-то подсказку именно на этом форуме.
Извини, если что не так.

maytonДмитрий77, большая часть нормальных пользователей классифицируют
это окно Adware и постараются очень быстро избавиться от вашего
софта.
Очень быстро.
Ты это к чему написал?
Речь идет о стандартном визарде.
Картинку прилагаю.
Верхние -от MS. Нижняя - мой тест-проект.
Конкретно, мне надо сделать мастера резервирования/восстановления настроек программы.
Почему бы не сделать его в стандартном системном стиле.
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38673743
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychя вот давно спросить хотел: меня одного раздражает в форуме С++ видеть код на VBA?
Ну, скажем так, я надеялся на то что ты бы мне привел этот фрагмент кода, идею, решение и т.д. на C++.
И меня например не раздражает, что ты этого не сделал в силу того что не знаешь, не в теме, пожалел поделиться знаниями и т.д.
Я же не виноват что я нашел ответ раньше и сделал это на VB, ибо мне так удобнее.

А решениями я привык делиться и это ключевая мысль.

Или мне надо было специально самому на C++ перерисовывать?
Я думаю, кому надо - перерисовать не составит проблемы.
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38674083
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Я же не виноват что я нашел ответ раньше и сделал это на VB, ибо мне так удобнее.почему бы тебе такие топики в программировании не размещать тогда, если тебе язык не важен? Там бывают все те же люди, что и здесь, плюс другие, которые пишут не на С++ и этот форум не читают.
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38674288
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 19.06.2014 03:05, egorych wrote:

> я вот давно спросить хотел: меня одного раздражает в форуме С++ видеть
> код на VBA?

Полагаю, раздражает это всех.
Но код, видимо, полезный, а переписывать его на С автор не желает.
Поэтому пусть будет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38674290
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 19.06.2014 03:30, Дмитрий77 wrote:

> Ты это к чему написал?
> Речь идет о стандартном визарде.

Речь идёт о том, что плохо лишать пользователя возможности закрыть окно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
    #38674881
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychпочему бы тебе такие топики в программировании не размещать тогда, если тебе язык не важен? Там бывают все те же люди, что и здесь, плюс другие, которые пишут не на С++ и этот форум не читают.
Я лично там почти не бываю.
Я свою позицию уже высказывал.

Много информации по PropertySheet на языках отличных от C/C++?
На C++ как бы встречаются , и неплохие.
А я вот попробовал в Google забить (в кавычках):
"Private Type PROPSHEETHEADER"
-и не нашел ни одной ссылки
"Public Type PROPSHEETHEADER"
- и нашел одну - да и та моя
Объясню, в VB эту структуру по другому не определишь.

Не, если я так сильно здесь всех напрягаю...

MasterZiv,
>а переписывать его на С автор не желает
Автору это просто не нужно на тек. момент, скажем так.
А вот если б автору дали дельный кусок C-шного кода (на что автор рассчитывал), он бы его с удовольствием переписал бы в обратную сторону.

Кстати "диалоги" рисовал в VC++6 -студии, хорошая вещь однако. Я то думал, что в "чистом" (не повязанном на Net или какие-нибудь MFC) C++ все в основном через CreateWindow делается.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / А как в Wizard (PropertySheet) удалить(Hide) крестик (который Close)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]