Button Dynamisch -> BN_CLICKED

Hallo Dirk,

jeder Control-Typ hat eigene Notification-Messages. Zum Beispiel sind das beim Button die Messages "BN_..." und beim Editfeld die Messages "EN_...". Wenn du also beim Editfeld auf "BN_CLICKED" prüfst, ist damit eine vollkommen andere Bedeutung verbunden. Beim Klick in ein Editfeld würde etwa eine "EN_SETFOCUS"-Message gesendet werden. Du müsstest dir also aus der MSDN die zu jedem Control spezifischen Messages heraussuchen und entsprechende Abfragen gestalten zu können.

Gruß
MCoder
 
Oh man ja klar... jetzt wo du es sagt.... *schäm*!
Dank dir!
Ich glaub aber das die MSDN nicht mein Freund wird :)
 
Jetzt noch eine andere Frage!!
Kann ich hier evtl. auch stellen, weil der ja auch dynamisch erzeugt wurde!?

Ich habe ein Problem mir dem ändern der Schrift in einem CEdit!
Es tut sich nix... Das einzige was man erkennen kann: Wenn man den ersten Parameter von CreateFont kleiner macht wird die Schrift von unten abgeschnitten --> Es passiert doch irgendwas :rolleyes:

Der Folgende Code läuft in einer Schleife durch..
Code:
CFont font ;
font.CreateFont (0, 0, 0, 0, FW_LIGHT, FALSE, FALSE, 0, ANSI_CHARSET, OUT_STRING_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH | FF_MODERN, "Arial") ;
CEdit *Edit = new CEdit ;
Edit -> Create        (WS_TABSTOP /*| WM_SETFONT*/ | ES_CENTER | WM_CTLCOLOR | WS_CHILD | WS_VISIBLE, CRect (150, 30 + (25 * index), 180, 49 + (25 * index)), this, ainDigit + index) ;
Edit -> ModifyStyleEx (0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME) ;
Edit -> SetWindowText ("-"                               ) ;
Edit -> SetFont       (&font, TRUE                       ) ;
          //Edit -> SendMessage     (PBM_SETBKCOLOR, 0, (LPARAM) RGB (255, 255, 0)) ; 
          //Edit -> SetTextColor(RGB(0,255,255)) ;
 
Der erste Parameter von CreateFont() ist die Höhe der Schrift. Hier solltest du also schon mal einen Wert ungleich Null eintragen. Weiterhin muss das Font-Object genauso lange "leben", wie das Editfeld. Also das auch mit "new" bzw. als Klassenmember des Dialogs anlegen.
Ansonsten: Gibt's bei dir auch eine Stelle, an der die mit "new" angelegten Objekte auch wieder mit "delete" aufgeräumt werden? Falls nicht, hast du jede Menge Memory Leaks.
 
Eine Methode hab ich schon angelegt in der ich das machen wollte,
die ist aber noch komplett leer!
Würde das bedeuten: Jedes mal wenn ich das Programm starte,
wird Speicherplatz belegt und beim schliessen wird dieser nicht wieder freigegeben,
so dass mein Speicher nach 1000x öffen voll ist?
Oder wie verhält sich das?

Gruß Dirk
 
Das ändern der Schrift brauche ich aus dem Grund, dass wenn man mit dem
Klassenassistenten ein CEdit erstellt die Schrift hier anders aussieht wie bei
dynamisch erstellten CEdit's !!
Hat evtl. schon jemand die Einstellungen für diese Darstellung?

Gruß
 
DJneu hat gesagt.:
Würde das bedeuten: Jedes mal wenn ich das Programm starte,
wird Speicherplatz belegt und beim schliessen wird dieser nicht wieder freigegeben,
so dass mein Speicher nach 1000x öffen voll ist?
Gruß Dirk
Genau!

Deine Font-Geschichte ist prinzipiell schon ok, was du änderen müssest habe ich ja schon geschrieben. Bei einer normalen Schrift (also ohne fett oder kursiv) kannst du allerdings auf den etwas aufwendigen Aufruf von CreateFont() verzichten und stattdessen CreatePointFont() nehmen:
C++:
CFont m_editFont; // Als Member des Dialogs deklarieren !!

