powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как двигать форму если "шапки" у нее нет.
12 сообщений из 12, страница 1 из 1
Как двигать форму если "шапки" у нее нет.
    #37010472
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е. форма типа заставки (окно about). Для красоты шапка окна убрана (Form.Caption=пусто и кнопки убраны). Зоны "формы" тоже как бы нет. Грубо несколько PictureBox вплотную. За что б ее подвигать и как?
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37010474
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно за что угодно :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private MeX!, MeY!

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button =  1  Then
    MeX = X
    MeY = Y
  End If
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button =  1  Then
    Me.Left = X + Me.Left - MeX
    Me.Top = Y + Me.Top - MeY
  End If
End Sub
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37010875
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> За что б ее подвигать и как?

Вот здесь Antonariy давай
ссылку на учебник,в котором есть несколько любопытных примеров.
Перетаскивание формы за любое место:
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2

Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
ReleaseCapture
SendMessage Form1.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
End Sub


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37011921
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Ваш пример через API явно культурнее, займусь его имплементацией.

ZVI, вам также спасибо. Но честно я счаслив что не использовал/не интересовался этим "детским" способом раньше.
Здесь можно провести аналогию с "разделителем".
Взаимное положение ListView/Treeview

"Детские способы" вызывают много мульт-спец-эффектов, т.е. по способу 1 можно экран веерами этой формой раскрашивать, в в способ 2 все культурно.

А в случае с раздлителями я до сих пор еще не доборолся с последствиями "детства", уж больно хитро\' у меня местами с этими дельтами.

Кстати попутно вопрос :
Как сделать так, чтоб шапка не показывалась, но при этом ShowInTaskbar=true и там было описание окна? Если это About как modal от основной формы, то ShowInTaskbar не нужен. А если это About вызванный из трея, то очень даже не повредит, ибо накроется другим окном и не увидишь, а делать непотопляемыми такие окна думаю свинство.
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37012578
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77...
Как сделать так, чтоб шапка не показывалась, но при этом ShowInTaskbar=true и там было описание окна? Если это About как modal от основной формы, то ShowInTaskbar не нужен. А если это About вызванный из трея, то очень даже не повредит, ибо накроется другим окном и не увидишь, а делать непотопляемыми такие окна думаю свинство.
Ну, вот Вам не "детский" пример, хотя и без любимых Вами "перламутровых пуговиц" :-)
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37012606
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл вложить ICO, приложил полный вариант
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37012622
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI, спасибо.
Только с пикселями наверно зря возитесь.
Так думаю достаточно.
Код: plaintext
1.
2.
3.
4.
5.
Private Const SWP_NOSIZE = &H1

Private Sub Form_Load()
  SetWindowLong hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) And Not WS_BORDER
  SetWindowPos hWnd,  0 &,  0 &,  0 &,  0 &,  0 &, SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_FRAMECHANGED
End Sub
Мне единственное над чем подумать надо:
1)Если это About как modal от основной формы, то ShowInTaskbar не нужен.
2) А если это About вызванный из трея, то очень даже не повредит
Т.е. у меня трей и about это разные exe, тот exe где about слишком сложный и я не стал его мешать с треем. Но из его формы about тоже вызывается.

Дело в том что ShowInTaskbar в режиме выполнения не поменять, а только в конструкторе.
Можно через API через сабклассинг формы при ее старте, я сам тут давал ссылку на пример с акселератора, но думаю здесь это лишний геморрой, проще одну форму 2 раза в 2-а экзешника воткнуть наверно.
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37012626
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с другой стороны, все эти градиенты и 32-битные иконки отрисовывать... да еще рискуя что антивирус лишний раз за ж извините ни за что из за этих картинок схватит, м.б. проще лишний сабклассинг нарисовать...
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37014611
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Только с пикселями наверно зря возитесьСовсем не вожусь :-) Не обращайте внимания на то, что вне темы типа ограничения одной копии в памяти и т.п.

Пример ведь был к тому, что я цитировал: Как сделать так, чтоб шапка не показывалась, но при этом ShowInTaskbar=true и там было описание окна? ... если это About вызванный из трея, то очень даже не повредит, ибо…

2)Т.е. у меня трей и about это разные exe, тот exe где about слишком сложный и я не стал его мешать с треем. Но из его формы about тоже вызывается.
Какая разница сколько приложений? Используйте приведенный мною пример формы frmAbout с соответствующим кодом в том приложении, в котором нужно.

