ID do artigo: 66370 - Última revisão: segunda-feira, 11 de julho de 2005 - Revisão: 4.4

ListHorz/ListHscr EXEs barra de rolagem horizontal controle caixa de listagem

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

ListHorz.exe e ListHscr.exe demonstram como controlar totalmente a barra de rolagem horizontal em uma caixa de listagem. Essa informação também está disponível em Tips.hlp, que está incluído com o Microsoft Visual C/C ++. ListHorz.exe e ListHscr.exe contêm um conjunto de funções de suporte de barra de rolagem horizontal que mantêm as extensões de todas as seqüências de caracteres na caixa de listagem e alterar a extensão de caixa de lista rolável conforme necessário. Detalhes adicionais sobre esses exemplos são encontradas na seção código de exemplo deste artigo.

Mais Informações

Os seguintes arquivos estão disponíveis para download no Centro de download da Microsoft:
ListHorz.exe (http://download.microsoft.com/download/platformsdk/sample/1.1/w31/en-us/listhorz.exe)
ListHscr.exe (http://download.microsoft.com/download/win31/samp34/1/w31/en-us/listhscr.exe)
Para obter informações adicionais sobre como baixar arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591  (http://support.microsoft.com/kb/119591/EN-US/ ) Como obter arquivos de suporte da Microsoft a partir de serviços online
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

ListHorz.exe contém um aplicativo de exemplo completo demonstrando uma caixa de listagem com uma barra de rolagem horizontal. As funções de suporte necessários estão contidas em um módulo C que pode ser compilado e vinculado a qualquer aplicativo baseado no Windows.

ListHscr.exe contém as fontes concluídas para uma DLL que contém as funções de suporte de caixa de lista necessário. Essas funções são exatamente os mesmos ListHorz.exe. Incluído neste arquivo é um aplicativo que usa os serviços da DLL para executar as mesmas funções que o aplicativo em ListHorz.exe.

A seguir está uma estrutura de tópicos das informações apresentadas neste artigo:

Suporte Windows r. para uma barra de rolagem horizontal em uma caixa de listagem
  1. Visão geral sobre Código de exemplo da biblioteca de software
B. novas mensagens de caixa de lista: LB_SETHORIZONTALEXTENT e LB_GETHORIZONTALEXTENT
  1. Configuração padrão para extensões é zero.
  2. As mensagens só alterar valor interno--não afetam a visibilidade da barra de rolagem.
C. tornar a barra de rolagem visível ao adicionar ou inserir uma seqüência de caracteres.
  1. Deve alterar a extensão antes de adicionar uma seqüência de caracteres.
  2. Deve redesenhar a caixa de listagem depois de adicionar uma seqüência de caracteres.
D. ocultando a barra de rolagem ao excluir uma seqüência de caracteres
  1. Altere a extensão antes de excluir uma seqüência de caracteres.
  2. Deve redesenhar a caixa de listagem após excluir uma seqüência de caracteres.
  3. Envie mensagem WM_HSCROLL com parâmetro SB_TOP para rolar a caixa de listagem à esquerda no caso será rolada para a direita.
  4. Tratamento especial é necessária para LB_RESETCONTENT.
E. calculando extensões de pixel horizontal de seqüências de caracteres:
  1. Use a função GetTextExtent.
  2. Considerações sobre a fonte: usar WM_GETFONT mensagem.
  3. Use GetTextMetrics e adicione um tmAveCharWidth.
F. manutenção de todas as extensões na caixa de listagem.

Código de exemplo g.
  1. Oferece suporte a funções como um arquivo C adicional--estático vinculando ao aplicativo.
  2. Dar suporte a funções em uma DLL, várias caixas de listagem com suporte.

Suporte do Windows para barra de rolagem horizontal em uma caixa de listagem

Microsoft Windows versão 3.0 é a primeira versão que reconhece o estilo da janela WS_HSCROLL para caixas de listagem. Esse estilo adiciona uma barra de rolagem horizontal à caixa de lista. No entanto, a barra de rolagem não aparece automaticamente quando uma seqüência que é muito longo para exibir em uma caixa de listagem é adicionada à caixa de lista. Da mesma forma, quando a última seqüência de caracteres maior do que a caixa de listagem é removida, Windows não ocultar a barra de rolagem. Esse comportamento é diferente da barra de rolagem vertical de uma caixa de listagem, que é adicionada e removida conforme necessário.

Um aplicativo deve manter a largura, em pixels, de cada seqüência de caracteres na caixa de listagem. A mensagem de caixa de lista LB_SETHORIZONTALEXTENT controla o intervalo de rolagem e a visibilidade de uma barra de rolagem horizontal. Neste artigo, o termo "extensão" é definido para ser a largura de um objeto em pixels de tela. Cada seqüência de caracteres tem uma extensão como faz a caixa de listagem.

As outras seções deste artigo fornecem que informações mais detalhadas sobre considerações especiais que devem ocorrer ao lidar com barras de rolagem horizontal nas caixas de lista.

Novas mensagens de caixa de lista:

LB_SETHORIZONTALEXTENT e LB_GETHORIZONTALEXTENT

Duas mensagens foram adicionadas ao Windows 3.0 para oferecer suporte a barras de rolagem horizontal em caixas de listagem:
   Message                 Description
   -------------------------------------------------------------------

   LB_SETHORIZONTALEXTENT  Sets the width in pixels by which a list
                           box can be scrolled to the value of wParam
                           in the message.

   LB_GETHORIZONTALEXTENT  Retrieves the width in pixels by which a
                           list box can be scrolled.
				
por padrão, a extensão de barra de rolagem horizontal de uma caixa de listagem é 0 (zero). Porque 0 é menor do que a largura na área cliente da caixa de lista, Windows não adicionará uma barra de rolagem para a janela até que a extensão de barra de rolagem é alterada para um valor maior do que a extensão de caixa de lista.

No entanto, a mensagem LB_SETHORIZONTALEXTENT não afeta a visibilidade de uma barra de rolagem horizontal. Se uma barra de rolagem estiver visível, enviar esta mensagem com uma pequena extensão especificada não removerá. Da mesma forma, se uma barra de rolagem não estiver presente, enviar esta mensagem com uma grande extensão não criará um.

As próximas duas seções deste artigo explicam como adicionar e remover uma barra de rolagem horizontal como seqüências de caracteres são adicionadas e excluídas. O ponto principal é que Windows somente será Mostrar ou ocultar a barra quando uma seqüência de caracteres é adicionada, inserida ou excluída de rolagem.

Tornando a barra de rolagem visíveis ao adicionar ou inserir uma String

Quando é uma seqüência de caracteres com uma extensão maior largura de caixa de listagem a ser adicionado, um aplicativo deve enviar a mensagem LB_SETHORIZONTALEXTENT antes de enviar um LB_ADDSTRING ou LB_INSERTSTRING mensagem.

Durante o processo de adicionar ou inserir uma seqüência de caracteres, o Windows compara a extensão de barra de rolagem horizontal armazenada na caixa de listagem para a largura de na área cliente da caixa de lista. Se a extensão de área do cliente for menor que a extensão de barra de rolagem, a barra de rolagem é tornada visível na próxima vez na lista caixa é desenhada.

Largura de caixa de listagem área cliente não inclui a largura da barra de rolagem vertical, se ele estiver visível. Considere uma caixa de listagem sem uma barra de rolagem vertical, que é preenchida com seqüências de caracteres. Cada uma destas seqüências de caracteres é um pouco mais estreita do que a caixa de listagem. Quando outra seqüência de caracteres é adicionada, e a barra de rolagem vertical é causada apareça, Windows descobre que a extensão de barra de rolagem horizontal é agora maior do que a largura da caixa de listagem e adiciona uma barra de rolagem horizontal.

Se a extensão de barra de rolagem é menor que a largura da área cliente da caixa de listagem, o status da barra de rolagem permanece inalterado.

Se a caixa de listagem não é desenhada depois que a seqüência de caracteres é adicionada, a barra de rolagem não aparecerá. Portanto, se a mensagem WM_SETREDRAW é usada para desativar o redesenho de tela, adicionar uma seqüência de caracteres não mostrará a barra de rolagem horizontal até que a caixa de listagem é redesenhada.

Ocultar a barra de rolagem ao excluir um String

Windows remove apenas a barra de rolagem horizontal durante o processamento de uma mensagem LB_DELETESTRING. Portanto, se a seqüência a ser excluído for mais longa na caixa de listagem, a extensão de barra de rolagem horizontal deve ser alterada para o próximo menor valor de extensão antes que essa seqüência é excluída. Depois que a seqüência de caracteres for excluída, o Windows compara a extensão de barra de rolagem armazenado para a largura da área cliente da caixa de listagem e, se a extensão for menor, a barra de rolagem é removida.

Se a caixa de listagem não é desenhada depois a seqüência de caracteres é excluída, a barra de rolagem não desaparecerá. Portanto, se a mensagem WM_SETREDRAW é usada para desativar o redesenho de tela, excluir uma seqüência de caracteres não removerá a barra de rolagem horizontal até que a caixa de listagem é redesenhada.

No entanto, se a caixa de lista é rolada para a direita pouco quanto um pixel, a barra de rolagem permanecerá visível, independentemente da extensão que está definida. Isso é feito para que o usuário sempre possa rolar para a extrema esquerda. Se a barra de rolagem foi removida, a caixa de listagem pode ficar em um estado onde ele é rolado para a direita por algum valor sem qualquer maneira para rolar para trás completamente para a esquerda.

Para contornar este problema, sempre Role caixa de listagem para a esquerda antes de excluir a seqüência mais longa. Se uma seqüência de caracteres mais curta for excluída, a extensão permanecerá a mesma e a barra de rolagem horizontal mesmo assim não será afetada. Role a caixa de listagem somente se a seqüência mais longa está sendo excluída.

A caixa de listagem pode ser scrolled ou completamente para a esquerda (no caso em que uma seqüência longa ainda existe na caixa de listagem) ou apenas suficiente para que a próxima seqüência de caracteres mais longa estiver visível, supondo que a caixa de listagem requer uma barra de rolagem. O código de exemplo na biblioteca de software (descrito acima) sempre rola a caixa de listagem completamente à esquerda, usando a mensagem WM_HSCROLL, da seguinte maneira:
SendMessage(hList, WM_HSCROLL, SB_TOP, 0L);
				
LB_RESETCONTENT A mensagem não afeta o estado da barra de rolagem horizontal, mesmo que todas as seqüências na caixa de listagem são excluídas. Antes que uma mensagem LB_RESETCONTENT seja enviada, um aplicativo deve executar as seguintes etapas:
  1. Envie uma mensagem LB_SETHORIZONTALEXTENT com uma extensão de 0 (zero).
  2. Envie uma mensagem WM_HSCROLL para rolar a caixa de listagem completamente para a esquerda. Esse método é fornecido acima.
  3. Envie uma mensagem LB_DELETESTRING com um índice de 0 (zero). Isso irá excluir a primeira seqüência de caracteres, se houver e será também remover a barra de rolagem.
Se houver qualquer cadeia de caracteres na caixa de listagem, a primeira é removida pela mensagem LB_DELETESTRING e a barra de rolagem é removida, porque a extensão foi definida para zero. A mensagem LB_RESETCONTENT, em seguida, removerá as seqüências restantes. Se não houver nenhum seqüências de caracteres na caixa de listagem, a mensagem LB_DELETESTRING retornará um erro. No entanto, como não há nenhum seqüências de caracteres na caixa de listagem, não deve haver nenhuma barra de rolagem em primeiro lugar.

Calcular extensões horizontais de seqüências de caracteres

A discussão anterior sobre menciona as extensões de seqüências de caracteres, mas fornece não métodos para determinar esses valores.

Extensões de pixel de seqüências de caracteres são calculadas pela função GetTextExtent. Isso é uma chamada GDI que soma os pixels de largura de cada caractere em uma seqüência usando a fonte selecionada no momento em um contexto de exibição representado por um hDC.

Se lpString contém uma seqüência de representante e hWndListBox é o identificador de janela para a caixa de listagem, as seguintes etapas são necessárias para determinar o tamanho de cada seqüência de caracteres:
  1. Declare as variáveis a seguir:
          DWORD       dwExtent;
          HDC         hDCListBox;
          HFONT       hFontOld, hFontNew;
          TEXTMETRICS tm;
    					
  2. Usar GetDC para recuperar o identificador para o contexto de exibição para a caixa de listagem e armazená-lo em hDCListBox:
    hDCListBox = GetDC(hWndListBox);
    					
  3. Enviar uma mensagem WM_GETFONT recuperar o identificador para a fonte que está usando a caixa de listagem de caixa de listagem e armazene essa alça em hFontNew:
    hFontNew = SendMessage(hWndListBox, WM_GETFONT, NULL, NULL);
    					
  4. Use SelecionarObjeto para selecionar a fonte no contexto de exibição. Manter o valor de retorno da chamada SelecionarObjeto no hFontOld:
    hFontOld = SelectObject(hDCListBox, hFontNew);
    					
  5. Chamar GetTextMetrics para obter informações adicionais sobre a fonte que está sendo usada:
    GetTextMetrics(hDC, (LPTEXTMETRIC)&tm);
    					
  6. Para cada seqüência de caracteres, o valor da extensão a ser usado é calculado da seguinte maneira:
    dwExtent = GetTextExtent(hDCListBox, lpString, strlen(lpString))
                 + tm.tmAveCharWidth;
    					
  7. Depois que todas as extensões foram calculadas, selecione a fonte antiga volta hDCListBox e liberá-lo:
    SelectObject(hDCListBox, hFontOld);
          ReleaseDC(hWndListBox, hDCListBox);
    					
Há um motivo para a etapa 5 e adicionando a largura adicional a seqüência de caracteres da etapa 6 acima. Se o maior valor retornado por GetTextExtent é usado como o parâmetro na mensagem LB_SETHORIZONTALEXTENT, a seqüência mais longa não mostrará completamente quando a caixa de lista é rolada completamente para a direita. Alguns pixels são cortados pela borda direita na caixa de listagem.

O campo tmAveCharWidth na estrutura TEXTMETRIC fornece vários consistente de pixels para adicionar o comprimento da seqüência de caracteres, não importa qual fonte está em uso no momento. Este espaço de buffer impede que as seqüências de caracteres que está sendo cortado.

Como uma observação lado, o valor de tmAveCharWidth é o número de pixels pelo qual a caixa de lista é rolada horizontalmente quando as setas da barra de rolagem são clicadas. Se uma fonte de pitch fixo for usada, a caixa de listagem é rolada horizontalmente por um caractere para cada clique.

Manutenção de todas as extensões na caixa de listagem

Muitos métodos possíveis podem ser usados para manter uma lista de extensões das seqüências na caixa de listagem. Um dos métodos mais convenientes é que usar listas de propriedades, como mostrado no código de exemplo.

Cada janela possui uma lista propriedade associada a ele. Cada propriedade é uma seqüência de caracteres e um identificador de dados associada. Uma janela armazena e recupera cada alça de dados usando a seqüência que rotula a alça.

Uma lista classificada de extensões para seqüências de caracteres na caixa de listagem pode ser salvas em um objeto de memória local ou global. Isso permite que cada janela manter sua própria lista e não requer que o aplicativo manter um mapeamento na caixa de listagem para a alça de dados propriamente dita. A lista de extensões deve ser classificada em ordem decrescente, para que seja a primeira extensão na lista que a seqüência mais longa na caixa de listagem. Também permite manter essa lista classificada que o aplicativo usar uma pesquisa binária para localizar uma extensão na lista quando um está sendo inserido ou excluído.

Quando uma nova seqüência é adicionada, insira a extensão da cadeia de caracteres na lista, manter a ordem de classificação. Se a nova extensão for colocada na parte superior da lista, envie uma mensagem LB_SETHORIZONTALEXTENT à caixa de listagem especificando a nova extensão. Não envie a mensagem para uma extensão não é o maior.

Quando uma seqüência de caracteres é excluída, remova a extensão da cadeia de caracteres da lista. Se a extensão for o primeiro na lista, então, essa seqüência é a mais longa na caixa de listagem. Nesse caso, envie um LB_SETHORIZONTALEXTENT para a caixa de lista especificando a próxima extensão maior na lista. Se uma seqüência menor for excluída, não envie a mensagem.

Quando uma mensagem LB_RESETCONTENT é usada, desmarque a lista inteira de extensões. Enviar uma mensagem LB_SETHORIZONTALEXTENT especificando uma extensão de 0 (zero), seguida por um LB_DELETESTRING conforme descrito na última parte da seção acima intitulado "Ocultar a barra de rolagem ao excluir um String."

Código de exemplo

Como mencionado acima, existem dois arquivos na biblioteca de software da Microsoft: LISTHORZ e LISTHSCR. Cada um desses exemplos fornece cinco funções de suporte que facilitam muito a manutenção das barras de rolagem horizontal nas caixas de lista.

Em LISTHORZ, essas funções são encontradas no arquivo LISTHELP.C. Este arquivo pode ser compilado separadamente e vinculado a um aplicativo.

LISTHSCR contém os arquivos de origem para uma DLL que fornece essas cinco funções de suporte. O arquivo C para a DLL é exatamente o mesmo do LISTHORZ, exceto que seu nome foi alterado. Este arquivo também inclui um programa LISTHORZ que usa os serviços da DLL para executar as mesmas funções que o programa em outro arquivo. O arquivo LISTHAPI.H é o arquivo de inclusão contendo protótipos de funções exportadas pela DLL. Também há uma biblioteca de importação, LISTHSCR.LIB, gerado pelo makefile.

A DLL é mais útil porque ele pode oferece suporte a barras de rolagem horizontal em qualquer número de caixas de listagem em qualquer número de aplicativos.

O restante deste artigo documenta as funções de suporte:
BOOL FInitListboxExtents(HWND hList)
				
aloca memória local para armazenar uma lista de extensões de seqüência de caracteres para a caixa de listagem identificado por hList. A alça para essa memória local é salvo na lista de propriedades da caixa de listagem. Esta função deve ser chamada depois que a caixa de listagem é criado, como como durante o processamento de WM_INITDIALOG.
Parâmetros: hList HWND identificador à caixa de listagem que irá usar uma barra de rolagem horizontal. Valor de retorno: BOOL VERDADEIRO se houver erros, FALSO se não foi possível alocar memória. BOOL FFreeListboxExtents(HWND hList)
Libera a memória alocada para a lista de extensão de caixa de listagem identificada por hList. A propriedade que armazena o identificador de memória definido pelo FInitListboxExtents é removida. Esta função deve ser chamada quando a caixa de listagem está sendo destruída.
Parâmetros: hList HWND identificador à caixa de lista que foi usada anteriormente com valor de retorno FInitListboxExtents: BOOL VERDADEIRO se houver erros, FALSO se a memória não pôde ser liberada, caso em que a propriedade não é removida.
void ResetListboxExtents(HWND hList)
				
Remove todas as extensões salvas anteriormente na lista extensão. Isso é feito chamando FFreeListboxExtents e FInitListboxExtents em sucessão. A extensão horizontal da caixa de listagem é definida como 0 (zero) e qualquer barra de rolagem horizontal é removida. Esta função deve ser chamada antes que uma mensagem LB_RESETCONTENT é enviada à caixa de listagem.
Parâmetros: hList HWND identificador à caixa de listagem será redefinida. Valor de retorno: nenhum
WORD WAddExtentEntry(HWND hList, LPSTR psz)
				
Adiciona uma entrada de extensão à lista de extensão da caixa de listagem. A extensão adicionada é que da seqüência apontada pelo psz usando a fonte atual na caixa de lista. Se a extensão adicionada for maior do que qualquer outro na lista de extensão, uma mensagem LB_SETHORIZONTALEXTENT é enviada à caixa de lista com essa extensão de novo.

Esta função deve ser chamada antes da seqüência de caracteres a é adicionada à caixa de listagem com LB_ADDSTRING ou LB_INSERTSTRING.
Parâmetros: hList HWND identificador à caixa de listagem para a qual a seqüência de caracteres deve ser adicionado. psz ponteiro LPSTR a seqüência de caracteres que é a ser adicionado. Esta função deve ser chamada antes que a seqüência de caracteres é adicionada para que a barra de rolagem horizontal será mantida adequadamente. Valor de retorno: WORD um desses três valores: 0 se a seqüência de caracteres adicionada não era a seqüência mais longa na caixa de listagem e a visibilidade da barra de rolagem horizontal não foi alterado. A extensão da seqüência adicionada, se a seqüência adicionada foi a mais longa e pode ter alterado a visibilidade da barra de rolagem. -1 para um erro.
WORD WRemoveExtentEntry(HWND hList, WORD iSel)
				
Remove a entrada de extensão de seqüência de caracteres identificada por índice iSel na caixa de listagem. Se a seqüência a ser removido for mais longa na caixa de listagem, caixa de listagem é rolada completamente para a esquerda e a extensão horizontal é definida como que da próxima seqüência de caracteres mais longa.

Esta função deve ser chamada antes que uma mensagem LB_DELETESTRING é enviada à caixa de listagem.
Parâmetros: hList HWND identificador à caixa de listagem partir da qual uma seqüência de caracteres é a ser removido. iSel WORD índice da seqüência de caracteres a ser removido. Valor de retorno: WORD um desses três valores: 0 se a seqüência de caracteres removido não era mais longa na caixa de listagem e a visibilidade da barra de rolagem horizontal não alterou a extensão de seqüência de caracteres excluída, se a seqüência de excluído era mais longa e pode ter alterado a visibilidade da barra de rolagem. -1 para um erro.

A informação contida neste artigo aplica-se a:
  • Microsoft Platform Software Development Kit-January 2000 Edition
Palavras-chave: 
kbmt kbdownload kb16bitonly kbctrl kbfile kblistbox kbsample kbscrollbar KB66370 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 66370  (http://support.microsoft.com/kb/66370/en-us/ )