Compactando caminhos longos no VB com a biblioteca SHLWAPI

Antes de iniciar este artigo, quero advertir que os recursos aqui apresentados exigirão que seus projetos usem uma API residente dentro do arquivo SHLWAPI.DLL e que este arquivo nunca deve ser distribuído com a sua aplicação para instalá-la em máquinas em que ele já exista. Isto porque a sobre-gravação deste arquivo na máquina de destino pode inviabilizar o funcionamento da versão de Internet Explorer lá instalada e, assim, de todo o Windows.

A função da API PathCompactPath na dll SHLWAPI fornece uma forma de compactar nomes longos de arquivos. Ela o faz substituindo uma parte do nome do arquivo por três pontinhos (...). Esta função usa a seguinte declaração de API:

Private Declare Function PathCompactPath Lib "shlwapi" Alias "PathCompactPathA" (ByVal hDC As Long, ByVal lpszPath As String, ByVal dx As Long) As Long

Como você pode ver, a função PathCompactPah requer três argumentos. O primeiro contém um handle de contexto de dispositivo. O segundo argumento contém o endereço do caminho que você quer compactar. O terceiro argumento contém a largura em pixels do lugar que você quer que o caminho caiba. Por exemplo, em um label. Assim, para colocar um nome de arquivo compactado em um label nomeado lblCaminho, coloque o seguinte código no procedimento de evento Click de um botão:


Private Sub Command1_Click()
    Dim lhDC As Long, lCtlWidth As Long
    Dim NomeLongo As String

    NomeLongo = "C:\MinhaPasta\VisualBasic\NomeDePastaMuitoLongo\" _
    & "NaoImportaQual\EuTenhoaAPI.doc"
    Me.ScaleMode = vbPixels
    lCtlWidth = lblCaminho.Width - Me.DrawWidth
    lhDC = Me.hDC
    PathCompactPath lhDC, NomeLongo, lCtlWidth
    lblCaminho.Caption = NomeLongo
End Sub

Modifique a largura do label e veja como o nome é compactado para sempre caber dentro do label.