DAU-Frage zu Text in Buttons



  • Hallo zusammen,

    in ANSI C hab ich schon Hilfe bekommen zum Auslesen eines Textfiles.
    In diesem Textfile sind die Button-Nummer, der Button-Text und der Button-Link hinterlegt, die ich nun gerne mit den Buttons verknüpfen möchte...

    static  INT_PTR CALLBACK MainDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	CreateWindow(_T("Button"), _T(" "), WS_VISIBLE|WS_TABSTOP|WS_CHILD, 0,80,72,40, hwndDlg, (HMENU) Button1, NULL, NULL);
    	CreateWindow(_T("Button"), _T(" "), WS_VISIBLE|WS_TABSTOP|WS_CHILD, 80,80,72,40, hwndDlg, (HMENU) Button2, NULL, NULL);
    /* usw bis Button 8 */
    
       switch (uMsg)
        {
         case WM_COMMAND:
             switch (GET_WM_COMMAND_ID(wParam, lParam))
             {
         case Button1:
    /* hier fehlt noch der Aufruf der Variablen für den Link zum Programm */
    	    PostQuitMessage(0);
    	    return TRUE;
    /* usw bis Button 8 */
    

    Der Inhalt aus der TXT kommt wie folgt daher: (hier nochmals herzlichen Dank an @Big Brother dafür)

    typedef struct button Button;
    
    struct button
     {
        int nr;
        char text[LINELEN_MAX+1];
        char link[LINELEN_MAX+1];
    };
    
    void view_button_array ( Button* b, unsigned n )
     {
        unsigned i = 0;
        while ( i < n )
            printf ( "%d\n" "%s\n" "%s\n\n", b[i].nr, b[i].text, b[i].link ), i++;
    
    }
    

    Ich hab keine Ahnung, wie ich das umsetzen soll... kann mir da noch mal jemand helfen bitte? 😕



  • Was für ein Button-Link?

    Du kannst auf einen Button-Click reagieren, Stichwort: BN_CLICKED
    Den Button-Text setzt du mit WM_SETTEXT


  • Mod

    Man terminiert sein Program nicht mit PostQuitMessage(0).

    Wenn dies ein Diaog ist solltest Du EndDialog aufrufen.



  • Hallo zusammen...

    Das Ganze soll ein dynamisches Menü werden, da beim Start des Menüs eine TXT-Datei ausgelesen wird, was schon mal funktioniert, wie man sieht...
    Pelles C sagt mir jedenfalls, dass folgender Inhalt ausgelesen wird:

    ODS: Es wurden 8 Datensaetze eingelesen.
    .
    .
    .
    ODS: 3                                                //Button-Nummer
    "Kartenfarben ändern"                                 //Button-Text
    \\My Flash Disk\\PROGRAMME\\Map-Farben.exe            //Button-Link
    .
    .
    .
    usw bis Datensatz 8
    

    das ist ja schon mal richtig.

    "Kartenfarben ändern" wäre dann der Button-Text, den ich versucht habe mittels

    SendMessage(hwndDlg, WM_SETTEXT, 0, ... );
    

    an den jeweiligen Button zu übergeben.
    Egal wie ich das versuche, mir läuft der Compiler immer in einen Fehler.
    Wie komme ich denn an diese Einträge dran: 😕

    printf ( "%d\n" "%s\n" "%s\n\n", b[i].nr, b[i].text, b[i].link ), i++;
    

    Der Button-Link soll dann:

    case Button3:
    	CreateProcess(... ,NULL,0,0,FALSE,0, 0, 0, NULL, NULL);
    	EndDialog;
    	return TRUE;
    

    mit CreateProcess() beim Drücken des Buttons ausgeführt werden... Das ist eigentlich alles, aber auch alles noch zu hoch für mich...
    Ich weiss, das sind mit Sicherheit Anfängerfragen... aber seid bitte so lieb und helft mir aufs Pferd.

    Danke im voraus für Eure erneute Hilfe



  • Du hast leider zu wenig Ahnung, als dass das gscheid was werden kann.

    Wie du an die Einträge rankommst? Weißt du jetzt nicht mal was eine Struktur und ein Array ist oder wie?

    Und was für einen Compilerfehler erhältst du?



  • Hallo Lollipop,

    stimmt... ich hab noch wenig Ahnung davon, deshalb versuche ich ja mich da rein zu wurschteln. Leider geht das nicht von heut auf morgen.
    Aber vielleicht kannst Du mir da doch helfen??? 😕



  • Ok dann sag ganz genau was du willst.



  • Daaanke!!!

    Also folgendes Szenario:

    Das Menü soll dynamisch sein, d.h. beim Start wird die zugehörige Addins.txt ausgelesen und es sollen die Buttons erstellt werden.
    Das Auslesen der TXT klappt ja schon mal.

    Die Zeilen in der TXT sind:
    Button-Nummer
    Buttontext
    Button-Link

    Entsprechend der Reihenfolge der Einträge in der TXT (Button1-Button9) sollen dann die einzelnen Buttons:

    a:) mit dem in der TXT gespeicherten Buttontext belegt werden
    b:) der in der TXT vorhandene "Link" soll über CreateProcess() beim Klicken auf den Button ausgelöst werden.

    Ich hoffe, ich habe das verständlich rüber gebracht...

    ach ja Edit:

    Das Fenster selber mit Bitmap, die feststehenden Buttons und die 8 selbst erstellten Buttons sind so weit fertig, das Menü kann ich schon mal starten, beenden, umschalten... es fehlen nur die Button-Texte und die "Links"



  • Darfs auch C++ sein?

    Und die Buttonanzahl bleibt immer gleich?



  • Hallo Lollipop,

    es sind immer 8 individuelle Buttons, 3 fixe Buttons, die in der untersten Reihe stehen, um andere Menüs aufzurufen, und einen fixen Exit-Button unten rechts. Alternativ könnte man die 3 Menü-Buttons auch noch in die TXT schieben - das wäre sogar noch besser. So wäre das noch individueller... Wir hätten damit also 11 Buttons!

    C++ ?? Kann ich das dann auf C umstricken?

    Wie schonmal gesagt, ich arbeite mit Pelles C und habe alle anderen Tools für unser abgespecktes Windows CE 5 damit auch schon erstellt, nur habe ich da bisher nur mit fixen Buttons und festen CreateProcess() gearbeitet... Das kriege ich gut hin, bestimmt nicht schön programmiert, aber funktioniert...

    Wahrscheinlich würde es schon genügen, wenn ich ein Beispiel bekäme, was ich für meine Zwecke umschreiben könnte. So lerne ich das wenigstens, oder? 😕



  • Sorry, aber mit C-gefrickel ala FILE und malloc kann ich nix anfangen. C++ könntest du nicht einfach so auf C übertragen.

    Ich hoffe, es hilft dir jemand anders, oder du entscheidest dich doch für C++ (Hast du denn überhaupt die Möglichkeit, es zu kompilieren?).



  • Schade...
    Hätte auch keinen Compiler dafür.

    Naja, vielleicht hilft mir jemand anders...

    Trotzdem nochmals herzlichen Dank für Dein Angebot!



  • Hallo zusammen,

    gibt es denn hier jemanden, der mir hier helfen möchte/kann?

    Ich würde nicht fragen, wenn ich einen Ansatz hätte und mir durch lesen und suchen selber helfen könnte... 😕



  • Hat der Pelles C einen Dialog Editor?
    Manuell die Controls erstellen ist halt meist mühsam.

    Also das Einlesen hat schon geklappt, hast du gemeint. Dann hast du also schon Objekte von struct button angelegt ( zB button btns[8]; ).

    Texte:

    HWND button1Handle = CreateWindow(_T("Button"), _T(" "), ...
    ...
    SendMessage(button1Handle, WM_SETTEXT, 0, (LPARAM)btns[0].text);
    ...
    
    // Oder
    
    CreateWindow(_T("Button"), _T(btns[0].text), ... // Vllt. _T() weglassen, kA, nie genutzt
    

    "Links":

    STARTUPINFO startupInfo = { sizeof(STARTUPINFO) }; // Weiß nicht, ob das so in C klappt, sry
    PROCESS_INFORMATION processInformation;
    
    CreateProcess(btn[0].link, 0, 0, 0, 0, 0, 0, 0, &startupInfo, &processInformation);
    

    Wenn du mit Unicode nix am Hut hast, lass _T() immer weg und passe ggf. die Projekteinstellungen an. Google hilft, auch dir.



  • Hallo LolliPop,
    jep das Struct steht...

    void view_button_array ( Button* b, unsigned n )
     {
        unsigned i = 0;
        while ( i < n )
            printf ( "%d\n" "%s\n" "%s\n\n", b[i].nr, b[i].text, b[i].link ), i++;
    }
    

    Hier sollte doch die Übergabe der Button-Nummer, dem Text und auch dem Link erledigt sein....oder bin ich jetzt komplett daneben??? 😕

    Wenn ich nun b{1].text im ersten Button einbaue,

    CreateWindow(_T("Button"), (b[1].text), WS_VISIBLE|WS_TABSTOP|WS_CHILD, 0, 80,72, 40, hwndDlg, (HMENU) Button1, NULL, NULL);
    

    oder auch durch SendMessage()einbinde, bekomme ich Fehlermeldungen:

    Erzeugen von main.OBJ.
    F:\GoPal5-Tools\Addins-Menü\main.c(85): error #2048: Undeclared identifier 'b'.
    F:\GoPal5-Tools\Addins-Menü\main.c(85): error #2144: Type error: pointer expected.
    F:\GoPal5-Tools\Addins-Menü\main.c(85): error #2113: Left operand of . has incompatible type 'int'.
    F:\GoPal5-Tools\Addins-Menü\main.c(85): error #2140: Type error in argument 3 to 'CreateWindowExW'; found 'int', expected 'const wchar_t *'.
    *** Fehlercode: 1 ***
    Fertig.
    


  • Nö, diese Funktion view_button_array() macht nur einen standard output (printf), also meist eine Textausgabe in die Konsole.

    Zeig mal, wo und wie du die Datei einliest.



  • Hallo,

    ausgelesen wird die so:

    int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow)
    {
        int n = 3,																	// Anzahl der zu einem Datensatz zugehörigen Zeilen.
            i = 0;				 													// Index und Zähler fürs Strukturarray.
        char* fname = "My Flash disk\\navigation\\skin320x240\\Addins\\Addins.txt",
                *fmt = "%d %1023[^\n]\n %1023[^\n]\n"; 									// Angepasst an LINELEN_MAX.
        FILE* fp = fopen ( fname, "r" );
        Button buttons[N] = {0}; 													// Strukturarray für die Daten der Buttons.
    
        if ( fp == NULL ){
    
    	  MessageBox(NULL, L"Addins.TXT fehlt, bitte den Skin neu installieren! ", L"Addins-Menü", MB_SETFOREGROUND);
    		return (0);}
    
        while ( !feof(fp) ) {
            if ( i == N ) {
    	  MessageBox(NULL, L"Addins.TXT beschädigt, bitte den Skin neu installieren! ", L"Addins-Menü", MB_SETFOREGROUND);
    	return (0);
                break;
            }
            if ( n != fscanf ( fp, fmt, &buttons[i].nr, buttons[i].text, buttons[i].link )) {
    	  MessageBox(NULL, L"Addins.TXT nicht vollständig, bitte den Skin neu installieren! ", L"Addins-Menü", MB_SETFOREGROUND);
    	return (0);
                break;
            }
            i++;
        }
        printf ( "Es wurden %d Datensaetze eingelesen.\n\n", i );
        view_button_array ( buttons, i );
        fclose ( fp );
    

    hier dann noch das Struct:

    #define LINELEN_MAX 1023 	// Maximale Anzahl der Zeichen einer Zeile.
    #define N 8 			// Anzahl der Button.
    
    static  INT_PTR CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM);
    static HANDLE ghInstance;
    
    typedef struct button Button;
    
    struct button
     {
        int nr;
        char text[LINELEN_MAX+1];
        char link[LINELEN_MAX+1];
    };
    


  • Puh... Hirnkrampf...ähhh

    Also da hast ja deine Buttons: Button buttons[N] = {0};

    Also verwende nicht "b[0]..." sondern "buttons[0]..."



  • Das hatte ich auch schon versucht...
    Fehlermeldungen beim Kompilieren:

    error #2048: Undeclared identifier 'buttons'.
    ...Addins-Menü\main.c(86): error #2144: Type error: pointer expected.
    ...Addins-Menü\main.c(86): error #2113: Left operand of . has incompatible type 'int'.
    ...Addins-Menü\main.c(86): error #2070: Insufficient number of arguments to 'SendMessageW'.
    *** Fehlercode: 1 ***
    

    😕



  • Dann mach buttons global, wenn du auch außerhalb von WinMain() darauf zugreifen willst.

    typedef struct button Button;
    
    struct button...
    
    ...
    
    Button buttons[N];
    
    ...
    
    int __stdcall WinMain(...
    

    Und zeige Zeile 86 der main.c wegen den anderen drei Errors.


Anmelden zum Antworten