m_editFont.CreatePointFont(120, "Arial"); // erzeugt eine 12pt Schrift
   :
   :
Edit->SetFont(&m_editFont) ;

Gruß
MCoder
 
Hallo zusammen,

hoffe ihr hattet schöne Ostern (auch bei dem sch.. Wetter).

Mein letztes großes Problem das ich zu Zeit hab ist!
Das ich in meinen dynamisch erzeugten Edit's die Farben nicht ändern kann!
Evtl. könnte man ein neues Thema posten, da ich aus den Foren nicht wirlkich schlau
geworden bin!
Man kann lesen, dass man die Farbe bei CEdit's nicht ändern könnte
Dann sind Hilfen für Statisch erzeugt Edit's im Netz, hilft mir aber nicht ganz!

Das hier hab ich schon versucht!!

m_Font.CreatePointFont (90, "Arial") ;

CEdit *Edit = new CEdit ;
Edit -> Create (WS_TABSTOP | ES_LEFT | WM_CTLCOLOR | WS_CHILD | WS_VISIBLE, CRect (x1, y1, x2, y2, ainText) ;
Edit -> ModifyStyleEx (0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME ) ;
Edit -> SetFont (&m_Font, TRUE ) ;
//Edit -> SetBkColor (RGB(0,255,255) ) ;
//Edit -> SendMessage (PBM_SETBKCOLOR, 0, (LPARAM) RGB (255, 255, 0))

aber nicht.....

Gruß
 
WM_CTLCOLOR ist eine Windows-Message, die kannst du nicht als Style verwenden. Aber damit bist du auf jeden Fall schon mal auf der richtigen Spur :)
Du musst im Dialog einen Handler für WM_CTLCOLOR einfügen und dort die Hintergrundfarbe setzen. Der dafür benötigte Brush muss während der Laufzeit des Edit-Controls existieren (gleiches Prinzip wie beim Font).
Hier ein kleines Beispiel:
C++:
 //im Header als Dialog-Member deklarieren
CBrush m_brush;

// in OnInitDialog() erzeugen
m_brush.CreateSolidBrush(RGB(240,240,0));

// Handler für WM_CTLCOLOR
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    if( pWnd->GetDlgCtrlID() == <ID_DES_CONTROLS> )
    {
        pDC->SetBkColor(RGB(240,240,0));
        return (HBRUSH)m_brush.GetSafeHandle();
    }

    return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
Gruß
MCoder
 
Hi,

bedeutet das, jedesmal wenn ein Control aufgerufen wird wird die Funktion
OnCtlColor aufgerufen? Hier werden jetzt die Eigenschaften des Edit's geändert und
mit anderer Farbe dargestellt

Sorry jetzt hab ich schon wieder ein Problem welches man eigentlich Posten sollte :)
Es gibt zu Timern schon einige Beiträge, ich hab da aber noch größeres Problem...
Ich komm eigentlich aus der c-Programmierung ohne OOP und hab da noch meine Probleme :) :) :)
Mal ein Beispiel:

//Dialog1:
CDialog2::InitDialog1()
{
SetTimer (0, 15, NULL) ;
}

CDialog2::ExitDialog1()
{
KillTimer (0) ;
}

CDialog1::OnTimer (UINT nIDEvent)
{
ZyklischeFunktion () ;
}

CDialog1::ZyklischeFunktion ()
{
}

//--------------------------------------------------------------

//Dialog2:
CDialog2::InitDialog2()
{
SetTimer (1, 15, NULL) ;
}

CDialog2::ExitDialog2()
{
KillTimer (1) ;
}

CDialog2::OnTimer (UINT nIDEvent)
{
ZyklischeFunktion () ;
}

CDialog2::ZyklischeFunktion ()
{
}


So nu will ich von meinem Hauptdialog, bei einem beim Klick auf eine Registerkarte
die meinen Dialog1 darstellt, den Timer von Dialog1 starten!

CDialog1 xxxxx ;
xxxxx.InitDialog1 () ;

Ich bekomme aber einen Fehler
Denke irgendwie ist da noch was nicht Initialisiert
Hat mit dem Timer was zu tun!!

:rolleyes:
 

Neue Beiträge

Zurück