tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Thomasio
  • 1 Beitrag von Thomasio
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
451
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Hallo,
    Ich sehe bei einigen Programmen (z.B. Skype) immer Buttons (?!) untereinander, die man scrollen kann. Ich hoffe ihr könnt verstehen, was ich meine. Leider habe ich keinen Anhaltspunkt gefunden, wie man so etwas macht. Ich hoffe ihr könnt mir helfen.
    Vielen Dank für alle Antworten!
    Geändert von üäpöol (18.09.11 um 09:29 Uhr) Grund: Wort vergessen :D
     

  2. #2
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Wie jetzt? Meinst du die Scrollleiste mit den beiden Buttons "nach oben" und "nach unten"? Benutze den Style WS_VSCROLL, für die horizontale Variante WS_HSCROLL.
    Siehst du übrigens hier: http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
    Und bitte, schreibe doch Sätze, nicht wie "die man scrollen".
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  3. #3
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    OK, ich beschreib das ganze mal etwas anders :
    Ich habe ein paar Buttons untereinander und merke, dass es so viele Buttons sind, dass sie nicht auf das Fenster passen. Jetzt möchte ich einen Bereich (Childwindow?!) festlegen, in dem die Buttons sein können; die Buttons darunter müssen "erscrollt" werden, also scrollt mal wie bei einem Editfenster runter, um den restlichen Text zu sehen, allerdings möchte ich das ganze mit Buttons machen.
    Ich hoffe es ist jetzt klarer.

    Schönes Wochende
     

  4. #4
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Du kannst bei CreateWindow() oder CreateWindowEx() festlegen, wo die Buttons sein sollen. Per Variable und 2 weiteren Buttons kannst du dann die Variable vergrössern/verkleinern. So kannst du die Buttons scrollen.
    Auch möglich mit MoveWindow(). Alternativ könntest du naturlich auch eine Dropbox mit den Befehlen und einen "go"-Button einfügen. Du könntest die Buttons kleiner machen, usw.

    Was willst du mit den Buttons tun? Vielleicht gibt es ja eine einfachere Lösung?

    Gruss
    cwriter
    Geändert von cwriter (16.09.11 um 18:09 Uhr)
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  5. #5
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    Du kannst jedem beliebigen Fenster dem MainWindow und auch allen Childs im CreateWindow() ein WS_VSCROLL mitgeben.
    Du kannst sogar ein völlig unabhängiges Child erstellen, was nur eine Scrollbar enthält und damit den Inhalt von jedem beliebigen anderen Fenster scrollen.
    Anders als bei edit controls, musst du dann aber in der WndProc das Scrollverhalten selber machen.
    Wie das geht, dazu findet Google 1000 Treffer inkl. Tutorials, Suchbegriffe SCROLLINFO oder GetScrollInfo() oder SetScrollInfo()
    üäpöol bedankt sich. 

  6. #6
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    OK. Ich bin mir nicht ganz sicher ob ich das richtig verstanden habe: Ich mache ein einfaches Childwindow mit Scrollbar mit eigener WndProc. Dann erstelle ich in diesem Childwindow einen Button. Ich probier das morgen mal aus. Danke schonmal.
     

  7. #7
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Hm... Funktioniert leider nicht. Ich fürchte ich hab das falsch verstanden. Über einer genauere Erklärung würde ich mich sehr freuen.
     

  8. #8
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    Wenn ich ins Blaue raten soll, dann hast du Folgendes falsch verstanden:
    "in der WndProc das Scrollverhalten selber machen"

    Das bedeutet du musst in der WndProc einiges anstellen

    1) case WM_CREATE:
    Grösse vom Fenster im Verhältnis zu Scrollweite berechnen und damit
    SetScrollInfo()
    aufrufen
    2) case WM_SIZE:
    Neuberechnung der Werte aus WM_CREATE und damit
    SetScrollInfo()
    aufrufen
    3) case WM_VSCROLL:
    Scrollposition abfragen mit GetScrollInfo()
    Werte an die neue Position anpassen und damit
    SetScrollInfo()
    aufrufen
    InvalidateRect() aufrufen zum neu zeichnen des Inhalts.
    4) case WM_PAINT:
    Das ganze Fenster in einen memDC zeichnen,
    Scrollposition abfragen mit GetScrollInfo()
    Anhand der Werte den sichtbaren Auschnitt berechnen und mit BitBlt() aus dem memDC übertragen.

    Ich kann dir ein Beispiel geben, vielleicht hilft das.
    Für xx musst du jeweils die passenden Werte eingeben.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    
    LRESULT CALLBACK ScrollWindow(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
     
    switch(msg)
    {
     
    case WM_CREATE:
    {
     
    RECT rect;
    GetClientRect(hWnd,&rect);
    SCROLLINFO si;
    si.cbSize = sizeof(si);
    si.nMin = 0;
    si.nMax = xx - 1; // Anzahl Buttons minus 1
    si.nPage = rect.bottom / xx; // ButtonHöhe inkl Abstand zum Nächsten
    si.fMask = SIF_PAGE|SIF_RANGE;
    SetScrollInfo(hWnd,SB_VERT,&si,1);
     
    return 0;
     
    }
    break;
     
    case WM_SIZE:
    {
     
    RECT rect;
    GetClientRect(hWnd,&rect);
    SCROLLINFO si;
    si.cbSize = sizeof(si);
    si.nMin = 0;
    si.nMax = xx - 1; // Anzahl Buttons minus 1
    si.nPage = rect.bottom / xx; // ButtonHöhe inkl Abstand zum Nächsten
    si.fMask = SIF_PAGE | SIF_RANGE;
    SetScrollInfo(hWnd, SB_VERT, &si, 1);
    InvalidateRect(hWnd,0,0);
     
    return 0;
     
    }
    break;
     
    case WM_VSCROLL:
    {
     
    SCROLLINFO si;
    si.cbSize = sizeof(si);
    si.fMask = SIF_ALL;
    GetScrollInfo(hWnd,SB_VERT,&si);
    si.fMask = SIF_POS;
    switch(LOWORD(wParam))
          {
              case SB_LINEUP:
              {
                  si.nPos -= 1;
              }
              break;
              case SB_LINEDOWN:
              {
                  si.nPos +=1;
              }
              break;
              case SB_PAGEUP:
              {
                  si.nPos -= si.nPage;
              }
              break;
              case SB_PAGEDOWN:
              {
                  si.nPos += si.nPage;
              }
              break;
              case SB_THUMBTRACK:
              {
                  si.nPos = si.nTrackPos;
              }
              break;
          }
     
    SetScrollInfo(hWnd, SB_VERT, &si, 1);
    InvalidateRect(hWnd,0,0);
     
    return 0;
     
    }
    break;
     
    case WM_PAINT:
    {
     
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd,&ps);
    HDC hdcMem = CreateCompatibleDC(hdc);
    HBITMAP BMP_current = CreateCompatibleBitmap(hdc,FensterBreite,Fensterhöhe); // volle Grösse mit allen Buttons
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem,BMP_current);
     
    // hier das GANZE Fenster zeichnen, mit BitBlt(hdcMem ...)
     
    SCROLLINFO si;
    si.cbSize = sizeof(si);
    si.fMask = SIF_ALL;
    GetScrollInfo(hWnd,SB_VERT,&si);
     
    BitBlt(hdc,0,0,rect.right,rect.bottom,hdcMem,0,si.nPos * xx,SRCCOPY); // ButtonHöhe inkl Abstand zum Nächsten
    SelectObject(hdcMem,hbmOld);
    DeleteDC(hdcMem);
    DeleteObject(BMP_current);
    EndPaint(hWnd,&ps);
     
    return 0;
     
    }
    break;

    Eleganter wäre statt das gesamte Fenster zu zeichnen schon vorher zu berechnen, was sichtbar ist, aber das musst du dann selber ausrechnen.
    Geändert von Thomasio (17.09.11 um 18:13 Uhr) Grund: Kleiner Fehler berichtigt
    üäpöol bedankt sich. 

Ähnliche Themen

  1. [c++/winApi]Socket - Buttons
    Von kickerxy123 im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 02.12.08, 00:00
  2. Antworten: 1
    Letzter Beitrag: 05.06.08, 13:35
  3. Antworten: 2
    Letzter Beitrag: 11.04.08, 22:29
  4. Buttons zum Scrollen und Verzögerung von AS
    Von Mahzuni im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 23.04.06, 12:19
  5. Suche Rat! - Scrollen mit eigenen Buttons
    Von Levine im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 05.03.06, 14:50

Stichworte