2008-09-09 20 views
7

Wenn Sie mit custom-draw (NM_CUSTOMDRAW) den gesamten Inhalt eines ListView-Unterelements (in der Bericht-/Detailansicht) zeichnen, wäre es schön, das gleiche Padding links und rechts in meiner benutzerdefinierten Paint-Methode anwenden zu können wird vom Steuerelement selbst für nicht benutzerdefinierte Elemente angewendet.Win32 List-View-Steuerelement SubItem-Auffüllung für benutzerdefinierte SubItems?

Gibt es eine Möglichkeit, diesen Füllwert programmgesteuert abzurufen? Ist es bezogen auf die Breite eines bestimmten Zeichens ("" oder "w" oder etwas?) Oder ist es ein fester Wert (6px links und 3px rechts oder so) oder ...?

EDIT: Um zu klären, Ich möchte die gleiche Polsterung meiner NM_CUSTOMDRAWn SubItems hinzufügen, dass die Steuerung auf Elemente hinzufügt, die es zieht, und die Metrik, die ich suche, zum Beispiel, ist der weiße Raum zwischen der Beginn der zweiten Säule und das Wort „Siamese“ im folgenden Screenshot (Hinweis: Screenshot von MSDN hinzugefügt meine Frage zu helfen, zu erklären):

List View in Report View

Beachten Sie, dass das Wort „Siamese“ ausgerichtet ist, mit dem Header-Element ("Rasse"). Ich möchte die gleiche Ausrichtung für Sonderanfertigungen garantieren können.

+0

Haben Sie jemals die Antwort gefunden - ich habe das gleiche Problem. –

Antwort

0

Ich würde davon ausgehen, dass GetSystemMetrics() ist, dass Sie suchen müssen. Ich denke, dass SM_CXEDGE und SM_CYEDGE sind wahrscheinlich die Werte, die Sie wollen, aber zitieren Sie mich nicht darauf. ;-)

+0

SM_CXEDGE und SM_CYEDGE sind die Fensterrahmenbreiten. Ich suche nach dem internen führenden und abschließenden Padding in jeder Tabellenzelle in einem ListView-Steuerelement, das sich im Modus "Berichtsansicht" befindet. Oder fehlt mir etwas? –

0

Kann nur raten, ohne Ihre Ausgabe zu sehen.

Ein paar Vorschläge: Haben Sie mit DT_INTERNAL und anderen experimentiert, wenn Sie die DrawTextEx-Funktion verwenden?

Sie fügen versehentlich ein leeres Bild/Symbol ein.

Sieht es im klassischen Bildschirmmodus gut aus? Wenn ja, würde ich die XP-Theme-Funktionen betrachten, um zu sehen, ob etwas passiert.

Später bearbeitet nach dem ersten Kommentar:

ich, wenn die Größe des Rechtecks ​​fragen, den Raum für das LVN_ENDLABELEDIT Bearbeitungsfeld um den Text erforderlich entspricht damit der Text bewegt sich nicht (oder für ein Fokus-Rechteck)?

Ich denke, Sie könnten das Ergebnis von LVM_GETITEMRECT mit LVIR_LABEL in der ersten Spalte vergleichen und die Differenz als Ihre linke Grenze verwenden.

+0

Wenn Sie einen List-View-Unterpunkt (NM_CUSTOMDRAW) benutzerdefiniert zeichnen, erhalten Sie eine NMLVCUSTOMDRAW-Struktur mit einem DC und einem Bounding-Rect, der den gesamten "Tabellenzellen" -Raum vom Boden bis zur Decke und von Wand zu Wand darstellt. Ich möchte wissen, welche Padding in meiner benutzerdefinierten Zeichenmethode, so dass meine Inhalte ein –

+0

Ich habe NM_CUSTOMDRAW verwendet, aber nur die Hintergrundfarben einzelner Zellen (CDDS_ITEMPREPAINT) ändern, und lassen Sie es durch LVN_GETDISPINFO auf der Haupt-Proc. –

1

ListView_GetSubItemRect (LVM_GETSUBITEMTECT)

http://msdn.microsoft.com/en-us/library/ms930172.aspx

Trotz allem, was die Dokumentation sagt, ich vermute LVIR_LABEL gibt nur die Erträge der Begrenzungsrechteck des Elements Text, wie pro ListView_GetItemRect.

(Das nervte mich immer, obwohl ich irgendwo eine Antwort irgendwo gesehen hatte, wenn ich mit NM_CUSTOMDRAW spielte).

bearbeiten Nach Bemerkung 2:

ich denke, Sie NMLVCUSTOMDRAW gesehen haben, die, wenn Sie bereit sind, verwenden Version 6.0. hat rcText. Ich würde nicht, seit ich Win2K benutze.

Gegeben, was Sie gefunden haben, würde ich zurück zum Vorschlag gehen, ListView_GetItemRect zu verwenden, um LVIR_LABEL zu erhalten und dieses mit LVIR_BOUNDS zu vergleichen und den Unterschied zu verwenden.

+0

Leider nicht. Es war einfach zu versuchen, und der von LVIR_BOUNDS und LVIR_LABEL zurückgegebene Wert ist identisch: Sie geben beide den gesamten Unterpunkt von Wand zu Wand zurück. –

+0

Also ist die Dokumentation korrekt, was den Eindruck erweckt, Win32 sei fehlerhaft. Was für ein Schmerz. –

2

Verwendung Listview-Header-Nachricht HDM_GETBITMAPMARGIN siehe link text

1

die Art und Weise, dies zu tun ist, um das Format der entsprechenden Spalte mit ListView_GetColumn Abrufen() dann überprüfen Sie die abgerufenen myLVCOLUMN.mask

LVCOLUMN myLVCOLUMN; 
myLVCOLUMN.mask=LVCF_FMT; 
ListView_GetColumn(hwnd,nCol,&myLVCOLUMN); 

dann wenn wir das entsprechende Etikett zeichnen, das zu dieser Spalte gehört

if(myLVCOLUMN.fmt & LVCFMT_CENTER) 
    DrawText(x,x,x,x, DT_CENTER | DT_WORD_ELLIPSIS); 
else if (myLVCOLUMN.fmt & LVCFMT_RIGHT) 
    DrawText(x,x,x,x, DT_RIGHT | DT_WORD_ELLIPSIS); 
else 
    DrawText(x,x,x,x, DT_LEFT | DT_WORD_ELLIPSIS);