Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426

Глюк (?) с позиционированием SHBrowseForFolder

04.06.2019, 17:49. Показов 1184. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При вызове окна выбора папки с помощью SHBrowseForFolder окно нижним краем уходит за границу десктопа (не только у меня - во многих серьёзных программах есть такой глюк). Как можно центрировать это окно? Я могу попытаться с помощью API-функций отловить это окно и задать ему положение, но нету ли более простого метода? Там в модуле при вызове используются разные флаги:
Visual Basic
1
2
3
4
5
6
With tBrowseInfo
        .hWndOwner = owner.hWnd
        .lpszTitle = lstrcat(szTitle, "")
        .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_STATUSTEXT + BIF_NEWSTYLE
        .lpfnCallback = GetAddressofFunction(AddressOf BrowseCallbackProc)  'get address of function.
End With
может есть специальный флаг, отвечающий за положение на экране?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2019, 17:49
Ответы с готовыми решениями:

Коллизия с Expected Array в SHBrowseForFolder
В проге используется модуль для работы с SHBrowseForFolder с кнопкой «Создать новую папку» и заданием стартовой папки. Там есть такие...

Глюк с позиционированием IE7
Вот такой вот код html {height: 100%;} body {background:#EEEEEE; text-align:center; /*background-attachment: fixed;*/ ...

Первоначальная папка для SHBrowseForFolder
Подскажите как назначить первоначальную папку для api компонента SHBrowseForFolder. т.е. чтобы открывался диалог и уже была выбрана какая...

5
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
05.06.2019, 10:12
BrowseCallbackProc в студию.
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
05.06.2019, 10:44  [ТС]
Вызываю так:
Visual Basic
1
SelectedFolder = BrowseForFolder(Me, "Select A Directory", "N:\Visual Basic\! My VB progs\! My VB 6\! АКТИВНЫЕ\PicCut\PicCut Pics")
Модуль целиком:
Visual Basic
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
' Browse for a Folder using SHBrowseForFolder API function with a callback
' function BrowseCallbackProc.
'
' This Extends the functionality that was given in the
' MSDN Knowledge Base article Q179497 "HOWTO: Select a Directory
' Without the Common Dialog Control".
'
' After reading the MSDN knowledge base article Q179378 "HOWTO: Browse for
' Folders from the Current Directory", I was able to figure out how to add
' a callback function that sets the starting directory and displays the
' currently selected path in the "Browse For Folder" dialog.
'
' I used VB 6.0 (SP3) to compile this code.  Should work in VB 5.0.
' However, because it uses the AddressOf operator this code will not
' work with versions below 5.0.
'
' This code works in Window 95a so I assume it will work with later versions.
'
' Stephen Fonnesbeck
' steev@xmission.com
' http://www.xmission.com/~steev
' Feb 20, 2000
'
'=====================================================================================
' Usage:
'
'    Dim folder As String
'    folder = BrowseForFolder(Me, "Select A Directory", "C:\startdir\anywhere")
'    If Len(folder) = 0 Then Exit Sub  'User Selected Cancel
'
'=====================================================================================
Option Explicit
'
Public Const BIF_NEWSTYLE = &H40 ' koenbuytaert
Private Const BIF_STATUSTEXT = &H4&
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2
Private Const MAX_PATH = 260
Private Const WM_USER = &H400
Private Const BFFM_INITIALIZED = 1
Private Const BFFM_SELCHANGED = 2
Private Const BFFM_SETSTATUSTEXT = (WM_USER + 100)
Private Const BFFM_SETSELECTION = (WM_USER + 102)
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Type BrowseInfo
    hWndOwner      As Long
    pIDLRoot       As Long
    pszDisplayName As Long
    lpszTitle      As Long
    ulFlags        As Long
    lpfnCallback   As Long
    lParam         As Long
    iImage         As Long
End Type
Private m_CurrentDirectory As String   'The current directory
'
 
Public Function BrowseForFolder(owner As Form, Title As String, StartDir As String) As String
    'Opens a Treeview control that displays the directories in a computer
    Dim lpIDList As Long
    Dim szTitle As String
    Dim sBuffer As String
    Dim tBrowseInfo As BrowseInfo
    m_CurrentDirectory = StartDir & vbNullChar
    szTitle = Title
    '====================================================================
    ' оригинал
    '    With tBrowseInfo
    '        .hWndOwner = owner.hWnd
    '        .lpszTitle = lstrcat(szTitle, "")
    '        .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_STATUSTEXT
    '        .lpfnCallback = GetAddressofFunction(AddressOf BrowseCallbackProc)  'get address of function.
    '    End With
    '=====================================================================
    ' дополнение от koenbuytaert
    With tBrowseInfo
        .hWndOwner = owner.hWnd
        .lpszTitle = lstrcat(szTitle, "")
        .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_STATUSTEXT + BIF_NEWSTYLE
        .lpfnCallback = GetAddressofFunction(AddressOf BrowseCallbackProc)  'get address of function.
    End With
    '=====================================================================
    '
    lpIDList = SHBrowseForFolder(tBrowseInfo)
    If (lpIDList) Then
        sBuffer = Space(MAX_PATH)
        SHGetPathFromIDList lpIDList, sBuffer
        '        sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
        sBuffer = VBA.Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
        BrowseForFolder = sBuffer
    Else
        BrowseForFolder = ""
    End If
End Function
 
Private Function BrowseCallbackProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal lp As Long, ByVal pData As Long) As Long
    Dim lpIDList As Long
    Dim ret As Long
    Dim sBuffer As String
    On Error Resume Next  'Sugested by MS to prevent an error from
    'propagating back into the calling process.
    Select Case uMsg
        Case BFFM_INITIALIZED
            Call SendMessage(hWnd, BFFM_SETSELECTION, 1, m_CurrentDirectory)
        Case BFFM_SELCHANGED
            sBuffer = Space(MAX_PATH)
            ret = SHGetPathFromIDList(lp, sBuffer)
            If ret = 1 Then
                Call SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0, sBuffer)
            End If
    End Select
    BrowseCallbackProc = 0
