Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А Form_resize для Common Dialog как отловить? / 4 сообщений из 4, страница 1 из 1
25.02.2010, 03:28
    #36487064
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А Form_resize для Common Dialog как отловить?
Ну допустим запихнул я в 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
25.02.2010, 11:19
    #36487471
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А Form_resize для Common Dialog как отловить?
> Автор: Дмитрий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
25.02.2010, 15:22
    #36488184
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А Form_resize для Common Dialog как отловить?
Игорь Горбонос,
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
25.02.2010, 15:40
    #36488235
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А Form_resize для Common Dialog как отловить?
Догадался. 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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А Form_resize для Common Dialog как отловить? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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