Links Titel
Pixel
     
Steuerelemente - Textfelder


Hier stehen Informationen zum Umgang mit Textfelder (TextBox). Die zugehörige Klasse lautet: CStatic. Will man lediglich Text in einem Textfeld ausgeben, der während der Laufzeit nicht mehr geändert wird, braucht man diesen Text nur in den Eigenschaften des Textfelds angeben. Die vorgegebene ID IDC_STATIC braucht man in diesem Fall nicht ändern. Möchte man allerdings mit dem Textfeld während der Laufzeit arbeiten, so muss man auch die ID des Textfeldes ändern, um es ansprechen zu können.


Übersicht

  - Beschriftung während der Laufzeit ändern - SetDlgItemText()
  - Blinkende Schrift im Textfeld
  - Hyperlinks im Textfeld
  - Nachrichten für Textfelder
  - Schriftart für das Textfeld ändern - SetFont()
  - Vertikalen Text anzeigen
  - Zeilenumbruch im Textfeld

 

Beschriftung während der Laufzeit ändern - SetDlgItemText()

Mit Hilfe der Funktion SetDlgItemText() kann man den angezeigten Text eines Textfeld während der Laufzeit ändern. Die Funktion nimmt zwei Argumente entgegen. Als erstes gibt man die ID des Steuerelements an, in das geschrieben werden soll und als zweites Argument gibt man einen String an, worin der neue Text für das Textfeld steht. Genau dies wird im folgenden Beispiel demonstriert.

Beispiel:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Beschriftung und entferne alle vorhandenen Elemente
  • Füge ein Textfeld ein, ändere die ID in IDC_STATIC1 und den Titel in: Alter Text
  • Füge einen Button ein und ändere den Titel in Beschriftung ändern
  • Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen und übernehme den vorgegebenen Funktionsnamen
  • Füge folgenden Code in die eben erstellte Funktion ein:
  void CBeschriftungDlg::OnButton1()
  {
    SetDlgItemText(IDC_STATIC1, "Geänderter Text");
  }


Beschriftung von Textfeldern


Downloads: Beschriftung.exe - Gesamtes Projekt

 

Blinkende Schrift im Textfeld

Eine blinkende Schrift lässt sich leicht einfügen. Manchmal braucht man dies, z.B um einen Countdown runterzuzählen.

Beispiel:
Wir erstellen jetzt eine kleine Anwendung die nur aus einem Textfeld besteht und nichts weiter macht als zu blinken:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: BlinkText und entferne alle vorhandenen Elemente
  • Füge ein Textfeld ein, ändere die ID in IDC_STATIC1 und den Titel in: Blinkender Text im Textfeld
  • Füge eine Variable in die Dialogklasse (CBlinkTextDlg) ein - Variablentyp: BOOL, Variablenname: bMerker, Zugriffstatus: Public
  • Füge eine Member-Variable für das Textfeld ein - Kategorie: Control, Variablentyp: CStatic, Name: m_ctlStatic1
  • Füge für die Dialogklasse Nachrichtenbehandlungsroutinen (Funktionen) für die Nachrichten WM_TIMER und WM_CTLCOLOR ein
  • Füge folgenden Code in die OnInitDialog() bzw. die eben erstellten Funktionen ein:
  BOOL CBlinkTextDlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Merker initialisieren
    bMerker = 0;

    // Timer starten
    SetTimer( 1, 500, NULL); // Zeitgeber namens ID 1 starten, Zeitintervall 0,5sec

    return TRUE;
  }

  void CBlinkTextDlg::OnTimer(UINT nIDEvent)
  {
    if(bMerker == 0)
    {
      bMerker = 1;
      m_ctlStatic1.RedrawWindow();
    }
    else
    {
      bMerker = 0;
      m_ctlStatic1.RedrawWindow();
    }

    CDialog::OnTimer(nIDEvent);
  }

  HBRUSH CBlinkTextDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Attribute des Gerätekontexts hier ändern
    if(pWnd->GetDlgCtrlID() == IDC_STATIC1)
    {
      if(bMerker == 0)
      {
        // Schwarze Schrift
        pDC->SetTextColor(RGB(0, 0, 0));
      }
      else
      {
        // Rote Schrift
        pDC->SetTextColor(RGB(255, 0, 0));
      }
    }

    // TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll
    return hbr;
  }


BlinkText

Beschreibung:
In der Funktion OnInitDialog() initialisieren wir den Merker und starten den Timer. In der Funktion für den Timer zeichnen wir mittels RedrawWindow() das Textfeld neu, was die Funktion OnCtlColor() aufruft. In dieser Funktion wird dann, je nachdem was der Merker für einen Wert hat, die Textfeldfarbe verändert.


Downloads: BlinkText.exe - Gesamtes Projekt

 

