powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А Form_resize для Common Dialog как отловить?
4 сообщений из 4, страница 1 из 1
А Form_resize для Common Dialog как отловить?
    #36487064
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну допустим запихнул я в Common Dialog рамку справа, считаю что получилось:
Код: 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.
Public Function OFNHookProc(ByVal hWnd As Long, _
...
   Select Case uMsg
...
      Case WM_NOTIFY
 ...
           Select Case tNMH.code
...
                Case CDN_INITDONE
                    '======================================
                    hWndParent = GetParent(hWnd)
                    'установка элементов
                    GetWindowRect hWndParent, rc    ' Common Dialog
                    Rem Find the ListView (LIST1) position to calculate
                    Rem where insert the Frame
                    hLV = GetDlgItem(hWndParent, ID_LIST1)  ' LIST1 handle
                    GetWindowRect hLV, rL             ' LIST1 rectangle
                    Rem In <pt> I will set the Left & Top of ListView LIST1
                    pt.X = rL.Right
                    pt.Y = rL.Top
                    ScreenToClient hWndParent, pt
                    gFR.Height = (rL.Bottom - rL.Top)
                    gFR.Left = pt.X
                    gFR.Top = pt.Y
                    rc.Right = rL.Right + gFR.Width

                    SetParent gFR.hWnd, hWndParent
                    gFR.Visible = True
                    rcDesk.Left =  0 
                    rcDesk.Top =  0 
                    rcDesk.Right = Screen.Width / Screen.TwipsPerPixelX
                    rcDesk.Bottom = Screen.Height / Screen.TwipsPerPixelY
                    SetWindowPos hWndParent,  0 , _
                         (rcDesk.Right - (rc.Right - rc.Left)) /  2 , _
                         (rcDesk.Bottom - (rc.Bottom - rc.Top)) /  2 , _
                          rc.Right - rc.Left, _
                          rc.Bottom - rc.Top, _
                          SWP_SHOWWINDOW
                    '======================================
                Case Else
...

Но я хочу:
Or OFN_ENABLESIZING

Код: plaintext
Debug.print uMsg
меня на изменение размера диалога ничем не радует.
Куда копать? Понятно, что код надо пихать еще и в Диалог_resize , только откуда его взять?
...
Рейтинг: 0 / 0
А Form_resize для Common Dialog как отловить?
    #36487471
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> Понятно, что код надо пихать еще и в Диалог_resize , только откуда его взять?

Попробовать поймать сообщение
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Public Function OFNHookProc(ByVal hWnd As Long, _
...
   Select Case uMsg
...
      Case WM_NOTIFY
...
      Case WM_SIZE or WM_SIZING
...
MSDNThe WM_SIZING message is sent to a window that the user is resizing. By processing this message, an
application can monitor the size and position of the drag rectangle and, if needed, change its size or position.

MSDNThe WM_SIZE message is sent to a window after its size has changed.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
А Form_resize для Common Dialog как отловить?
    #36488184
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Case WM_SIZE or WM_SIZING -это все правильно
только у нас диалог это hWndParent а не hwnd
Поэтому чуть покруче будет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Function OFNHookProc(ByVal hWnd As Long, _
...
   Select Case uMsg
...
      Case WM_NOTIFY
...
                Case CDN_INITDONE
...
                    SetWindowPos hWndParent,  0 , _
                         (rcDesk.Right - (rc.Right - rc.Left)) /  2 , _
                         (rcDesk.Bottom - (rc.Bottom - rc.Top)) /  2 , _
                          rc.Right - rc.Left, _
                          rc.Bottom - rc.Top, _
                           0  'здесь нужен 0, чтоб экран не мигал!!!
                    '======================================
                    OldWindowProc = SetWindowLong( _
                        hWndParent, GWL_WNDPROC, _
                        AddressOf NewWindowProc)
Код: 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.
' Process messages.
Private Function NewWindowProc(ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, lParam As WINDOWPOS) As Long
    ' If we're being destroyed,
    ' restore the original WindowProc.
    If msg = WM_NCDESTROY Then
        Debug.Print "WM_NCDESTROY"
        SetWindowLong _
            hWnd, GWL_WNDPROC, _
            OldWindowProc
    End If

    ' See if this is a WM_SIZE or WM_SIZING message.
    If msg = WM_SIZE Then
        Debug.Print "WM_SIZE"
        ChangeOurFramePosition hWnd
    End If
    If msg = WM_SIZING Then
        Debug.Print "WM_SIZING"
        ChangeOurFramePosition hWnd
    End If
    'If msg = 78 Then
    '    Debug.Print "WM_78"
    '    ChangeOurFramePosition hWnd
    'End If
    ' Continue normal processing. VERY IMPORTANT!
    NewWindowProc = CallWindowProc( _
        OldWindowProc, hWnd, msg, wParam, _
        lParam)
End Function
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub ChangeOurFramePosition(ByVal hWndParent As Long)
    Dim rc As RECT, rL As RECT, rcDesk As RECT
    Dim hLV As Long
    Dim pt As POINTAPI
    'установка элементов
    GetWindowRect hWndParent, rc    ' Common Dialog
    Rem Find the ListView (LIST1) position to calculate
    Rem where insert the Frame
    hLV = GetDlgItem(hWndParent, ID_LIST) 'ID_LIST)  ' LIST handle
    GetWindowRect hLV, rL             ' LIST rectangle
    Rem In <pt> I will set the Right & Top of ListView LIST
                    
    pt.x = rL.Right
    pt.y = rL.Top
    ScreenToClient hWndParent, pt
    gFR.Height = (rL.Bottom - rL.Top) * Screen.TwipsPerPixelY
    gFR.Left = pt.x * Screen.TwipsPerPixelX
    gFR.Top = pt.y * Screen.TwipsPerPixelY
End Sub

Остался один вопрос.
Код который я привел в самом начале не всегда выводит Frame ровно справа от LIST (почему-то ориентируется на минимальный размер диалога).
Но это бог с ним,это всегда исправляется ф-цией ChangeOurFramePosition.
Т.е. ее надо вставить кроме WM_SIZE or WM_SIZING в WM_ЧТО_НИБУДЬ_ЕЩЕ (что генерирутся в NewWindowProc при загрузке диалога), и все будет в шоколаде

В принципе пробовал в WM_78 (в коде, не знаю что это есть), но кажется это излишества.
Надо WM_ЧТО_ДРУГОЕ

Вопрос WM_ЧТО генерируется при появлении диалога (формы)?
...
Рейтинг: 0 / 0
А Form_resize для Common Dialog как отловить?
    #36488235
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Догадался. WM_SHOWWINDOW
Код: plaintext
1.
2.
3.
   ' See if this is a WM_SIZE or WM_SIZING or WM_SHOWWINDOW message.
    If msg = WM_SIZE Or WM_SIZING Or WM_SHOWWINDOW Then
        ChangeOurFramePosition hWnd
    End If
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А Form_resize для Common Dialog как отловить?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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