Artigo: 66370 - Última revisão: segunda-feira, 11 de Julho de 2005 - Revisão: 4.4

Caixa de listagem ListHorz/ListHscr EXEs barra de deslocamento horizontal controlo

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 | Reduzir tudo

Sumário

ListHorz.exe e ListHscr.exe demonstram como controlar totalmente o barra de deslocamento horizontal na caixa de listagem. Estas informações também estão disponíveis no Tips.hlp, incluído com o Microsoft Visual C/C ++. ListHorz.exe e ListHscr.exe contêm um conjunto de suporte de funções de barra de deslocamento horizontal que mantêm as extensões de todos os textos na caixa de listagem e alterar a extensão de caixa de lista de barra de deslocamento conforme necessário. Obter detalhes adicionais sobre estes exemplos são localizadas na secção códigos de exemplo deste artigo.

Mais Informação

Os ficheiros seguintes estão disponíveis para transferência a partir do Centro de transferências 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 transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591  (http://support.microsoft.com/kb/119591/EN-US/ ) Como obter ficheiros de suporte da Microsoft a partir de serviços on-line
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada que o ajudam a impedir alterações não autorizadas ao ficheiro.

ListHorz.exe contém uma aplicação de exemplo completa que demonstram uma caixa de listagem com uma barra de deslocamento horizontal. As funções de suporte necessários estão contidas num módulo C que pode ser compilado e ligado a qualquer aplicação baseada no Windows.

ListHscr.exe contém as fontes completas para uma DLL que contém as funções de suporte de caixa de lista necessário. Estas funções são exactamente iguais aos ListHorz.exe. Uma aplicação que utiliza os serviços da DLL para efectuar as mesmas funções que a aplicação em ListHorz.exe está incluída neste arquivo.

Segue-se um destaque de informações apresentadas neste artigo:

R. o Windows suporta para uma barra de deslocamento horizontal na caixa de listagem
  1. Descrição geral da Biblioteca de software exemplo de código
B. novas mensagens de caixa de lista: LB_SETHORIZONTALEXTENT e LB_GETHORIZONTALEXTENT
  1. Predefinição de extensões é zero.
  2. Mensagens apenas alterar valor interno--não afectam a visibilidade da barra de deslocamento.
C. tornar a barra de deslocamento visíveis quando adicionar ou inserir uma cadeia.
  1. Tem de alterar extensão antes de adicionar uma cadeia.
  2. Deve redesenhar a caixa de listagem depois de adicionar uma cadeia.
D. ocultar a barra de deslocamento quando eliminar uma cadeia
  1. Tem de alterar a extensão antes de eliminar uma cadeia.
  2. Deve redesenhar a caixa de listagem depois de eliminar uma cadeia.
  3. Envie mensagem WM_HSCROLL com parâmetro SB_TOP para deslocar a caixa de lista à esquerda no caso de é deslocado para a direita.
  4. É necessário processamento especial para LB_RESETCONTENT.
E. calcular extensões de pixels horizontais de cadeias:
  1. Utilize a função GetTextExtent.
  2. Considerações sobre o tipo de letra: Utilize WM_GETFONT mensagem.
  3. Utilize GetTextMetrics e adicione um tmAveCharWidth.
F. manutenção de todas as extensões na caixa de listagem.

Código de exemplo g.
  1. Suporta funções como um C ficheiro adicional--estático de ligar a aplicação.
  2. Suporta funções de uma DLL, várias caixas de lista suportadas.

Suporte do Windows para a barra de deslocamento horizontal na caixa de listagem

Microsoft Windows versão 3.0 é a primeira versão que reconheça o estilo de janela WS_HSCROLL para caixas de listagem. Este estilo adiciona uma barra de deslocamento horizontal à caixa de lista. No entanto, a barra de deslocamento não aparece automaticamente quando uma cadeia que é demasiado tempo a apresentar numa caixa de listagem é adicionada a essa caixa de listagem. Do mesmo modo, quando é removida da última cadeia maior do que a caixa de listagem, Windows não irá ocultar a barra de deslocamento. Este comportamento é diferente da barra de deslocamento vertical de uma caixa de listagem, que é adicionada e removida conforme necessário.

Uma aplicação tem de manter a largura em pixels, de cada cadeia na caixa de listagem. A mensagem de caixa de lista LB_SETHORIZONTALEXTENT controla o intervalo de deslocamento e a visibilidade de uma barra de deslocamento horizontal. Neste artigo, o termo "extensão" é definido para ter a largura de um objecto em pixels. Cada cadeia tem uma extensão, tal como a própria caixa de lista.

As outras secções deste artigo fornecem que informações mais detalhadas sobre considerações especiais que devem ocorrer quando lidar com barras de deslocamento horizontal em caixas de listagem.

Novas mensagens de caixa de lista:

LB_SETHORIZONTALEXTENT e LB_GETHORIZONTALEXTENT

Duas mensagens foram adicionadas ao Windows 3.0 para suportar as barras de deslocamento 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 predefinição, a extensão de barra de deslocamento horizontal de uma caixa de listagem é 0 (zero). Porque 0 é menor do que a largura da área de cliente da caixa de lista, Windows irá não adicionar uma barra de deslocamento a janela até que a extensão de barra de deslocamento é alterada para um valor maior do que a extensão de caixa de lista.

No entanto, a mensagem LB_SETHORIZONTALEXTENT não afecta a visibilidade de uma barra de deslocamento horizontal. Se uma barra de deslocamento estiver visível, enviar esta mensagem com uma extensão pequena especificada não removerá-lo. Do mesmo modo, se uma barra de deslocamento não estiver presente, enviar esta mensagem com uma extensão de grandes dimensões não criará um.

As duas secções deste artigo explicam como adicionar e remover uma barra de deslocamento horizontal medida que as cadeias são adicionadas ou eliminadas. O ponto principal é o Windows irá apenas mostrar ou ocultar a barra quando uma cadeia é adicionada, inserida ou eliminada de deslocamento.

Tornar a barra de deslocamento visíveis quando adicionar ou inserir uma cadeia

Quando uma cadeia com uma extensão superior à largura da caixa de listagem deve ser adicionado, uma aplicação tem envia o LB_SETHORIZONTALEXTENT mensagem antes de enviar um LB_ADDSTRING ou LB_INSERTSTRING mensagem.

Durante o processo de adicionar ou inserir uma cadeia, o Windows compara a extensão de barra de deslocamento horizontal armazenada na caixa de listagem para a largura da área de cliente da caixa de lista. Se a extensão de área de cliente for menor que a extensão de barra de deslocamento, a barra de deslocamento fica visível na próxima hora na lista caixa é desenhada.

A largura da área de cliente da caixa de listagem não inclui a largura da barra de deslocamento vertical, se estiver visível. Considere uma caixa de listagem sem uma barra de deslocamento vertical, que é preenchida com cadeias. Cada estas cadeias de caracteres é ligeiramente mais estreita do que a caixa de listagem. Quando outra cadeia é adicionada e a barra de deslocamento vertical é causada apareça, o Windows detectar que a extensão de barra de deslocamento horizontal é agora maior do que a largura da caixa de listagem e adiciona uma barra de deslocamento horizontal.

Se a extensão de barra de deslocamento for menor do que a largura da área de cliente da caixa de listagem, o estado da barra de deslocamento permanece inalterado.

Se a caixa de listagem não é desenhada depois da cadeia é adicionada, a barra de deslocamento não aparecerá. Por conseguinte, se a mensagem WM_SETREDRAW é utilizada para desactivar a actualização, adicionar uma cadeia não mostrará a barra de deslocamento horizontal até que a caixa de listagem é redesenhada.

Ocultar a barra de deslocamento quando eliminar uma cadeia

Windows apenas remove a barra de deslocamento horizontal durante o processamento de uma mensagem LB_DELETESTRING. Por este motivo, se a cadeia a ser eliminado for mais longa na caixa de listagem, a extensão de barra de deslocamento horizontal deve ser alterada para o próximo valor extensão mais pequeno antes dessa cadeia é eliminada. Depois da cadeia é eliminada, o Windows compara a extensão de barra de deslocamento armazenado para a largura da área de cliente da caixa de listagem e, se a extensão for mais pequena, a barra de deslocamento é removida.

Se a caixa de listagem não é desenhada depois da cadeia é eliminada, a barra de deslocamento não desaparecerá. Por este motivo, se a mensagem WM_SETREDRAW é utilizada para desactivar a actualização, eliminação de uma cadeia não removerá a barra de deslocamento horizontal até que a caixa de listagem é redesenhada.

No entanto, se a caixa de listagem é deslocada para a direita tão pouco quanto um pixel, a barra de deslocamento permanecerá visível, independentemente da extensão que está definida. Isto é efectuado para que o utilizador pode sempre deslocar-se para a esquerda extrema. Se a barra de deslocamento foi removida, a caixa de listagem poderá ficar num estado em que é deslocado para a direita por algum valor sem qualquer forma para se deslocar back completamente para a esquerda.

Para contornar este problema, desloque sempre a caixa de lista à esquerda extrema antes de eliminar a cadeia mais longa. Se uma cadeia mais curta for eliminada, a extensão permanecerá a mesma e a barra de deslocamento horizontais não será afectada na mesma. Deslocar-se apenas para a caixa de listagem se a cadeia mais longa for a ser eliminada.

A caixa de listagem pode ser o scrolled completamente para a esquerda (no caso em que uma cadeia longa ainda existe na caixa de listagem) ou apenas suficiente para que a seguinte cadeia mais longa estiver visível, partindo do princípio que a caixa de listagem requer uma barra de deslocamento. O código de exemplo a Software Library (descrito acima) sempre desloca-se a caixa de listagem completamente esquerda, utilizando mensagem WM_HSCROLL, da seguinte forma:
SendMessage(hList, WM_HSCROLL, SB_TOP, 0L);
				
LB_RESETCONTENT A mensagem não afecta o estado da barra de deslocamento horizontal, apesar de todas as cadeias na caixa de listagem são eliminadas. Antes de uma mensagem LB_RESETCONTENT enviada, uma aplicação deve executar os seguintes passos:
  1. Envie uma mensagem LB_SETHORIZONTALEXTENT com uma extensão de 0 (zero).
  2. Envie uma mensagem WM_HSCROLL para deslocar a caixa de listagem completamente para a esquerda. Este método é apresentado acima.
  3. Envie uma mensagem LB_DELETESTRING com um índice de 0 (zero). Isto irá eliminar a primeira cadeia, se existir e irá também remover a barra de deslocamento.
Se existirem quaisquer cadeias na caixa de listagem, a primeira é removida pela mensagem LB_DELETESTRING e a barra de deslocamento é removida, porque a extensão foi definida para zero. A mensagem LB_RESETCONTENT, em seguida, irá remover as restantes cadeias. Se existirem não cadeias na caixa de listagem, a mensagem LB_DELETESTRING devolverá um erro. No entanto, porque existem não cadeias na caixa de listagem, não deverá existir nenhuma barra de deslocamento primeiro.

Calcular extensões horizontal de cadeias

A discussão anterior sobre menciona extensões de cadeias, mas não fornece nenhum método para determinar estes valores.

Extensões de pixel das cadeias são calculadas pela função GetTextExtent. Esta é uma chamada GDI soma da largura de pixel de cada carácter numa cadeia utilizando o letra actualmente seleccionado para um contexto de apresentação representado por um hDC.

Se lpString contém uma cadeia representativa e hWndListBox é o identificador de janela à caixa de listagem, são necessários os seguintes passos para determinar o tamanho de cada cadeia:
  1. Declare as variáveis seguintes:
          DWORD       dwExtent;
          HDC         hDCListBox;
          HFONT       hFontOld, hFontNew;
          TEXTMETRICS tm;
    					
  2. Utilizar GetDC para obter o identificador para o contexto de apresentação da caixa de listagem e armazená-los em hDCListBox:
    hDCListBox = GetDC(hWndListBox);
    					
  3. Enviar uma mensagem WM_GETFONT obter a alça para o tipo de letra está a utilizar a caixa de listagem de caixa de listagem e guarde este identificador no hFontNew:
    hFontNew = SendMessage(hWndListBox, WM_GETFONT, NULL, NULL);
    					
  4. Utilize SeleccionarObjecto para seleccionar o tipo de letra para o contexto de apresentação. Manter o valor devolvido da chamada SeleccionarObjecto no hFontOld:
    hFontOld = SelectObject(hDCListBox, hFontNew);
    					
  5. Chamar GetTextMetrics para obter informações adicionais sobre o tipo de letra que está a ser utilizado:
    GetTextMetrics(hDC, (LPTEXTMETRIC)&tm);
    					
  6. Para cada cadeia, o valor da extensão para ser utilizado é calculado da seguinte forma:
    dwExtent = GetTextExtent(hDCListBox, lpString, strlen(lpString))
                 + tm.tmAveCharWidth;
    					
  7. Depois de todas as extensões foram calculadas, seleccione o tipo de letra antigo novamente para hDCListBox e, em seguida, liberte-:
    SelectObject(hDCListBox, hFontOld);
          ReleaseDC(hWndListBox, hDCListBox);
    					
Existe um motivo para o passo 5 e adicionar largura adicional a cadeia no passo 6 acima. Se for utilizado o maior valor devolvido pela GetTextExtent como parâmetro da mensagem LB_SETHORIZONTALEXTENT, a cadeia mais longa não mostrará completamente quando a caixa de listagem é deslocada completamente para a direita. Pixels uns são recortados pelo limite direito na caixa de listagem.

O campo tmAveCharWidth na estrutura de TEXTMETRIC fornece um número de pixels para adicionar o comprimento da cadeia, independentemente de qual o tipo de letra está actualmente em utilização consistente. Este espaço de memória intermédia impede que as cadeias sejam cortadas.

Como uma nota lateral, o valor de tmAveCharWidth é o número de pixels através do qual a caixa de listagem é deslocada na horizontal quando se clica nas setas da barra de deslocamento. Se for utilizado um tipo de letra distância fixa, a caixa de listagem é deslocada na horizontal por um carácter por cada clique.

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

Muitos métodos possíveis podem ser utilizados para manter uma lista das extensões de cadeias na caixa de listagem. Um dos métodos mais convenientes consiste em utilizar listas de propriedades, como mostrado no exemplo de código.

Cada janela tem uma lista propriedades associada. Cada propriedade é uma cadeia e um identificador de dados associada. Uma janela armazena e copia cada alça de dados utilizando a cadeia que identifica a alça.

Uma lista ordenada de extensões para cadeias na caixa de listagem pode ser guardada num objecto de memória global ou local. Isto permite que todas as janelas manter a sua própria lista e não requer que a aplicação mantém um mapeamento a partir da caixa de listagem para a alça de dados propriamente dito. A lista de extensões deve ser ordenada por ordem descendente, para que seja a primeira extensão na lista que a cadeia maior na caixa de listagem. Manter esta lista ordenada também permite à aplicação utilizar uma binária procura para localizar uma extensão na lista quando um estiver a ser inserido ou eliminado.

Quando é adicionada uma nova seqüência de caracteres, inserir de extensão essa cadeia da lista, manter a ordem ordenada. Se a nova extensão é colocada na parte superior da lista, envie uma mensagem LB_SETHORIZONTALEXTENT à caixa de lista de especificar a nova extensão. Não envie a mensagem para uma extensão que não seja o maior.

Quando uma cadeia é eliminada, remova de extensão essa cadeia a partir da lista. Se a extensão é a primeira na lista, essa cadeia será mais longa na caixa de listagem. Neste caso, envie uma LB_SETHORIZONTALEXTENT para a caixa de lista especificando a extensão de maior seguinte na lista. Se uma cadeia mais pequena for eliminada, não envie a mensagem.

Quando uma mensagem LB_RESETCONTENT é utilizada, limpar a lista completa de extensões. Enviar uma mensagem LB_SETHORIZONTALEXTENT especificando uma extensão de 0 (zero), seguido de um LB_DELETESTRING, conforme descrito na última parte da secção acima intitulado "Ocultar a barra de deslocamento quando eliminar uma cadeia."

Código de exemplo

Tal como foi mencionado acima, existem dois arquivos na biblioteca de software da Microsoft: LISTHORZ e LISTHSCR. Cada um destes exemplos fornece cinco funções de suporte que facilitam muito a manutenção das barras de deslocamento horizontal em caixas de listagem.

Em LISTHORZ, estas funções são encontradas em ficheiro LISTHELP.C. Este ficheiro pode ser compilado separadamente e ligado numa aplicação.

LISTHSCR contém os ficheiros de origem para uma DLL que fornece estas cinco funções de suporte. O ficheiro de C para a DLL é exactamente a mesma que LISTHORZ, excepto que o respectivo nome foi alterado. Este arquivo também inclui um programa LISTHORZ que utiliza os serviços da DLL para efectuar as mesmas funções que o programa no outro arquivo. O ficheiro LISTHAPI.H é o ficheiro de inclusão com protótipos das funções exportadas pela DLL. Uma biblioteca de importação, LISTHSCR.LIB, que é gerado pelo makefile está também incluída.

A DLL é útil porque pode suporta as barras de deslocamento horizontal em qualquer número de caixas de listagem em qualquer número de aplicações.

Este artigo documenta as funções de suporte:
BOOL FInitListboxExtents(HWND hList)
				
atribui memória local para armazenar uma lista de extensões de cadeia para a caixa de listagem identificado pelo hList. A alça para esta memória local é guardada na lista de propriedades da caixa de listagem. Esta função deve ser chamada depois da caixa de listagem é criada, como, por exemplo, durante o processamento WM_INITDIALOG.
Parâmetros: hList HWND identificador à caixa de listagem que irá utilizar uma barra de deslocamento horizontal. Valor de retorno: BOOL TRUE se existirem erros, FALSE se não foi possível atribuir memória. FFreeListboxExtents(HWND hList) BOOL
Liberta memória atribuída para a lista de extensão de caixa de listagem identificada pelo 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á a ser destruída.
Parâmetros: hList HWND identificador à caixa de lista que foi anteriormente utilizada com valor de retorno FInitListboxExtents: BOOL TRUE se existirem erros, FALSE se memória poderá não é libertada, caso em que a propriedade não é removida.
void ResetListboxExtents(HWND hList)
				
Remove todas as extensões anteriormente guardadas na lista de extensão. Isto é conseguido através da chamada FFreeListboxExtents e FInitListboxExtents consecutivas. A extensão horizontal da caixa de listagem estiver definida como 0 (zero) e qualquer barra de deslocamento horizontal é removida. Esta função deve ser chamada antes de uma mensagem LB_RESETCONTENT é enviada para a caixa de listagem.
Parâmetros: hList HWND identificador à caixa de lista que será reposta. Valor devolvido: nenhum
WORD WAddExtentEntry(HWND hList, LPSTR psz)
				
Adiciona uma entrada de extensão na lista de extensão da caixa de listagem. A extensão adicionada é que a cadeia apontada pelo psz utilizando o actual tipo de letra na caixa de lista. Se a extensão adicionada for superior a qualquer outro na lista de extensão, uma mensagem LB_SETHORIZONTALEXTENT é enviada para a caixa de lista com esta extensão de novo.

Esta função tem de ser chamada antes da cadeia é adicionada à caixa de listagem com LB_ADDSTRING ou LB_INSERTSTRING.
Parâmetros: hList HWND identificador para a caixa de listagem para o qual a cadeia deve ser adicionado. psz LPSTR ponteiro para a cadeia que deve ser adicionado. Esta função tem de ser chamada antes da cadeia é adicionada para que a barra de deslocamento horizontal será mantida correctamente. Valor de retorno: WORD um destes três valores: 0 se a cadeia adicionada não era a cadeia maior na caixa de listagem e a visibilidade da barra de deslocamento horizontais não foi alterado. A extensão da cadeia adicionada, se a cadeia adicionada era mais longa e pode ter alterado a visibilidade da barra de deslocamento. -1 para um erro.
WORD WRemoveExtentEntry(HWND hList, WORD iSel)
				
Remove a entrada de extensão da cadeia identificada pelo índice iSel na caixa de listagem. Se a cadeia a ser removido a maior na caixa de listagem, caixa de listagem é deslocada completamente para a esquerda e a extensão horizontal está definida como que a seguinte cadeia mais longa.

Esta função tem de ser chamada antes de uma mensagem LB_DELETESTRING é enviada para a caixa de listagem.
Parâmetros: hList HWND identificador à caixa de listagem a partir do qual uma cadeia deve ser removido. iSel WORD o índice da cadeia a ser removido. Valor de retorno: WORD um destes três valores: 0, se remover a cadeia não era mais longa na caixa de listagem e a visibilidade da barra de deslocamento horizontais não alterou a extensão da cadeia eliminada, se a cadeia eliminada era mais longa e pode ter alterado a visibilidade da barra de deslocamento. -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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )