Static Label und SetText



  • Hallo,

    möchte bestehenden Text von static Label neu setzen

    HWND hLabelOrt = CreateWindowEx(WS_EX_CLIENTEDGE,
    "static",
    "",
    WS_CHILD | WS_VISIBLE,
    320,40,112,20,
    hHauptfenster,
    (HMENU) IDC_Label_Ort,
    GetModuleHandle(NULL),
    0);
    

    beim erneuten senden von WN_SETTEXT bleibt der alte Inhalt
    bestehen und der neue Text wird darüber geschrieben.

    HWND hLabelOrt = GetDlgItem(hMainWindow,108);
    
    SendMessage(hLabelORT, WM_SETTEXT, NULL, (LPARAM)cOrt_Kunde);
    RedrawWindow(hLabelOrt,NULL,NULL,RDW_ERASE);
    

    Ohne Erfolg versucht:

    RedrawWindow(hLabelOrt, NULL, NULL, RDW_ERASE);

    RECT rectLabel_Ort;
    GetWindowRect(hLabelOrt,&rectLabel_Ort);
    RedrawWindow(hHauptfenster, &rectLabel_Ort, NULL, RDW_UPDATENOW);

    RECT rectUpdateBereich = {320,20,432,20};
    RedrawWindow(hHauptfenster, &rectUpdateBereich, NULL, RDW_UPDATENOW);
    RedrawWindow(hHauptfenster, NULL, NULL, RDW_UPDATENOW); //Gesamtes Fenster neu zeichnen
    UpdateWindow(hLabel_Ort);

    Wo liegt der entscheidende Fehler ?

    CU==>Eisbeer<==



  • Poste mal deine gesamte WndProc, so ein Problem ist mir noch nicht untergekommen. Arbeitest du mit WM_CTLCOLORSTATIC oder WM_ERASEBKGND? Und bedeutet beim Erneuten Senden, dass du den Text einmal mit WM_SETTEXT ändern kannst? Das wäre dann recht eigenartig.



  • Bei der Verwendung von WM_COLORSTATIC, sowie bei WM_ERASEBKGND tritt das Problem auf. Ist der betreffende Code auskommentiert funktioniert´s wie erwartet.

    case WM_ERASEBKGND;
    if(GetDlgItem(hHauptFenster,108) == (HWND) lParam)
    {
      SetBkMode((HDC)wParam, TRANSPARENT);
      return (BOOL) GetSockObject(HOLLOW_BRUSH);
    }
    
    case WM_CTLCOLORSTATIC;
    if(GetDlgItem(hHauptFenster,108) == (HWND) lParam)
    {
      SetBkMode((HDC)wParam, TRANSPARENT);
      return (BOOL) GetSockObject(HOLLOW_BRUSH);
    }
    

    ==>Eisbeer<==



  • Was ist das denn für ein unsinniger Code oO
    1. Warum schreibst du die Fenster ID direkt dahin anstatt einen aussagekräftigen Namen (enum / define)?
    2. GetSockObject gibt es nicht, gemeint ist wohl GetStockObject. Ist das wirklich dein kompilierender Code?
    3. Warum wird die Bestätigung der Aufgaben von einen offensichtlich existierenden Brush abhängig gemacht?
    4. Wozu der Transparenz BkMode? Dies könnte die Ursache sein.



  • Auf WM_ERASEBKGND sollst Du entweder den Hintergrund löschen (damit wäre dann Dein alter Text weg), oder 0 zurückgeben.


  • Mod

    Das geht nicht wenn Du in WM_CTLCOLORSTATIC sagst, dass Du trasnparent zeichnest und nichts in WM_ERASEBKGND machst.
    Das muss doch zu Artefakten führen.



  • MainWindowProcedure:

    case WM_CTLCOLORSTATIC:
    			if(GetDlgItem(hHauptFenster, IDC_Label_Ort) == (HWND)lParam)
    			{
    			HWND hLabelOrt = GetDlgItem(hHauptFenster,IDC_Label_Ort);
    			SetBkMode((HDC)wParam, TRANSPARENT);
    			return (LRESULT)GetStockObject(HOLLOW_BRUSH);
    			}
    			break;
    

    der Fehler liegt eindeutig bei SetBkMode. Ohne SetBkMode funktionierts wie erwartet.

    Nur was hat das mit dem löschen des alten Textes zu tun?


  • Mod

    Der Hintergrund wird bei Dir nicht neu gezeichnet.
    Das ist der Grund.



  • Eisbeer schrieb:

    ...der Fehler liegt eindeutig bei SetBkMode. Ohne SetBkMode funktionierts wie erwartet.

    Nur was hat das mit dem löschen des alten Textes zu tun?

    Wie Martin bereits gesagt, dennoch zur Aufklärung warum es bei dir ohne den BkMode läuft: ohne den Transparenz-Modus wird zum Text auch dessen Hintergrund gemalt und dieser ist wahrscheinlich größer als der vorherige Inhalt.



  • Wie funktioniert das mit dem Neuzeichnen des Hintergrundes. Konnte keine Beispiele zum Thema finden.

    Laut MSDN sollte WM_ERTASEBKGND nicht Null zurückgeben, wenn das Programm den Hintergrund selbst löscht. Nur wie kann man den Hintergrund selbst löschen.

    ==>Eisbeer<==



  • Wenn ein SolidBrush zurückgegeben wird funktioniers, was bedeutet ich versuche den alten Hintergrund zu kopieren und gebe diesen zurück.

    Nur leider immer noch nicht klar, warumm es bei Rückgabe eines HOLLOW_BRUSH / NULL_BRUSH nicht funktioniert.

    ==>Eisbeer<==



  • Wenn das Fenster hLabelOrt ausgeblendet wird, danach der Text gesetzt wird und das Fenster anschließend wieder angezeigt wird funktionierts.

    ShowWindow(hLbaelOrt, SW_HIDE);
    SetDlgItemText(hHauptFenster, IDC_Label_Ort,cOrt);
    ShowWindow(hLbaelOrt, SW_SHOW);
    

    Einziger Nachteil, es entsteht ein Rahmen um den Text.
    Beim Minimieren und wieder Anzeigen der Anwendung tritt der gleiche Effekt auf.

    Hauptsache es funktioniert ohne Recourcen zu verbrauchen.
    Sollte jemand eine elegantere Version kennen bin ich natürlich für Denkanstöße dankbar.

    ==>Eisbeer<==


Log in to reply