Die Funktion SB_THUMBTRACK und SB_THUMBPOSITION funktioniern nicht



  • Hallo,
    Ich habe Ein Programm aus einem Buch abgeschrieben.
    Dort ist ein Programm das PS in KW umrechnet und umgekehrt.
    Das Programm startet gleich in einem Menüfeld.
    In dem Menü ist eine Bildlaufleiste für die Nachkommastellen.
    An sich funktioniert sie, nur wenn man auf das Mittelteil der Bildlaufleiste klickt und versucht die Bildlaufleiste zu bewegen passiert gar nichts.
    Deshalb habe ich SB_THUMBTRACK und SB_THUMBPOSITION eingebaut. Wenn man jetzt das Mittelteil der Bildlaufleiste klickt, rutscht das Mittelteil gleich nach links
    Hier der Code:

    /* Umrechnung PS <--> kW, Programm hpkwin01.c
    ========================================== */
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char WorkString [80] ;
    HANDLE hActInstance ;
    LONG FAR PASCAL WndProc (HWND , UINT , UINT , LONG) ;
    BOOL FAR PASCAL DialogProc (HWND , UINT , UINT , LONG) ;
    void AktualisiereStatus (HWND , int , int) ;
    int PASCAL WinMain (HANDLE hInstance , HANDLE hPrevInstance ,
    LPSTR lpszCmdParam , int nCmdShow)
    {
    MSG msg ;
    HWND hwnd ;
    WNDCLASS wndclass ;
    hActInstance = hInstance ;
    if (!hPrevInstance)
    {
    wndclass.style = NULL ; /* ... ist ein bemerkenswerter
    Sonderfall, das "Fenster ohne Stil", deshalb wird von ihm
    nichts zu sehen sein. Weil es aber kreiert wird, kann es
    auch "Child Windows" haben, in diesem Programm wird es eine
    Dialog-Box sein. */
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL , IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (NULL , IDC_ARROW) ;
    wndclass.hbrBackground = GetStockObject (GRAY_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = "WndClassName" ;
    RegisterClass (&wndclass) ;
    }
    hwnd = CreateWindow ("WndClassName" , NULL ,
    WS_OVERLAPPEDWINDOW , CW_USEDEFAULT ,
    CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT ,
    NULL , NULL , hInstance , NULL) ;
    /* ShowWindow und UpdateWindow sind an dieser Stelle nicht erforderlich,
    weil das "Fenster ohne Stil" nicht gezeigt werden muss. Es kaeme hier
    ohnehin zu spaet, weil die gesamte Arbeit des Programms bereits mit
    der von CreateWindow ausgeloesten Botschaft WM_CREATE erledigt wird. */
    while (GetMessage (&msg , NULL , 0 , 0))
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }
    return msg.wParam ;
    }
    /* Die Fenster-Funktion des Hauptfenster hat natuerlich nicht viel zu
    tun. Da das Hauptfenster ohnehin nicht zu sehen ist, wird fast alles mit
    der Botschaft WM_CREATE erledigt: Die Dialog-Box wird erzeugt, und nach
    der Beendigung des Dialogs wird sofort die Message WM_CLOSE generiert,
    und alles ist vorbei: */
    LONG FAR PASCAL WndProc (HWND hwnd , UINT message ,
    UINT wParam , LONG lParam)
    {
    switch (message)
    {
    case WM_CREATE:
    DialogBox (hActInstance , "HptokwinDialog" , hwnd ,
    MakeProcInstance (DialogProc , hActInstance)) ;
    SendMessage (hwnd , WM_CLOSE , 0 , 0L) ;
    return 0 ;
    case WM_DESTROY:
    PostQuitMessage (0) ;
    return 0 ;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    #define FAKTOR 0.7355
    BOOL FAR PASCAL DialogProc (HWND hwnd , UINT message ,
    UINT wParam , LONG lParam)
    {
    static int UmrechnVariante = 110 ; /* ... wird mit "PS ---> kW" */
    static int Nachkommastellen = 2 ;
    static int MinNachkomma = 0 ;
    static int MaxNachkomma = 4 ;
    double Leistung , a ;
    char *end_p ;
    switch (message)
    {
    case WM_INITDIALOG: /* Nachricht wird zum Initialisieren genutzt: */
    CheckRadioButton (hwnd , 110 , 111 , UmrechnVariante) ;
    /* ... schaltet alle Optionsflaechen von Nummer
    110 ... 111 aus und die in UmrechnVariante
    definierte Optionsflaeche ein */
    SetScrollRange (GetDlgItem (hwnd , 120) , SB_CTL ,
    MinNachkomma , MaxNachkomma , FALSE) ;
    AktualisiereStatus(hwnd , Nachkommastellen , UmrechnVariante) ;
    return TRUE ;
    case WM_HSCROLL: /* ... ist Nachricht, die die Laufleiste ausloest */
    switch (LOWORD(wParam))
    {
    
    case SB_PAGEUP:
    Nachkommastellen = MinNachkomma ;
    break ;
    case SB_PAGEDOWN:
    Nachkommastellen = MaxNachkomma ;
    break ;
    
    case SB_LINEUP: /* ... bei horizontalen Leisten: "LINKS" */
    Nachkommastellen-- ;
    break ;
    case SB_LINEDOWN: /* ... bei horizontalen Leisten: "RECHTS" */
    Nachkommastellen++ ;
    break ;
    case SB_THUMBPOSITION:
    Nachkommastellen = HIWORD(wParam);
    break;
    case SB_THUMBTRACK:
    Nachkommastellen = HIWORD(wParam);
    break;
    }
    sprintf (WorkString , "%d" ,MinNachkomma) ;
    
    SetDlgItemText (hwnd , 211 , WorkString) ;
    if (Nachkommastellen > MaxNachkomma) Nachkommastellen = MaxNachkomma ;
    if (Nachkommastellen < MinNachkomma) Nachkommastellen = MinNachkomma ;
    AktualisiereStatus (hwnd , Nachkommastellen , UmrechnVariante) ;
    return TRUE ;
    case WM_COMMAND: /* ... ist hier eine ueber die Dialog-Box
    abgesetzte Nachricht, ... */
    switch (wParam)
    {
    case 110:
    case 111:
    CheckRadioButton (hwnd , 110 , 111 , (UmrechnVariante = wParam)) ;
    AktualisiereStatus (hwnd , Nachkommastellen , UmrechnVariante) ;
    SendMessage (hwnd , WM_COMMAND , IDOK , 0L) ; /* ... damit keine
    falsche Umrechnung in den Feldern verbleibt */
    return TRUE ;
    case IDOK: /* ... wurde die mit IDOK ("OK-Button") definierte
    Schaltflaeche gedrueckt */
    GetDlgItemText (hwnd , 100 , WorkString , 20) ;
    if (strlen (WorkString) > 0)
    {
    a = strtod (WorkString , &end_p) ;
    /* ... wandelt String in double-Variable um */
    if (*end_p == '\0')
    {
    if (UmrechnVariante == 110) Leistung = a * FAKTOR ;
    else Leistung = a / FAKTOR ;
    sprintf (WorkString , "%.*lf" , Nachkommastellen ,
    Leistung) ;
    SetDlgItemText (hwnd , 130 , WorkString) ;
    }
    else
    MessageBeep (0) ; /* ... gibt einen Piepton aus */
    }
    return TRUE ;
    case IDCANCEL: /* ... wurde die mit IDCANCEL ("Cancel-Button")
    definierte Schaltflaeche gedrueckt */
    EndDialog (hwnd , 0) ;
    return TRUE ;
    }
    }
    return FALSE ;
    }
    void AktualisiereStatus (HWND hwnd , int Nachkommastellen ,
    int UmrechnVariante)
    {
    SetScrollPos (GetDlgItem (hwnd , 120) , SB_CTL ,
    Nachkommastellen , TRUE) ;
    sprintf (WorkString , "%d" , Nachkommastellen) ;
    /* ... wandelt Zahl in String formatgesteuert um */
    SetDlgItemText (hwnd , 210 , WorkString) ;
    if (UmrechnVariante == 110)
    {
    SetDlgItemText (hwnd , 220 , "PS") ;
    SetDlgItemText (hwnd , 230 , "kW") ;
    }
    else
    {
    SetDlgItemText (hwnd , 220 , "kW") ;
    SetDlgItemText (hwnd , 230 , "PS") ;
    }
    /* ... aktualisiert die "Dimensionen" hinter den
    Edit-Fenstern. */
    return ;
    }
    

    und hier die Recurcen Datei

    #define IDC_LTEXT1	101
    #include <windows.h>
    HptokwinDialog DIALOG 0 , 0 , 186 , 126
    STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Umrechnung PS <--> kW"
    {
     LTEXT "Bitte Wert eingeben:", 200, 20 , 12 , 75 , 13
     EDITTEXT 100, 100 , 9 , 56 , 12
     LTEXT " ", 220, 160 , 12 , 20 , 8
     LTEXT "=", -1, 90 , 30 , 4 , 8
     EDITTEXT 130, 100 , 28 , 56 , 12, WS_DISABLED
     LTEXT " ", 230, 160 , 30 , 20 , 8
     RADIOBUTTON "PS ---> kW", 110, 20 , 55 , 50 , 10
     RADIOBUTTON "kW ---> PS", 111, 20 , 70 , 50 , 10
     SCROLLBAR 120, 105 , 60 , 59 , 10, SBS_HORZ | WS_TABSTOP
     LTEXT "Nachkommastellen", 205, 105 , 75 , 70 , 10
     LTEXT " ", 210, 131, 50, 20, 8
     DEFPUSHBUTTON "Berechnen", IDOK, 20 , 103 , 53 , 14
     PUSHBUTTON "Ende", IDCANCEL, 110 , 103 , 53 , 14
     LTEXT " ", 211, 162, 50, 20, 8
     LTEXT " ", IDC_LTEXT1, 157, 49, 20, 8
    }
    

    was habe ich da falsch gemacht?

    Gruß Anktech



  • Erstmal wäre es nett wenn du die [cpp]-Tags benutzt. Unter den Smileys ist ein Button dafür (C++).

    Dann musst du glaube ich per GetScrollInfo und SetScrollInfo die Position manuell setzen, sonst springt der Slide immer wieder auf den Anfangswert zurück.



  • Danke für deine Hilfe,
    ich habe jetzt festgestellt, da der Programmiercode aus einem alten Buch von Dankert war: www.rzbt.haw-hamburg.de/dankert/c_tutor.html/
    Da hatte ich das Programm in 16 Bit compiliert.
    Jetzt habe ich es mit den Borland 5.02 Compiler, in 32 Bit compiliert, jetzt funktioniert es.
    Hier nochmal der Code:

    /* Umrechnung PS <--> kW, Programm hpkwin01.c
    ========================================== */
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char WorkString [80] ;
    HANDLE hActInstance ;
    LONG FAR PASCAL WndProc (HWND , UINT , UINT , LONG) ;
    BOOL FAR PASCAL DialogProc (HWND , UINT , UINT , LONG) ;
    void AktualisiereStatus (HWND , int , int) ;
    int PASCAL WinMain (HANDLE hInstance , HANDLE hPrevInstance ,
    LPSTR lpszCmdParam , int nCmdShow)
    {
    MSG msg ;
    HWND hwnd ;
    WNDCLASS wndclass ;
    hActInstance = hInstance ;
    if (!hPrevInstance)
    {
    wndclass.style = NULL ; /* ... ist ein bemerkenswerter
    Sonderfall, das "Fenster ohne Stil", deshalb wird von ihm
    nichts zu sehen sein. Weil es aber kreiert wird, kann es
    auch "Child Windows" haben, in diesem Programm wird es eine
    Dialog-Box sein. */
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL , IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (NULL , IDC_ARROW) ;
    wndclass.hbrBackground = GetStockObject (GRAY_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = "WndClassName" ;
    RegisterClass (&wndclass) ;
    }
    hwnd = CreateWindow ("WndClassName" , NULL ,
    WS_OVERLAPPEDWINDOW , CW_USEDEFAULT ,
    							 CW_USEDEFAULT ,
    							 CW_USEDEFAULT ,
    							 CW_USEDEFAULT ,
    							 NULL ,
    							 NULL ,
    							 hInstance ,
    							 NULL) ;
    
    while (GetMessage (&msg , NULL , 0 , 0))
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }
    return msg.wParam ;
    }
    LONG FAR PASCAL WndProc (HWND hwnd , UINT message ,
    UINT wParam , LONG lParam)
    {
    switch (message)
    {
    case WM_CREATE:
    DialogBox (hActInstance , "HptokwinDialog" , hwnd ,
    MakeProcInstance (DialogProc , hActInstance)) ;
    SendMessage (hwnd , WM_CLOSE , 0 , 0L) ;
    return 0 ;
    case WM_DESTROY:
    PostQuitMessage (0) ;
    return 0 ;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    #define FAKTOR 0.7355
    BOOL FAR PASCAL DialogProc (HWND hwnd , UINT message ,
    UINT wParam , LONG lParam)
    {
    static int UmrechnVariante = 110 ; /* ... wird mit "PS ---> kW" */
    static int Nachkommastellen = 2 ;
    static int MinNachkomma = 0 ;
    static int MaxNachkomma = 4 ;
    double Leistung , a ;
    char *end_p ;
    switch (message)
    {
    case WM_INITDIALOG: /* Nachricht wird zum Initialisieren genutzt: */
    CheckRadioButton (hwnd , 110 , 111 , UmrechnVariante) ;
    /* ... schaltet alle Optionsflaechen von Nummer
    110 ... 111 aus und die in UmrechnVariante
    definierte Optionsflaeche ein */
    SetScrollRange (GetDlgItem (hwnd , 120) , SB_CTL ,
    MinNachkomma , MaxNachkomma , FALSE) ;
    AktualisiereStatus(hwnd , Nachkommastellen , UmrechnVariante) ;
    return TRUE ;
    case WM_HSCROLL: /* ... ist Nachricht, die die Laufleiste ausloest */
    switch (LOWORD(wParam))
    {
    
    case SB_PAGEUP:
    Nachkommastellen = MinNachkomma ;
    break ;
    case SB_PAGEDOWN:
    Nachkommastellen = MaxNachkomma ;
    break ;
    
    case SB_LINEUP: /* ... bei horizontalen Leisten: "LINKS" */
    Nachkommastellen-- ;
    break ;
    case SB_LINEDOWN: /* ... bei horizontalen Leisten: "RECHTS" */
    Nachkommastellen++ ;
    break ;
    case SB_THUMBPOSITION:    //neu von Anktech.de
    Nachkommastellen = HIWORD(wParam);
    break;
    case SB_THUMBTRACK:       //neu von Anktech.de
    Nachkommastellen = HIWORD(wParam);
    break;
    }
    if (Nachkommastellen > MaxNachkomma) Nachkommastellen = MaxNachkomma ;
    if (Nachkommastellen < MinNachkomma) Nachkommastellen = MinNachkomma ;
    AktualisiereStatus (hwnd , Nachkommastellen , UmrechnVariante) ;
    return TRUE ;
    case WM_COMMAND: /* ... ist hier eine ueber die Dialog-Box
    abgesetzte Nachricht, ... */
    switch (wParam)
    {
    case 110:
    case 111:
    CheckRadioButton (hwnd , 110 , 111 , (UmrechnVariante = wParam)) ;
    AktualisiereStatus (hwnd , Nachkommastellen , UmrechnVariante) ;
    SendMessage (hwnd , WM_COMMAND , IDOK , 0L) ; /* ... damit keine
    falsche Umrechnung in den Feldern verbleibt */
    return TRUE ;
    case IDOK: /* ... wurde die mit IDOK ("OK-Button") definierte
    Schaltflaeche gedrueckt */
    GetDlgItemText (hwnd , 100 , WorkString , 20) ;
    if (strlen (WorkString) > 0)
    {
    a = strtod (WorkString , &end_p) ;
    /* ... wandelt String in double-Variable um */
    if (*end_p == '\0')
    {
    if (UmrechnVariante == 110) Leistung = a * FAKTOR ;
    else Leistung = a / FAKTOR ;
    sprintf (WorkString , "%.*lf" , Nachkommastellen ,
    Leistung) ;
    SetDlgItemText (hwnd , 130 , WorkString) ;
    }
    else
    MessageBeep (0) ; /* ... gibt einen Piepton aus */
    }
    return TRUE ;
    case IDCANCEL: /* ... wurde die mit IDCANCEL ("Cancel-Button")
    definierte Schaltflaeche gedrueckt */
    EndDialog (hwnd , 0) ;
    return TRUE ;
    }
    }
    return FALSE ;
    }
    void AktualisiereStatus (HWND hwnd , int Nachkommastellen ,
    int UmrechnVariante)
    {
    SetScrollPos (GetDlgItem (hwnd , 120) , SB_CTL ,
    Nachkommastellen , TRUE) ;
    sprintf (WorkString , "%d" , Nachkommastellen) ;
    /* ... wandelt Zahl in String formatgesteuert um */
    SetDlgItemText (hwnd , 210 , WorkString) ;
    if (UmrechnVariante == 110)
    {
    SetDlgItemText (hwnd , 220 , "PS") ;
    SetDlgItemText (hwnd , 230 , "kW") ;
    }
    else
    {
    SetDlgItemText (hwnd , 220 , "kW") ;
    SetDlgItemText (hwnd , 230 , "PS") ;
    }
    /* ... aktualisiert die "Dimensionen" hinter den
    Edit-Fenstern. */
    return ;
    }
    

    und hier noch die RC Datei:

    HptokwinDialog DIALOG 0 , 0 , 186 , 126
    STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Umrechnung PS <--> kW"
    FONT 10, "MS Sans Serif"
    {
     LTEXT "Bitte Wert eingeben:", 200, 20 , 12 , 75 , 13
     EDITTEXT 100, 100 , 9 , 56 , 12, WS_BORDER | WS_TABSTOP
     LTEXT " ", 220, 160 , 12 , 20 , 8
     LTEXT "=", -1, 90 , 30 , 4 , 8
     EDITTEXT 130, 100 , 28 , 56 , 12, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_BORDER | WS_TABSTOP
     LTEXT " ", 230, 160 , 30 , 20 , 8
     RADIOBUTTON "PS ---> kW", 110, 20 , 55 , 50 , 10
     RADIOBUTTON "kW ---> PS", 111, 20 , 70 , 50 , 10
     SCROLLBAR 120, 105 , 60 , 59 , 10, SBS_HORZ | WS_CHILD | WS_VISIBLE | WS_TABSTOP
     LTEXT "Nachkommastellen", 205, 105 , 75 , 70 , 10
     LTEXT " ", 210, 131, 50, 20, 8
     DEFPUSHBUTTON "Berechnen", IDOK, 20 , 103 , 53 , 14
     PUSHBUTTON "Ende", IDCANCEL, 110 , 103 , 53 , 14
     LTEXT " ", 211, 162, 50, 20, 8
    }
    


  • einrücken ist nicht oder was?



  • Wo sollte ich deine Meinung nach einrücken?


  • Mod

    Anktech schrieb:

    Wo sollte ich deine Meinung nach einrücken?

    Deinen Code...
    Ich finde das absolut unlesbar.



  • Hallo Martin den Code Habe ich aus den Buch von dem Dankert Praxis der C-Progamierung raus kopiert mit copy and paste:
    http://www.rzbt.haw-hamburg.de/dankert/ctutor2.pdf
    Auf Seite 177 im Buch (Seite 39 im PDF) fängt das Programm an.
    Ich habe nur die Kommentare entfernt, den Rest habe ich fast alle so belassen.


Anmelden zum Antworten