2008-09-09 25 views
7

Khi sử dụng tùy chỉnh vẽ (NM_CUSTOMDRAW) để vẽ toàn bộ nội dung của một ListView SubItem (trong dạng xem báo cáo/chi tiết), nó sẽ là tốt đẹp để có thể áp dụng cùng một bên trái và bên phải đệm trong phương pháp sơn tùy chỉnh của tôi được áp dụng bởi chính điều khiển cho các mục không được vẽ tùy chỉnh.Win32 List-View Control SubItem padding cho các SubItems được vẽ tùy chỉnh?

Có cách nào để truy lục giá trị đệm này theo chương trình không? Có phải là có liên quan đến chiều rộng của một ký tự cụ thể ("" hoặc "w" hay gì đó không?) Hoặc là giá trị cố định (6px bên trái và 3px ở bên phải hoặc cái gì đó) hoặc ...?

EDIT: Để làm rõ, Tôi muốn thêm cùng một phần đệm vào các mục con NM_CUSTOMDRAWn của mình mà điều khiển thêm vào các mục mà nó vẽ và chỉ số mà tôi đang tìm kiếm, chẳng hạn, là khoảng trắng giữa đầu của cột thứ 2 và chữ "Xiêm" trong hình bên dưới (Lưu ý: ảnh chụp màn hình từ MSDN thêm để giúp giải thích câu hỏi của tôi):

List View in Report View

Lưu ý rằng chữ "Xiêm" là liên kết với mục tiêu đề ("Breed"). Tôi muốn có thể đảm bảo sự liên kết tương tự cho các mục được vẽ tùy chỉnh.

+0

Bạn đã bao giờ tìm thấy câu trả lời chưa - Tôi đang gặp phải vấn đề tương tự. –

Trả lời

0

Tôi giả định rằng GetSystemMetrics() là bạn cần xem xét. Tôi nghĩ rằng SM_CXEDGESM_CYEDGE có lẽ là giá trị bạn muốn, nhưng không báo giá cho tôi về điều đó. ;-)

+0

SM_CXEDGE và SM_CYEDGE là chiều rộng đường viền cửa sổ. Tôi đang tìm các padding hàng đầu nội bộ và trailing trong mỗi tế bào bảng trong một điều khiển ListView đó là trong chế độ "Xem Báo cáo". Hay tôi đang thiếu một cái gì đó? –

0

Chỉ có thể đoán mà không thấy kết quả của bạn.

Một vài gợi ý: Nếu bạn đang sử dụng hàm DrawTextEx, bạn đã thử nghiệm với DT_INTERNAL et al chưa?

Bạn có vô tình đưa vào một hình ảnh/biểu tượng trống không.

Trông có ổn ở chế độ màn hình cổ điển không? Nếu vậy tôi sẽ xem xét các chức năng của XP Theme để xem có điều gì đó đang xảy ra không.

Cuối chỉnh sửa sau khi nhận xét đầu tiên:

Tôi tự hỏi nếu kích thước của hình chữ nhật phù hợp với không gian cần thiết cho việc LVN_ENDLABELEDIT hộp soạn thảo xung quanh các văn bản để văn bản không di chuyển (hoặc cho một hình chữ nhật tập trung)?

Tôi đoán bạn có thể so sánh kết quả của LVM_GETITEMRECT với LVIR_LABEL trên cột đầu tiên và sử dụng sự khác biệt làm đường viền trái của bạn.

+0

Nếu bạn tùy chỉnh vẽ một Subitem List-View (NM_CUSTOMDRAW), bạn sẽ nhận được một cấu trúc NMLVCUSTOMDRAW chứa một DC và bounding rect là toàn bộ ô "table cell" từ sàn đến trần và tường thành tường. Tôi muốn biết padding để áp dụng trong phương thức vẽ tùy chỉnh của mình vì vậy nội dung của tôi là –

+0

Tôi đã sử dụng NM_CUSTOMDRAW, nhưng chỉ thay đổi màu nền của các ô riêng lẻ (CDDS_ITEMPREPAINT) và để nó rơi vào LVN_GETDISPINFO trên proc chính. –

1

ListView_GetSubItemRect (LVM_GETSUBITEMTECT)

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

Mặc dù những gì các tài liệu nói tôi nghi ngờ LVIR_LABEL trả về chỉ trở về hình chữ nhật giới hạn của văn bản mục, theo ListView_GetItemRect.

(Điều này chỉ tiếp tục cười khúc khích tôi như thể tôi đã thực sự thấy câu trả lời ở đâu đó khi chơi với NM_CUSTOMDRAW).

Chỉnh sửa sau khi nhận xét 2:

Tôi tưởng tượng bạn đã thấy NMLVCUSTOMDRAW nếu bạn sẵn sàng sử dụng Phiên bản 6.0. có rcText. Tôi sẽ không kể từ khi tôi sử dụng Win2K.

Với những gì bạn đã tìm thấy, tôi sẽ quay lại đề xuất sử dụng ListView_GetItemRect để nhận LVIR_LABEL và so sánh với LVIR_BOUNDS và sử dụng sự khác biệt.

+0

Thật không may là không. Thật dễ dàng để thử, và giá trị trả về bởi LVIR_BOUNDS và LVIR_LABEL giống hệt nhau: cả hai đều trả về toàn bộ tiểu mục, tường thành tường. –

+0

Vì vậy, tài liệu là chính xác, mà làm cho nó có vẻ như Win32 là do lỗi. Thật là một nỗi đau. –

2

sử dụng nhắn ListView Tiêu đề HDM_GETBITMAPMARGIN thấy link text

1

đường để làm điều này là lấy định dạng của cột tương ứng với ListView_GetColumn() sau đó kiểm tra myLVCOLUMN.mask lấy

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

sau đó khi chúng tôi vẽ nhãn tương ứng thuộc về cột đó

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);