Кнопка максимизирования в MDI формах

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Кнопка максимизирования в MDI формах

Сообщение AndreyG_80 » 05.04.2006 (Ср) 13:21

Всем добрый день.

У меня есть MDI форма. Мне нужно чтоб ее можно было только закрыть или минимизировать. И соответственно нужно убрать кнопочку "максимизировать" или "востановить прежний размер".
Как это сделать?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.04.2006 (Ср) 13:43

Код: Выделить всё
Option Explicit

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Private Const SC_MAXIMIZE As Long = &HF030&
Private Const MF_BYCOMMAND As Long = &H0&

Private Sub MDIForm_Load()
  Dim h As Long
 
  h = GetSystemMenu(Me.hwnd, 0)

  If h Then RemoveMenu h, SC_MAXIMIZE, MF_BYCOMMAND
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 05.04.2006 (Ср) 15:13

Спасибо.

Только есть маленький ньансик. В меню окна присутсвует "востановить".
Как его сделать неактивным?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.04.2006 (Ср) 15:23

Код: Выделить всё
Private Const SC_RESTORE = &HF120&


и тп

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.04.2006 (Ср) 15:25

В меню окна оно и так неактивно...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 05.04.2006 (Ср) 15:38

GSerg
Кнопочка неактивна, а в менюшке этот пункт активен...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.04.2006 (Ср) 15:42

В менюшке вообще ничё нет в итоге.
А кнопочка как раз активна... у меня так, во всяком случае. Возможно, это специфично для операционки, и тогда подход неверен изначально.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.04.2006 (Ср) 15:48

Код: Выделить всё
Option Explicit

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Const GWL_STYLE As Long = -16
Private Const WS_MAXIMIZEBOX As Long = &H10000

Private Const SC_MAXIMIZE As Long = &HF030&
Private Const SC_RESTORE = &HF120&
Private Const MF_BYCOMMAND As Long = &H0&

Private Sub MDIForm_Load()
  Dim h As Long
 
  h = GetSystemMenu(Me.hwnd, 0)
 
  If h Then
    RemoveMenu h, SC_MAXIMIZE, MF_BYCOMMAND
    RemoveMenu h, SC_RESTORE, MF_BYCOMMAND
  End If
 
  SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(Me.hwnd, GWL_STYLE) And Not WS_MAXIMIZEBOX
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 06.04.2006 (Чт) 13:34

Все работает. Большое спасибо.

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 06.04.2006 (Чт) 14:07

Ой, непонятный прикол?!

Оно перестает работать когда я присваиваю какое-то значение свойству Caption
Код: Выделить всё
MDIForm1.Caption = "forma"

Кнопочка "востановить" стает активной.
В чем проблема?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.04.2006 (Чт) 14:20

Угу. VB возвращает WS_OVERLAPPEDWINDOW.
Но кнопка всё равно не работает :)

Можно ставить текст через SetWindowText.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 06.04.2006 (Чт) 14:32

Еще одна интересная глюка.
Окно разворачивается на полный экран, получается, что нижнюю часть окна закрывает панель задач.

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 06.04.2006 (Чт) 15:11

А вот еще одно. При двойном клике, на строке заголовка окна, окно принимает нормальный размер (из максимизированого востанавливается в нормальное)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.04.2006 (Чт) 15:23

У меня окно изначально не максимизировано. И потому никуда не выставляется.

Ну сабклассь, отлавливай WM_SYSCOMMAND, игнорь.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 06.04.2006 (Чт) 15:28

Я не знаю как это делается :oops:
Если не трудно, подскажите как отлавливать WM_SYSCOMMAND, или ткните где искать

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.04.2006 (Чт) 15:48

В Кирпичах сабклассер берёшь и отлавливаешь.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 06.04.2006 (Чт) 15:51

Я сделал по простому
Код: Выделить всё
If Me.WindowState = 0 Then Me.WindowState = 2

Правда не знаю насколько это правильно, но работает без проблем.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 192

    TopList