3) Дело в том что ShowInTaskbar в режиме выполнения не поменять, а только в конструкторе. Можно через API через сабклассинг формы при ее старте…
Да легко это делается как при загрузке формы, так и в runtime:
Hide/Show Form in taskbar at runtime
Код: plaintext
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.
' ZVI:2010-12-14 Form code
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Private Const GWL_EXSTYLE = - 20 
Private Const WS_EX_APPWINDOW = &H40000

Private Sub Form_Load()
  ' Hide Form from the taskbar as loading
  'SetWindowLong hWnd, GWL_EXSTYLE, (GetWindowLong(hWnd, GWL_EXSTYLE) And Not WS_EX_APPWINDOW)
End Sub

Private Sub cmdHideFromTaskbar_Click()
  ' Freeze the window
  LockWindowUpdate hWnd
  ' Hide Form
  Me.Hide
  ' Hide Form from the taskbar
  SetWindowLong hWnd, GWL_EXSTYLE, (GetWindowLong(hWnd, GWL_EXSTYLE) And Not WS_EX_APPWINDOW)
  ' Show Form
  Me.Show
  ' Release the lock
  LockWindowUpdate  0 &
End Sub

Private Sub cmdShowInTaskbar_Click()
  ' Freeze the window
  LockWindowUpdate hWnd
  ' Hide the form
  Me.Hide
  ' Show this form on the taskbar
  SetWindowLong hWnd, GWL_EXSTYLE, (GetWindowLong(hWnd, GWL_EXSTYLE) Or WS_EX_APPWINDOW)
  ' Show Form
  Me.Show
  ' Release the lock
  LockWindowUpdate  0 &
End Sub

Private Sub cmdExit_Click()
  Unload Me
End Sub
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37014626
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Private Declare Function FindWindow... - лишнее
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37014888
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI, спасибо, позже поиграюсь.
Да суть я там уловил как вы наверно заметили. А по поводу пикселей, вы это делаете типа Workaround чтоб форма не складывалась вместо SWP_NOSIZE.
Но только у меня есть сомнения, что на XP- или виста- стилях эти +6 будут именно +6, а не 7-8-9, у меня сразу подозрения на эту тему закрались, поэтому это место не понравилось.
...
Рейтинг: 0 / 0
Как двигать форму если "шапки" у нее нет.
    #37017307
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77ZVI, спасибо.
Только с пикселями наверно зря возитесь.
Так думаю достаточно.
Код: plaintext
1.
2.
3.
4.
5.
Private Const SWP_NOSIZE = &H1

Private Sub Form_Load()
  SetWindowLong hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) And Not WS_BORDER
  SetWindowPos hWnd,  0 &,  0 &,  0 &,  0 &,  0 &, SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_FRAMECHANGED
End Sub

Оказывается недостаточно, проглядел. Суммарная высота формы не меняется, т.е. снизу кусок добавляется. Поступил по другому. Заготавливаем форму без шапки (без Caption и кнопок) и делаем трюк. Независимо от стиля все будет нормально.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private Sub Form_Load()
    Dim H As Long 'сохраняем родную высоту
    H = Me.Height
    Me.Caption = "The proga is!"
    SetWindowLong hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) And Not WS_BORDER
    SetWindowPos hWnd,  0 &,  0 &,  0 &,  0 &,  0 &, SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_FRAMECHANGED
    Me.Height = H
End Sub
Единственное, если кнопки закрыть/свернуть таки нужны.. Для About мне OK достаточно, а ShowInTaskbar только чтоб форма не терялась.
По поводу ShowInTaskBar мне нужно только это (в конструкторе false):
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Form_Load()
...
    If InStr(Command, "/about") >  0  Then
        ' Show Form in the taskbar as loading
        SetWindowLong hWnd, GWL_EXSTYLE, (GetWindowLong(hWnd, GWL_EXSTYLE) Or WS_EX_APPWINDOW)
    End If
...
Да уж, примеры из vbAкселератор пытаются представить жизнь излишне сложной, а на самом деле все просто.
Чего вышло прилагается.
===========================
ZVI, может сюда глянете.
Как свернуть форму в левый нижний угол экрана?
Игрался с Вашим кодом и случайно исполнил трюк (одновременно Taskbar+левый угол), который не мог понять как сделать. Но он получился не совсем так как задумано, т.е. синхронно. Там все попытался объяснить.
===========================
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как двигать форму если "шапки" у нее нет.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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