2010-05-02 12 views
4

Quelqu'un pourrait-il me diriger vers (ou fournir?) Quelques exemples clairs et gentils de la façon d'implémenter le défilement dans Win32? Google apporte beaucoup de choses, évidemment, mais la plupart des exemples me semblent trop simples ou trop compliqués pour être sûr qu'ils démontrent la bonne façon de faire les choses. J'utilise LispWorks CAPI (librairie Lisp Common Lisp GUI lib) dans mon projet actuel, et sur Windows j'ai un bug difficile à résoudre en ce qui concerne le défilement; Fondamentalement, je veux faire quelques tests directement via l'API Win32 pour voir si je peux faire la lumière sur la situation.Exemples de défilement Win32

Un grand merci, Christopher

+0

Ce que vous voulez dire n'est pas clair. Vous dites à une fenêtre de défiler en lui envoyant un message 'WM_SCROLLWINDOW', puis c'est à la fenêtre de répondre correctement. Si vous constatez un problème, la fenêtre ne reçoit pas les bons messages ou ne transmet pas le message correctement. Alors: que voyez-vous? – egrunin

+0

Comme le souligne egrunin, vous devez être plus précis. Qu'est-ce que tu veux faire défiler et comment? Est-ce du texte? Voulez-vous contrôler une boîte de défilement? Est-ce défilement bitmap à l'ancienne? Quel genre d'application est-ce? Jeu? –

+2

Tout cela est couvert dans le livre de Petzold, comme beaucoup de questions Win32 ici. –

Répondre

1

Je pense que vous parlez d'un exemple comment gérer l'événement WM_VSCROLL/WM_HSCROLL. Si oui, la première étape consiste à gérer cet événement. Vous ne devez pas utiliser la valeur HIWORD (wParam) de cet appel mais utiliser plutôt les fonctions GetScrollInfo, GetScrollPos et GetScrollRange. Voici un exemple de code extrait par MSDN - Using Scroll Bars. xCurrentScroll est déterminé auparavant en appelant GetScrollPos() par exemple.

int xDelta;  // xDelta = new_pos - current_pos 
int xNewPos; // new position 
int yDelta = 0; 

switch (LOWORD(wParam)) { 
    // User clicked the scroll bar shaft left of the scroll box. 
    case SB_PAGEUP: 
     xNewPos = xCurrentScroll - 50; 
     break; 

    // User clicked the scroll bar shaft right of the scroll box. 
    case SB_PAGEDOWN: 
     xNewPos = xCurrentScroll + 50; 
     break; 

    // User clicked the left arrow. 
    case SB_LINEUP: 
     xNewPos = xCurrentScroll - 5; 
     break; 

    // User clicked the right arrow. 
    case SB_LINEDOWN: 
     xNewPos = xCurrentScroll + 5; 
     break; 

    // User dragged the scroll box. 
    case SB_THUMBPOSITION: 
     xNewPos = HIWORD(wParam); 
     break; 

    default: 
     xNewPos = xCurrentScroll; 
} 

[...] 

// New position must be between 0 and the screen width. 
xNewPos = max(0, xNewPos); 
xNewPos = min(xMaxScroll, xNewPos); 

[...] 

// Reset the scroll bar. 
si.cbSize = sizeof(si); 
si.fMask = SIF_POS; 
si.nPos = xCurrentScroll; 
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);