listbox->string hineinschreiben



  • Ich schreibe ein Programm, wo man lebensmittel einkaufen kann. Und zwar ist mein problem, dass ich ein art log im unteren bereich des fensters haben möchte, und das mit einem listenfeld machen möchte. Nur wird dort nie etwas hinein geschieben.

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HDC          hdc;
        PAINTSTRUCT  ps;
        HPEN         hpen; 
        static HWND hwnded,hwnded2,hwnd3,hwndbut;
    
        switch (message)                  /* handle the messages */
        {
            case WM_PAINT:
                          hdc=BeginPaint(hwnd, &ps);
    
                          TextOut(hdc,130,5, "Lageraldiprogramm der Wallenhorster Pfadfinder",
    sizeof("Lageraldiprogramm der Wallenhorster Pfadfinder")-1);
    
                          hpen = CreatePen(PS_SOLID,0, RGB(0,0,0));
                          SelectObject(hdc,hpen);
                          RoundRect(hdc,10,50,580,170,10,10);
                          TextOut(hdc,30,42,"Info",4);
                          TextOut(hdc,20,65,"Name: ",6);
                          TextOut(hdc,300,65,"Gruppe: ",8);
                          TextOut(hdc,20,100,"Guthaben: ",10);
                          TextOut(hdc,20,135,"Pfandagegeben: ",15);
                          TextOut(hdc,300,135,"Pfandausstehend: ",17);
    
                          RoundRect(hdc,10,450,580,200,10,10);
                          TextOut(hdc,30,192,"Einkaufen",9);
                          TextOut(hdc,30,236,"ID",2);
                          TextOut(hdc,250,236,"Anzahl",6);
                          EndPaint(hwnd, &ps);
                          return 0;
    
            case WM_CREATE:
                          hwnded = CreateWindowEx(WS_EX_CLIENTEDGE ,"edit", NULL,WS_CHILD | WS_VISIBLE | ES_CENTER,
    				      50, 235, 100, 25, hwnd, (HMENU) ed1,
    				      ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
    
    				      hwnded2 = CreateWindowEx(WS_EX_CLIENTEDGE,"edit", NULL,WS_CHILD | WS_VISIBLE | ES_CENTER,
    				      300, 235, 100, 25, hwnd, (HMENU) ed1,
    				      ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
    
     				      hwndbut = CreateWindow ("button", "Kaufen",
      				      WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
       				      430, 234, 100, 27, hwnd, (HMENU) but,
       				      ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
    
       				      hwnd3 = CreateWindowEx(WS_EX_CLIENTEDGE,"listbox", NULL,WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE 
    				      | ES_AUTOVSCROLL | ES_READONLY,30, 270, 535, 165, hwnd, (HMENU) ed1,
    				      ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
    
                          return 0;
    
            case WM_COMMAND:
                          switch(HIWORD(wParam))
                          {
                               case BN_CLICKED:
                                               switch(LOWORD(wParam))
                                               {
                                                     case but:
                                                              SendMessage(hwnd3,LB_ADDSTRING,0,(long)"> blabal");
                                                              break;
                                               }
                                               break; 
                          }
                          return 0;
            case WM_DESTROY:
                          DeleteObject(hpen);
                          PostQuitMessage(0);
                          return 0;
    
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

    Wenn auf kaufen geklickt wird soll ">blabla" hineingechrieben werden.

    Kan mir jemand helfen?

    Ps: Ich bin ein absoluter Winapi Neuling!!



  • mach einfach

    an der stelle wo es hinzugefuegt werden soll

    //pseudocode

    ListView_AddItem(hwnd3, _T("Test"));
    

    ps. warum ist es hier im forum fuer manche so schwer "cpp" tags zu verwenden, staendig seh ich nur diese "code" tags - des nervt

    //dazuedit

    warum convertierst du es nach long ?

    SendMessage(hwnd3,LB_ADDSTRING,0,(long)"> blabal");
    

    mach das so:

    ::SendMessage(hwnd3, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(_T("blabla")));
    

    //bloede tippfehler #gg



  • Hoi,

    1. Erzeugst Du ein GDI-Leak mit dem Objekt 'hpen' und 2. kannst Du für die Erstellung des ListBox-Controls keine EditBox-Styles angeben, also hier:

    hwnd3 = CreateWindowEx(WS_EX_CLIENTEDGE,"listbox", NULL,WS_CHILD | WS_VISIBLE | [b]ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY[/b],30, 270, 535, 165, hwnd, (HMENU) ed1, ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
    

    Hier hast Du eine Liste, aller verfügbaren Style bezüglich ListBoxes: List Box Styles (MSDN).

    Dann zum GDI-Leak: Du löscht das Objekt zwar unter WM_DESTROY, aber da der Handle nicht statisch ist, hast Du keinen gültigen Zugriff mehr darauf (DeleteObject wird also nix freigeben). Außerdem wird im WM_PAINT-Handler ständig ein neuer Zeichenstift erstellt, ohne das vorherige Objekt zu löschen. Desweiteren solltest Du den im 'hdc' vorher befindlichen Zeichenstift sichern und später wieder zurück-selektieren.
    Siehe dazu hier: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_9v3o.asp



  • Mr Evil schrieb:

    mach einfach

    an der stelle wo es hinzugefuegt werden soll

    //pseudocode

    ListView_AddItem(hwnd3, _T("Test"));
    

    Das wird nicht funktionieren. Er arbeitet mit einer ListBox, nicht einem ListView.

    Mr Evil schrieb:

    ps. warum ist es hier im forum fuer manche so schwer "cpp" tags zu verwenden, staendig seh ich nur diese "code" tags - des nervt

    Er hat doch CPP-Tags verwendet 🙄 .

    Mr Evil schrieb:

    warum convertierst du es nach long ?
    mach das so:

    SendMessage(hwnd3,LB_ADDSTRING,0,(long)"> blabal");
    
    ::SendMessage(mhwnd3, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(_T("blabla")));
    

    Dort konvertierst Du auch nach long 😉 . LPARAM ist definiert als long...obwohl man generell die vorhandenen Typen verwenden sollte (also hier LPARAM), da sich dies in zukünftigen Versionen ändern kann (also die Definition von LPARAM = long).

    EDIT: Das mit dem _T() bzw. TEXT() ist aber sehr sinnvoll! Hatte ich vergessen zu erwähnen.



  • CodeFinder schrieb:

    Das wird nicht funktionieren. Er arbeitet mit einer ListBox, nicht einem ListView.

    schon, aber schau selber mal zu welcher message das ListView makro geaendert wird - das ist genau das richtige {o;

    CodeFinder schrieb:

    Er hat doch CPP-Tags verwendet 🙄 .

    ups, ok stimmt, sah auf den ersten blick so komisch aus #gg

    CodeFinder schrieb:

    Dort konvertierst Du auch nach long 😉 . LPARAM ist definiert als long...obwohl man generell die vorhandenen Typen verwenden sollte (also hier LPARAM), da sich dies in zukünftigen Versionen ändern kann (also die Definition von LPARAM = long).

    oh, wusste ich gar nicht - gleich mal nachschaun #gg



  • Mr Evil schrieb:

    CodeFinder schrieb:

    Das wird nicht funktionieren. Er arbeitet mit einer ListBox, nicht einem ListView.

    schon, aber schau selber mal zu welcher message das ListView makro geaendert wird - das ist genau das richtige {o;

    lol, das Makro existiert gar nicht. Oder kannst Du mir dazu mal einen Link posten ?



  • irgendwas hab ich da durcheinander gebracht, das ListView_InsertItem gibts - naja egal #gg

    mal kurz was anderes - wenn ich "LPARAM" bei mir im source nach "long" aender bekomm ich nur errors - das selbe bei WPARAM



  • Mr Evil schrieb:

    mal kurz was anderes - wenn ich "LPARAM" bei mir im source nach "long" aender bekomm ich nur errors - das selbe bei WPARAM

    Zeig mal eine Code-Änderung und den dazugehörigen Error.



  • ::SendMessage(m_Handle, WM_SETFONT, reinterpret_cast<unsigned int>(GetStockObject(uiFont)), 0);
    

    warning C4311: 'reinterpret_cast' : pointer truncation from 'HGDIOBJ' to 'unsigned int'

    ::SendMessage(m_Handle, EM_GETSEL, reinterpret_cast<unsigned int>(&oldPosF), reinterpret_cast<long>(&oldPosE));
    

    warning C4311: 'reinterpret_cast' : pointer truncation from 'unsigned long *__w64 ' to 'unsigned int'
    warning C4311: 'reinterpret_cast' : pointer truncation from 'unsigned long *__w64 ' to 'long'

    zugegeben ich bekomm immer nur lauter warnungen - aber in meinen augen ist ne warnung genauso schlimm

    //dazuedit
    insgesammt hab ich 114 warnungen

    //dazuedit
    ich habe mal eben gegooglet - das liegt anscheinend mit der 64bit erkennung zusammen, die muss ich in den project settings deaktivieren, dann kommen keine warnungen mehr



  • Ich selbst schrieb:

    [...] LPARAM ist definiert als long...obwohl man generell die vorhandenen Typen verwenden sollte (also hier LPARAM), da sich dies in zukünftigen Versionen ändern kann (also die Definition von LPARAM = long).



  • du weisst - du kennst schon meine meinung zu "NULL"
    auch das "DWORD", "BOOL" und "UINT" hab ich jeweils durch das richtige ersetzt - hauptsaechlich aus den grund das so es schoen blau wird und man es dadurch schneller erkennt beim ueberfliegen #gg

    bloed nur das ich meine eigenen defines nicht blau machen kann #gg

    ich verwende sowas aber nur wenn es da unterschiede zwischen unicode und multibyte gibt



  • Mr Evil schrieb:

    du weisst - du kennst schon meine meinung zu "NULL"
    auch das "DWORD", "BOOL" und "UINT" hab ich jeweils durch das richtige ersetzt - hauptsaechlich aus den grund das so es schoen blau wird und man es dadurch schneller erkennt beim ueberfliegen #gg

    bloed nur das ich meine eigenen defines nicht blau machen kann #gg

    Du kannst da noch ne Menge gewaltig einfärben, ABER: Desto mehr Du einfärbst, desto unübersichtlicher wird es. -Glaub mir.

    Guckst Du: Punkt 4 und 5: "Define custom keyword / Define custom colours in the IDE"

    Mr Evil schrieb:

    ich verwende sowas aber nur wenn es da unterschiede zwischen unicode und multibyte gibt

    Was sicherlich auch sinnvoll ist, aber es reicht nicht. Also -hm ok- wenn Deine Quellcodes 'für die Zukunft' (64-Bit) unbrauchbar werden sollen- ok.^^ Du kannst das ja bei BOOL oder UINT machen, bei DWORD ist es aber wieder was anderes, da kann sich was ändern.



  • da faellt mir ein - ich hab doch daheim ein dual AMD 64bit cpu - da koennte ich testweise ja mal ein zweites 64bit windows installieren und tests fahren #gg

    bzgl einfaerben - also ich mach nicht alles bunt, wenn dann vielmehr diese schluesselworte wie DWORD oder UINT sowie LPARAM oder WPARAM - diese wuerd ich aufaerben wollen

    amsonsten reicht das, bin doch nicht bei den teletubbies #gg

    egal - ich mach feierabend q:


Anmelden zum Antworten