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?
-
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.