End Function
 
' This function allows you to assign a function pointer to a vaiable.
Private Function GetAddressofFunction(add As Long) As Long
    GetAddressofFunction = add
End Function
Миниатюры
Глюк (?) с позиционированием SHBrowseForFolder  
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
05.06.2019, 10:51  [ТС]
Кстати, Анатолий, я бы воспользовался вашим вариантом (Выбор директорий как в GetOpenFileName) он мне больше нравится, но не понял как его центрировать на экране (вчера я вам в вашем блоге задал этот вопрос). Может здесь, на форуме в каком либо обсуждении вашего варианта тема центрирования поднималась и ответ уже прозвучал? Не подскажете где?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
05.06.2019, 11:13
Вообще размер должен храниться по адресу HKEY_CURRENT_USER\Software\Microsoft\Win dows\CurrentVersion\Explorer ключи Browse For Folder Width и Browse For Folder Height
А так можно засабклассить окно и перед показом задать размер. Пример.
На второй вопрос отвечу в блоге.
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
05.06.2019, 11:41  [ТС]
Эти ключи нашёл, но не понимаю как задать стартовые X и Y, ключей не нашёл, и в коде тоже не разобрался.
С сабклассингом по указанной ссылке вроде понятно...
Вообще-то я решил использовать ваш вариант (спасибо за ответ), но хотелось бы для общего образования знать и другие варианты.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.06.2019, 11:41
Помогаю со студенческими работами здесь

Окно открытия папки через SHBrowseForFolder
Запускаю диалог открытия папки через WinAPI функцию SHBrowseForFolder(udtBI) Параметр udtBI имеет тип BrowseInfo. Вопрос: как...

Shbrowseforfolder. пустой список компьютеров в сети
Добрый день. Суть проблемы: использую функцию shbrowseforfolder для выбора компьютера в сети. На некоторых компьютерах возникает...

Аналог SHBrowseForFolder для выбора целого каталога
Никто не подскажет, есть ли аналог SHBrowseForFolder для выбора целого каталога, а не отдельных файлов м VB.NET?

Интересный глюк. Или не глюк? Смена дефолтного пути
Вкратце объясняю: Есть приложение, которое подключается к БД Access. Путь к файлу БД в строке подключения прописываю просто как имя...

Глюк или не глюк в Siglent SDS 1192CML..?
Всем привет! У меня тоже имеется Siglent SDS 1192CML, пора создавать клуб любителей ентого девайса :) При замерах одного и того же...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru