000
25.10.2003, 14:13 Uhr
~Jogi76
Gast
|
--------------------------- Hallo Leute,
ich bin grad dabei VC in 21 Tagen durchzuarbeiten. Im Kapitel 7 (Schriften) komme ich aber grad echt net weiter. Und zwar bei der ersten Übungsaufgabe des Kapitels. Man soll dort:
Frage: Der Funktion CreateFont muß man eine Vielzahl von Argumenten übergeben. Kann man auch auf eine alternative Funktion zurückgreifen?
Antwort: Eine derartige Funktion gibt es, obwohl man trotzdem noch alle Informationen festlegt. Die Struktur LOGFONT enthält die gleichen Attribute, die man an die Funktion CreateFont übergibt. Man kann eine Instanz dieser Struktur deklarieren, die Attribute mit Standardwerten initialisieren und dann diese Struktur an die Funktion CreateFontIndirect übergeben. Wenn umfangreiche Schriftänderungen vorzunehmen sind, ist diese Methode zu bevorzugen, weil man dieselbe Instanz der Struktur verwenden kann und nur diejenigen Attribute modifiziert, die sich gegenüber den aktuellen Einstellungen geändert haben. Damit erstellt man dann die verschiedenartigen Schriften. Um diese alternative Lösung zum Erzeugen einer Schrift zu verwenden, deklariert man eine Instanz der Struktur LOGFONT als Element der Dialogfeldklasse und initialisiert dann alle Attribute, bevor man die Funktion SetMyFont aufruft. In der Funktion SetMyFont nehmen Sie die Modifikationen gemäß Listing 7.10 vor. Listing 7.10: Die modifizierte Funktion SetMyFont
C++: |
void CTag7Dlg::SetMyFont() { // Wurde eine Schrift ausgewählt? if (m_strFontName != "") { // Annahme, daß Schriftgröße bereits in Struktur // m_lLogFont initialisiert wurde. Damit ist nur // noch der Schriftname zu spezifizieren. _ tcscpy(m_lLogFont.lfFaceName, m_strFontName); // Zu verwendende Schrift erzeugen m_fSampFont.CreateFontIndirect(&m_lLogFont);
// Schrift für Anzeigefeld der Schriftprobe festlegen m_ctlDisplayText.SetFont(&m_fSampFont); } }
|
ok, soweit is das ja auch klar. Die Instanz habe ich wiefolgt initialisiert:
C++: |
void CTag7Dlg::OnSelchangeLfonts() { // Variablen mit Steuerelementen des Dialogfelds aktualisieren UpdateData(TRUE);
CRect rRect; // Rechteck des Anzeigebereichs int iHeight; // Höhe des Anzeigebereichs // Abmessungen des Feldes für Schriftbeispiel ermitteln m_ctlDisplayText.GetWindowRect(&rRect); // Höhe des Feldes berechnen iHeight = rRect.top - rRect.bottom; // Sicherstellen, daß Höhe positiv if (iHeight < 0) iHeight = 0 - iHeight;
if (m_strFontName != "") { m_lLogFont.lfHeight = iHeight - 5; m_lLogFont.lfWidth = 0; m_lLogFont.lfEscapement = 0; m_lLogFont.lfOrientation = 0; m_lLogFont.lfWeight = FW_NORMAL; m_lLogFont.lfItalic = 0; m_lLogFont.lfUnderline = 0; m_lLogFont.lfStrikeOut = 0; m_lLogFont.lfCharSet = DEFAULT_CHARSET; m_lLogFont.lfOutPrecision = OUT_CHARACTER_PRECIS; m_lLogFont.lfClipPrecision = CLIP_CHARACTER_PRECIS; m_lLogFont.lfQuality = DEFAULT_QUALITY; m_lLogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; } // Schrift für Beispiel festlegen SetMyFont(); }
|
doch das ganze Funzt nur 1 mal und es kommt diese Fehlermeldung:
Code: |
Microsoft Visual C++ Debug Library --------------------------- Debug Assertion Failed!
Program: F:\T1H2\C++\VC_21Tage\Tag7\Debug\Tag7.exe File: wingdi.cpp Line: 1120
For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application) --------------------------- Abbrechen Wiederholen Ignorieren ---------------------------
|
was ich nun sehr komisch finde ist das wenn ich "Ignorieren" drücke, geht alles wie gewollt !??? Ich hab keinen Plan was mir diese Fehlermeldung sagen will und wie ich denn Fehler suchen soll. Die Datei "File: wingdi.cpp" gibt es auch garnicht in dem Projekt.
Ihr könnt mir da doch bestimmt weiterhelfen.
Danke Jogi
--edit 0xdeadbeef: cpp-Tags eingefügt. Machs nächstes mal bitte selbst. Dieser Post wurde am 25.10.2003 um 15:35 Uhr von 0xdeadbeef editiert. |