Hyperlinks im Textfeld

Manchmal möchte man Links in seine Anwendung einfügen, die auf die eigene Webseite verweisen oder dem Anwender die Möglichkeit geben, dem Autor eine E-Mail zu schreiben.

Beispiel:
Im folgenden Beispiel werden wir einen Internet-Link und einen E-Mail-Link in eine Anwendung einfügen. Nachdem wir die Textfelder dafür eingefügt haben, müssen wir eine Schriftart erstellen, die den Text unterstrichen darstellt. Danach färben wir die Links blau und reagieren auf die MouseMove Nachricht, sobald einer der beiden Links mit der Maus berührt wird.
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Hyperlink und entferne alle vorhandenen Elemente. Schaue dir die untenstehende Abbildung an, um zu sehen wie die Textfelder angeordnet werden
  • Füge ein Textfeld ein und ändere den Titel in: Internet-Link
  • . Behalte die vorgegebene ID (IDC_STATIC)
  • Füge darunter noch ein Textfeld ein, ändere den Titel in einen beliebigen Link, z.B www.coding-help.de und ändere die ID in: IDC_INTERNET. In den Eigenschaften muss im Register Formate ein Haken bei Benachrichtigung gesetzt werden
  • Füge ein Textfeld ein und ändere den Titel in: Mail-Link. Behalte die vorgegebene ID (IDC_STATIC)
  • Füge darunter noch ein Textfeld ein, ändere den Titel in eine beliebige Mail-Adresse und ändere die ID in: IDC_MAIL. In den Eigenschaften muss im Register Formate ein Haken bei Benachrichtigung gesetzt werden
  • Füge eine Variable in die Dialogklasse (CHyperlinkDlg) ein - Variablentyp: CFont, Variablenname: m_Font, Zugriffstatus: Public
  • Füge für die Dialogklasse (CHyperlinkDlg) eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht WM_CTLCOLOR ein
  • Überschreibe in der Dialogklasse (CHyperlinkDlg) die Funktion: PreTranslateMessage
  • Lade dir das Hand-Icon aus dem Beispiel Hier! runter und speichere die Datei in dem res-Verzeichnis deines Projekts. Sie wird gleich benötigt, damit wir den Mauszeiger in eine Hand umwandeln können, sobald dieser sich über der Grafik befindet.
  • Importiere das heruntergeladene Icon und behalte die vorgegebenen ID (IDC_CURSOR1)
  • Füge jetzt noch für beide Textfelder je eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht ein und übernehme die vorgeschlagenen Funktionsnamen
  • Füge folgenden Code in die eben erstellten Funktion und in die OnInitDialog()-Funktion ein:
  BOOL CHyperlinkDlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Text unterstreichen
    CString Schriftart ="Ms Sans Serif";

    // Schriftart erstellen - MS Sans Serif 8pt - unterstrichen
    m_Font.CreateFont(8, 0, 0, 0, FW_NORMAL, 0, TRUE, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, Schriftart);

    // Dem Internet Link die neue Schriftart zuweisen
    CStatic *p_Static = (CStatic*)GetDlgItem(IDC_INTERNET);
    p_Static->SetFont(&m_Font);
    SetDlgItemText(IDC_INTERNET, "www.coding-help.de");

    // Dem Mail Link die neue Schriftart zuweisen
    CStatic *p_Static2=(CStatic*)GetDlgItem(IDC_MAIL);
    p_Static2->SetFont(&m_Font);
    SetDlgItemText(IDC_MAIL, "webmaster@coding-help.de");

    return TRUE;
  }

  BOOL CHyperlinkDlg::PreTranslateMessage(MSG* pMsg)
  {
    // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
    if(pMsg->message == WM_MOUSEMOVE)
    {
      // Befindet sich der Mauszeiger über den Textfelder?
      if((pMsg->hwnd==GetDlgItem(IDC_INTERNET)->m_hWnd) || (pMsg->hwnd==GetDlgItem(IDC_MAIL)->m_hWnd))
      {
        // Handle für anderen Cursor erzeugen
        HCURSOR lhCursor;

        // Anderen Cursor laden
        lhCursor = AfxGetApp()->LoadCursor(IDC_CURSOR1);

        // Bildschirmcursor setzen
        SetCursor(lhCursor);
      }
    }

    return CDialog::PreTranslateMessage(pMsg);
  }

  HBRUSH CHyperlinkDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Attribute des Gerätekontexts hier ändern
    if((pWnd->GetDlgCtrlID()==IDC_INTERNET) || (pWnd->GetDlgCtrlID()==IDC_MAIL))
    {
        // Text blau einfärben
        pDC->SetTextColor(RGB(0, 0, 200));
    }

    // TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll
    return hbr;
  }

  void CHyperlinkDlg::OnInternet()
  {
    ShellExecute(NULL, _T("open"), "http://www.coding-help.de", NULL, NULL, SW_SHOWNORMAL);
  }

  void CHyperlinkDlg::OnMail()
  {
    ShellExecute(NULL, _T("open"), "mailto:webmaster@coding-help.de", NULL, NULL, SW_SHOWNORMAL);
  }


