Тема: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

Всем привет,
Матчасть хромает на голову.
Слямзил пример из темы "Выбор директории":
https://www.caduser.ru/forum/topic22881.html

Пост SmeL'а от (2006-05-15 11:19:20)
В этом примере выводится диалоговое окно выбора каталога.
Весь пример запихнул в отдельный модуль. Вызываю с кнопки на форме.
Но есь одна проблема. В процедуре ResizeDialog:

Private Sub ResizeDialog(ByVal hWnd As Long)
    ...
    screenWidth = Screen.Width / Screen.TwipsPerPixelX
    screenHeight = Screen.Height / Screen.TwipsPerPixelY
    ...
End Sub

Про этот Screen говорит что - "Variable not defined".
Без этой процедуры - работает. Но нужно с ней, потому что в этот диалог через параметр передаю длинненькую подпись, а размеры этого диалогового окна не изменяются, и часть подписи съедается.
Screen из какой библиотеки родом? Может она у меня не подключена.
Спасибо за внимание,

Re: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

Для начала традиционный посыл:
http://www.google.com/search?client=ope … p;oe=utf-8
Идем оттель по третьей ссылке:
http://www.pcreview.co.uk/forums/thread-1891544.php
Читаем, впечатляемся. Идем по данной участниками обсуждения ссылке на микрософтовский сайт
http://support.microsoft.com/default.as … n-us;94927
и получаем вкуснейший API-код:

Option Explicit
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, _
  ByVal hdc As Long) As Long
Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, _
  ByVal nIndex As Long) As Long
Const HWND_DESKTOP As Long = 0
Const LOGPIXELSX As Long = 88
Const LOGPIXELSY As Long = 90
'--------------------------------------------------
Function TwipsPerPixelX() As Single
'--------------------------------------------------
'Returns the width of a pixel, in twips.
'--------------------------------------------------
  Dim lngDC As Long
  lngDC = GetDC(HWND_DESKTOP)
  TwipsPerPixelX = 1440& / GetDeviceCaps(lngDC, LOGPIXELSX)
  ReleaseDC HWND_DESKTOP, lngDC
  MsgBox TwipsPerPixelX
End Function

(MsgBox добавил я.)

Re: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

p.s.
Как этот код умудряется работать у SmeL'я - не знаю. Screen - объект VB, а не VBA.
Ну, на то он и шмель, который, как известно, летать не может, но сам об этом не знает и поэтому летает.

Re: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

Спасибо,
С аглицким фиговато.
Я так понимаю что с Win-API надо отдельно разбираться. Книжку купить.
Пока понял что Screen'а в VBA нет, а его метод TwipsPerPixelX, заменяет приведенная функция TwipsPerPixelX().
Помогите двинуться дальше. Дайте прикурить так сказать) Как быть с Screen.Width ну и Height с ним же? Пока блуждаю по аналогичному пути поиска.
PS Чуствую себя полным дебилом. Надо бежать за книжкой.

Re: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

> Александр Бауск
Smell работал исключительно на VB6, насколько
мне известно...
~'J'~

Re: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

Попробовал получить ширину экрана в пикселях через:

Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, _
  ByVal nIndex As Long) As Long
Const HWND_DESKTOP As Long = 0
Const HORZRES As Long = 8
Const VERTRES As Long = 10

Вызываю так:

    ...
    Dim lngDC As Long
    Dim lWidth As Long
    Dim lHeight As Long
    lngDC = GetDC(HWND_DESKTOP)
    lWidth = GetDeviceCaps(lngDC, HORZRES)
    lHeight = GetDeviceCaps(lngDC, VERTRES)
    screenWidth = dWidth / TwipsPerPixelX
    screenHeight = dHeight / TwipsPerPixelY
    ...

Диалоговое окно выбора каталога, появляется в верхнем левом углу монитора, и причем частично уходит за его паределы, что даже ухватиться за него нельзя дабы передвинуть.
По идее оно должно открываться по центру экрана.
Просвятите плиз, если не внапряг.

Re: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

Здравствуйте :), не дает покоя открытие коталога? От скуки зашел на форум, не работаю уже давно с ACAD, а тут про меня пишут ;)
Vildar на правильном пути, Вы так были близки, что даже написали чуть больше чем нужно. Процетирую Вас с небольшой коррекцией

Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, _
  ByVal nIndex As Long) As Long
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Const HWND_DESKTOP As Long = 0
Const HORZRES As Long = 8
Const VERTRES As Long = 10
Вызываю так:
    ...
    Dim lngDC As Long
    Dim lWidth As Long
    Dim lHeight As Long
    lngDC = GetDC(HWND_DESKTOP)
    screenWidth = GetDeviceCaps(lngDC, HORZRES)
    screenHeight = GetDeviceCaps(lngDC, VERTRES)

Re: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

Понятно, сэнкс.
Диалоговое окно появляется по центру.
Но вопрос не решился:(, он тот же, из 1 поста, а подробнее:
В основную функцию, для открытия диалога выбора папки, fBrowseForFolder, вторым аргументам передается строка Promt'а. Так вот, она у меня получается на 3 строки, и в появляющемся окне выбора папки, третья строчка этого Promta не видна, она съедается TreeViev'ом. Вот.
А без этой строчки фиговато.
Ну я и парюсь из-за нее.
Попробовал поиграть с winWidth и winHeight в подфункции ResizeDialog. При этом размеры окна изменяются, но место под строки Promta не изменяется, а изменяется размер TreeViev'а.
Help me, Brothers! (сталкер)

Re: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

Вот Вам 2 варианта решения проблемы
1) Поиграться с переменными RatioX и RatioY это позволит вбить Вам более длинную строку.
Но если строка у Вас состоит из минимум двух переводов строк.
2) То тогда заберайте 3 строку диалога, там где выводится initDir выведите свою третью строку.
нужно изменить код.

            If g_CurrentDirectory <> "" Then
                'Call SendMessage(hwnd, BFFM_SETSELECTION, 1, ByVal g_CurrentDirectory)
                Call SendMessage(hwnd, BFFM_SETSELECTION, 1, ByVal "Tretiea stroka budet tut, no zato my zdesi ne uvidem initDir. Mojet dobavim ego c caption dialoga")
            End If

Есть еще конечно вариант через хэндлы детей диалового окна попробовать изменить их размеры, либо как в примере было указанно добавить свой контрол в окно и на нем написать все что угодно.

Re: Выбор директории, пример от SmeL. Сам ниасилил разобраться.

Да, один ентер уберу из строки, и ширину окна увеличу.
Спасибо, заглядывайте почаще.