2008-09-09 82 views
7

使用自定義繪製(NM_CUSTOMDRAW)繪製ListView子項目的全部內容(在Report/Details視圖中)時,最好能夠在我的自定義繪製方法中應用相同的左側和右側填充由控件本身應用於非自定義繪製的項目。自定義繪製的子項的Win32 List-View控件子項填充?

有沒有辦法以編程方式檢索此填充值?它是 與特定字符(「」或「w」或其他?)的寬度有關或 是固定值(左側是6px,右側是3px還是...)?

編輯:爲了澄清,我想同樣的填充添加到我的NM_CUSTOMDRAWn子項目,控制添加到它繪製項目,我正在尋找,度量例如是之間的空白第二列的開始,在下面的截圖單詞「連體」(注:從MSDN截圖加入到幫忙解釋一下我的問題):

List View in Report View

注意單詞「連體」對齊與標題項目(「品種」)。我希望能夠保證自定義繪製物品的相同路線。

+0

你有沒有找到答案 - 我遇到了同樣的問題。 – 2009-12-02 03:19:17

回答

0

我會假設GetSystemMetrics()是你需要看看。我認爲SM_CXEDGESM_CYEDGE可能是你想要的值,但不要在此引用我。 ;-)

+0

SM_CXEDGE和SM_CYEDGE是窗口邊框寬度。我在ListView控件的「報表視圖」模式下查找每個表格單元格中的內部前導和後綴填充。或者我錯過了什麼? – 2008-09-10 01:28:56

0

只能猜測不看你的輸出。

一些建議:如果您正在使用DrawTextEx函數,您是否嘗試過使用DT_INTERNAL等?

你是不小心把一個空白的圖像/圖標。

它在經典屏幕模式下看起來不錯嗎?如果是這樣,我會看XP主題功能,看看是否有一些事情正在進行。第一個註釋後

後期編輯:

不知矩形的大小,使文本不動(或焦點矩形)周圍的文本所需LVN_ENDLABELEDIT編輯框的空間相匹配?

我想你可以比較LVM_GETITEMRECT的結果與第一列的LVIR_LABEL,並將差異作爲左邊界。

+0

如果您自定義繪製列表視圖子項(NM_CUSTOMDRAW),則會​​得到一個NMLVCUSTOMDRAW結構,其中包含DC和邊界矩形,即從地板到天花板和牆到牆的整個「表格單元格」空間。我想知道在我的自定義繪製方法中應用了哪些填充,所以我的內容是 – 2008-09-11 05:02:36

+0

我已經使用了NM_CUSTOMDRAW,但僅用於更改單個單元格的背景顏色(CDDS_ITEMPREPAINT),並讓它在主proc上通過LVN_GETDISPINFO。 – 2008-09-11 05:47:57

1

ListView_GetSubItemRect(LVM_GETSUBITEMTECT)

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

儘管什麼文件說,我懷疑LVIR_LABEL只返回返回項文本的邊框,按ListView_GetItemRect。

(雖然我在使用NM_CUSTOMDRAW時實際上已經看到了某個地方的答案,但這只是讓我不停地傻笑)。

編輯後註釋2:

我想你已經看到NMLVCUSTOMDRAW如果你願意用6.0版本哪個。有rcText。我不會因爲我使用Win2K。

鑑於你已經找到了我會回到使用 ListView_GetItemRect獲得LVIR_LABEL並與LVIR_BOUNDS比較並使用差異的建議。

2

使用的ListView標題訊息HDM_GETBITMAPMARGIN 看到link text

1

的方式這樣做,這是檢索相應列的格式與 ListView_GetColumn() 然後檢查所檢索的myLVCOLUMN.mask

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

然後當我們繪製屬於該列的相應標籤時

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); 
相關問題