MinButton & MaxButton

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

MinButton & MaxButton

Сообщение Antonariy » 03.07.2007 (Вт) 11:17

Пытаюсь отобразить сабжи на форме, где они выставлены в False:
Код: Выделить всё
    lRet = GetWindowLong(hwnd, GWL_STYLE)
    SetWindowLong hwnd, GWL_STYLE, lRet Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
Не отображаются :(
Несмотря на то, что пример взят с сайта MS.
Лучший способ понять что-то самому — объяснить это другому.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.07.2007 (Вт) 11:42

Там надо сделать Update окна каким-то образом... Я делал через SetWindowRgn со вторым параметром 1, хоть это и криво.
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.07.2007 (Вт) 12:15

Не помогло. Только xp-шный стиль слетел.
Лучший способ понять что-то самому — объяснить это другому.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.07.2007 (Вт) 12:31

Код почему-то начинает работать после клика по заголовку...
Также он вполне исправно работает в Form_Load...
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.07.2007 (Вт) 12:32

UpdateWindow тоже не помогло (frm.Refresh пробовал до этого, разве не то же самое?). Из Form_Load вызывать нельзя:
Код: Выделить всё
    Select Case Sizable
        Case "sizable"   ': Set frm = New frmSizable
            Set frm = New frmFixed
            frm.BorderStyle = 2
            lRet = GetWindowLong(frm.hwnd, GWL_STYLE)
            SetWindowLong frm.hwnd, GWL_STYLE, lRet Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
        Case "fixed":    Set frm = New frmFixed
        Case "mdi":      Set frm = New MDIForm1
        Case "mdichild": Set frm = New frmMDIChild
    End Select
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение GSerg » 03.07.2007 (Вт) 13:37

MSDN писал(а):If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.07.2007 (Вт) 13:49

Код: Выделить всё
    Select Case Sizable
        Case "sizable"   ': Set frm = New frmSizable
            Set frm = New frmFixed
            frm.BorderStyle = 2
            lRet = GetWindowLong(frm.hwnd, GWL_STYLE)
            SetWindowLong frm.hwnd, GWL_STYLE, lRet Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
           
            SetWindowPos frm.hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_FRAMECHANGED
        Case "fixed":    Set frm = New frmFixed
        Case "mdi":      Set frm = New MDIForm1
        Case "mdichild": Set frm = New frmMDIChild
    End Select
Все равно не работает.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.07.2007 (Вт) 14:43

Кстати в Form_Load тоже не работает.
Лучший способ понять что-то самому — объяснить это другому.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 03.07.2007 (Вт) 18:40

У меня работает с SendMessage

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

    lRet = GetWindowLong(hwnd, GWL_STYLE)
    SetWindowLong Me.hwnd, GWL_STYLE, lRet Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    ReleaseCapture
    SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&


P. S. Даже ReleaseCapture не надо:
Код: Выделить всё

    lRet = GetWindowLong(hwnd, GWL_STYLE)
    SetWindowLong Me.hwnd, GWL_STYLE, lRet Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 06.07.2007 (Пт) 14:06

Кстати, щас реализовал это в своей проге. Для отображения достаточно просто изменить заголовок формы:

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

me.Caption = me.Caption


Или скрыть, а потом отобразить форму:

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

me.Hide
me.Show
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 09.07.2007 (Пн) 16:07

Вопрос по теме...
Я сабклассю WM_NCCALCSIZE(кто не знает - определение клиентской области окна). Вопрос - как его спровоцировать? Просто применяются новые настройки только при изменении размеров окна, причём не програмно.
Изображение

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

Сообщение GSerg » 09.07.2007 (Пн) 19:46

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

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 10.07.2007 (Вт) 1:34

Я это уже пробовал(SWP_FRAMECHANGED), но оно не работало.
Изображение


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

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

Сейчас этот форум просматривают: Google-бот и гости: 103

    TopList