Hyperlink

Beschreibung:
In der Funktion OnInitDialog() legen wir eine andere Schriftart für die Link-Textfelder fest. Diese unterscheidet sich von der Standardschriftart nur darin, das sie den Text unterstrichen darstellt. In der Funktion PreTranslateMessage() reagieren wir auf die MouseMove-Nachricht, die immer dann ausgelöst wird, wenn ein Steuerelement mit der Maus überfahren wird. In der Funktion OnCtlColor() färben wir die Schrift für die Links blau, damit man auch direkt erkennt das es Hyperlinks sind. In den Funktionen die wir für die Textfelder erstellt haben, wird schließlich der angegebene Link aufgerufen.


Downloads: Hyperlink.exe - Gesamtes Projekt - Hand-Icon

 

Nachrichten für Textfelder

Man kann Nachrichtenbehandlungsroutinen (Funktionen) für die verschiedene Nachrichten einfügen, z.B für die BN_CLICKED-Nachricht. Wird dann über dem Textfeld die linke Maustaste gedrückt, wird der angegebene Code ausgeführt. Man kann z.B eine Internetseite laden oder sonstigen Code ausführen. Im folgenden Beispiel werden wir das testen, indem zur Demonstration eine einfache MessageBox erscheint, sobald auf ein Textfeld geklickt wurde.

Beispiel:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen OnClick und entferne alle vorhandenen Elemente
  • Füge ein Textfeld ein, vergrössere es etwas und ändere den Titel in: Demonstrattion der BN_CLICKED-Nachricht. Ändere noch die ID in IDC_TEXT und setze ausserdem im Register Formate einen Haken bei Benachrichtigung
  • Füge für das Textfeld eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht ein und übernehme den vorgeschlagenen Funktionsnamen
  • Füge folgenden Code in die eben erstellte Funktion ein:
  void COnClickDlg::OnText()
  {
    MessageBox("Es wurde auf das Textfeld geklickt");
  }


OnClick


Downloads: OnClick.exe - Gesamtes Projekt

 

Schriftart für das Textfeld ändern - SetFont()

Will man in einem Steuerelement eine andere Schriftart als die Standardschrift nutzen, muss man die gewünschte Schriftart mit Hilfe von CreateFont() festlegen und mit der Funktion SetFont() dem Steuerelement zuweisen.

Ein Beispiel wie man die Schriftart für Steuerelemente ändert findest du hier: Schriftart für Steuerelemente ändern

 

Vertikalen Text anzeigen

Manchmal möchte man vertikalen Text darstellen, was mit einem Textfeld ganz leicht geht. Wenn man die Bezeichnung des Textfelds eingegeben hat, muss man nur nach jedem Zeichen einen Zeileinumbruch (\n) einfügen.

Beispiel:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen Vertikal und entferne alle vorhandenen Elemente
  • Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Vertikaler Text im Textfeld
  • Füge darunter noch ein Textfeld ein und vergrössere es vertikal, also nach unten. Füge diesen Titel ein: P\nr\no\nb\ne\nt\ne\nx\nt
Vertikal


Downloads: Vertikal.exe - Gesamtes Projekt

 

Zeilenumbruch im Textfeld

Das folgende Beispiel zeigt wie man ein Zeilenumbruch in ein Textfeld einfügen kann.

Beispiel:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Zeilenumbruch und entferne alle vorhandenen Elemente
  • Füge ein Textfeld ein, vergrössere es etwas und ändere den Titel in: Dieser\r\nText\r\nwird\r\numgebrochen
Zeilenumbruch

Beschreibung:
Immer wenn man ein Zeilenumbruch braucht schreibt man einfach an die gewünschte Stelle \r\n und schon wird der folgende Text in eine neue Zeile geschrieben.


Downloads: Zeilenumbruch.exe - Gesamtes Projekt

 

Die Vervielfältigung der auf diesen Seiten enthaltenen Informationen und Grafiken ist untersagt, ausgenommen davon ist sämtlicher auf diesen Seiten angezeigter Quellcode. Es wird keinerlei Gewähr für die Richtigkeit und Vollständigkeit der bereitgestellten Informationen übernommen. Haftungsansprüche für Schäden, die durch Nutzung der bereitgestellten Informationen verursacht wurden, sind ausgeschlossen. Für den Inhalt von angegebenen Verweisen wird keine Gewährleistung übernommen.
Copyright © 2005 coding-help.de