Die Aufrufe von GetLogPen()
und GetExtLogPen()
schlagen beide fehl. Sie kehren Null ...Warum schlägt GetLogPen mit einem benutzerdefinierten Stift fehl?
CBrush Brush;
Brush.CreateSolidBrush(COLOR_MINORSELECTION);
Brush.GetLogBrush(&lBrush);
DWORD Style[] = { 3, 1 };
CPen CustomPen;
CustomPen.CreatePen(PS_USERSTYLE, 1, &lBrush, 2, Style);
CPen *pOldPen = pDC->SelectObject(&CustomPen);
LOGPEN LogPen;
if(CustomPen->GetLogPen(&LogPen) == 0)
{
EXTLOGPEN ExtLogPen;
if(CustomPen->GetExtLogPen(&ExtLogPen) == 0)
return;
}
Der Ausfall wegen der PS_USERSTYLE
zu sein scheint für den Stift Stil verwendet wird. Wenn ich dies mit einem PS_SOLID
Stift mache, bekomme ich die LogPen
Struktur ausgefüllt, wie ich es erwarte.
Irgendwelche Gedanken?
Dieser Vorschlag erinnert mich an Datenstrukturen, die einen Größenwert als ersten Eintrag haben. Ich habe das versucht, hatte aber kein Glück. Ich habe es auch mit einem einzigen Wert für das Style-Array versucht und es hat funktioniert! Anscheinend haben die MS-Programmierer, die den Code dafür geschrieben haben, entschieden, dass niemand die Funktion benötigt, um zu funktionieren, wenn sie einen komplizierteren Strich/Lücke-Stil für ihre Zeilen haben. –
'GetExtLogPen' ruft vermutlich [GetObject] (https://msdn.microsoft.com/en-us/library/dd144904) auf. 'GetObject' gibt die Anzahl der Bytes zurück, die in den Rückgabepuffer kopiert wurden. Dieser Wert teilt Ihnen implizit die Anzahl der verwendeten Werte mit. @DavidRector: Dies ist ein sehr häufiges Muster, das in Strukturen variabler Größe verwendet wird. Das abschließende Array mit einer Größe ist erforderlich, damit der Compiler die korrekte Ausrichtung erzeugt. Dies löst ein anderes Problem als das, worüber Sie gesprochen haben; Strukturen, die ein explizites Größenfeld als ihren ersten Eintrag tragen, sind nützlich, um die Versionierung zu implementieren. – IInspectable
@Intspectable, ich kenne das Strukturmuster mit variabler Größe aus älterem Windows-Code, das ich geschrieben habe.'GetExtLogPen' akzeptiert keinen Wert für die Strukturgröße und kann daher nur Daten zurückgeben, wenn es im Stil-Array null oder einen Eintrag gibt. Ich erkenne jetzt, dass ich 'GetObject' selbst aufrufen kann und ich vermute, dass es wie gewünscht funktioniert. Wenn Sie den 'GetObject'-Vorschlag als Antwort veröffentlichen, werde ich es versuchen und dann als Antwort markieren, da es offensichtlich ist, dass' GetExtLogPen' nicht mehr als ein Stilelement in der Struktur verarbeiten kann. –