DAU-Frage zu Text in Buttons



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



  • Hi,

    hab es jetzt hinbekommen...

    Ich habe das Auslesen der Datei in die Main geschoben. Dann kompiliert Pelle fehlerfrei.

    Ist nicht wirklich schön, aber erst mal muss das Ding laufen. dann mach ich mich ans Überarbeiten.

    Was ich aber festgestellt habe ist, dass SendMessage() von CE nicht unterstützt wird... 😡
    Wenn ich das nämlich auf dem PNA ausführe, hängt er sich komplett auf und kann nur mit nem Hardreset wieder erweckt werden.

    Also muss eine andere Lösung her...



  • Ich werde das jetzt anders machen....

    Für alle Apps, die nicht installiert sind, werde ich einen Dummy-Button einfügen und den eigentlichen Button einfach ausblenden...
    Das ist zwar nicht so komfortabel, weil ich dann öfter ein Update machen muss für neue Sachen, aber ich kriegs einfach nicht gebacken...
    Ich hänge schon viel zu lange an dem Mist rum...

    Nochmal danke für deine Hilfe @LolliPop, auch wenn ich jetzt erst einmal aufgebe. Vielleicht finde ich irgendwann ja selber die Lösung für das Problem.


Anmelden zum Antworten