Listview ownerdraw的问题

jieleiping 2010-03-31 05:03:42
各位高手,小弟在学习自绘listview时遇到了下面的问题

listview自绘时,如果设置了LVS_EX_FULLROWSELECT属性,那么listview第一行的最上面会多出几个像素,没有设置的话,显示是正确的.


WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_OWNERDATA|LVS_OWNERDRAWFIXED|WS_BORDER|LVS_ALIGNTOP

ListView_SetExtendedListViewStyle(g_hListView, ListView_GetExtendedListViewStyle(g_hListView) | LVS_EX_FULLROWSELECT);
...全文
267 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
大白菜小萝卜 2011-10-04
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
中才德创 2010-04-05
  • 打赏
  • 举报
回复
学习自绘
jieleiping 2010-04-02
  • 打赏
  • 举报
回复
呵呵,大家见谅啊,up
zxdyu2009 2010-04-02
  • 打赏
  • 举报
回复
ListCtrl的自绘应该很多吧,可以参考vckbase里的
http://www.vckbase.com/document/viewdoc/?id=891
liyelun 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sullensun 的回复:]
引用 9 楼 jieleiping 的回复:

UP
每天回帖即可获得10分可用分

来了。。
[/Quote]
我也来了,虽然晚了,呵呵
jieleiping 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jieleiping 的回复:]
引用 10 楼 xianglitian 的回复:
引用楼主 jieleiping 的回复:
listview自绘时,如果设置了LVS_EX_FULLROWSELECT属性,那么listview第一行的最上面会多出几个像素,没有设置的话,显示是正确的.


你不都说了么,不设LVS_EX_FULLROWSELECT就能解决
你都已经自绘了
就通过自己的方式实现LVS_EX_FULLRO……
[/Quote]

我用danspy看了,QQ Music的确实是listview,不是自己画的~~
SullenSun 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jieleiping 的回复:]

UP
每天回帖即可获得10分可用分
[/Quote]
来了。。
qinhualuo 2010-04-01
  • 打赏
  • 举报
回复
好多分啊!
向立天 2010-04-01
  • 打赏
  • 举报
回复
我就是说你可以自己实现LVS_EX_FULLROWSELECT
不用ListCtrl提供的功能
你用spy++看看QQ Music不是ListCtrl
它用的是DitectUI也就是完全自绘
jieleiping 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xianglitian 的回复:]
引用楼主 jieleiping 的回复:
listview自绘时,如果设置了LVS_EX_FULLROWSELECT属性,那么listview第一行的最上面会多出几个像素,没有设置的话,显示是正确的.


你不都说了么,不设LVS_EX_FULLROWSELECT就能解决
你都已经自绘了
就通过自己的方式实现LVS_EX_FULLROWSELECT就好了
[/Quote]
谢谢回复,但是现在的问题是我需要设置LVS_EX_FULLROWSELECT, 为什么QQ Music做到了呢?
向立天 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 jieleiping 的回复:]
listview自绘时,如果设置了LVS_EX_FULLROWSELECT属性,那么listview第一行的最上面会多出几个像素,没有设置的话,显示是正确的.
[/Quote]

你不都说了么,不设LVS_EX_FULLROWSELECT就能解决
你都已经自绘了
就通过自己的方式实现LVS_EX_FULLROWSELECT就好了
jieleiping 2010-04-01
  • 打赏
  • 举报
回复
UP
每天回帖即可获得10分可用分
jieleiping 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 psbeond 的回复:]
这个是没办法控制的, 并且这几个像素在xp, vista, win7下面还有可能是不相等的,所以你不能在某一个操作系统下得到高度后就认为它是固定的, 甚至在同一个操作系统下, 切换不同的桌面主题,这几个像至少的高度也是不同的。
你可以先插入一个元素,能过得到这个元素的位置,再减去header的高度来得到这个空白区域的像素。然后再删除刚才插入的元素。
[/Quote]
感谢回复,但是我发觉QQ Music的播放列表是解决了这个问题的,但是迅雷啊,酷我音乐盒啊这些都没有解决,请问有什么好的解决方案么?
psbeond 2010-03-31
  • 打赏
  • 举报
回复
这个是没办法控制的, 并且这几个像素在xp, vista, win7下面还有可能是不相等的,所以你不能在某一个操作系统下得到高度后就认为它是固定的, 甚至在同一个操作系统下, 切换不同的桌面主题,这几个像至少的高度也是不同的。
你可以先插入一个元素,能过得到这个元素的位置,再减去header的高度来得到这个空白区域的像素。然后再删除刚才插入的元素。
hrjhrj12345 2010-03-31
  • 打赏
  • 举报
回复
200分,真多。
帮不上忙,只能帮UP了,哈
jieleiping 2010-03-31
  • 打赏
  • 举报
回复
DRAWITEMSTRUCT Structure

typedef struct tagDRAWITEMSTRUCT {
UINT CtlType;
UINT CtlID;
UINT itemID;
UINT itemAction;
UINT itemState;
HWND hwndItem;
HDC hDC;
RECT rcItem;
ULONG_PTR itemData;
} DRAWITEMSTRUCT;

如果设置了LVS_EX_FULLROWSELECT属性,index为0的行, rcItem 的top值不是从0开始.
aa3000 2010-03-31
  • 打赏
  • 举报
回复
什么叫多出几行象素
jieleiping 2010-03-31
  • 打赏
  • 举报
回复

case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT lpdis;
lpdis = (LPDRAWITEMSTRUCT)lParam;
TCHAR szDrawText[MAX_PATH];
SecureZeroMemory(szDrawText, sizeof(szDrawText));
wsprintf(szDrawText, L"%d: Ownerdraw ListView", lpdis->itemID);
OwnerDraw(lpdis, hdc, hWnd, szDrawText);
}
break;

void OwnerDraw(LPDRAWITEMSTRUCT lpdis, HDC hdc, HWND hWnd,TCHAR* szDraw)
{
RECT rect;
GetClientRect(hWnd, &rect);
lpdis->rcItem.left = rect.left;
lpdis->rcItem.right = rect.right;
int iTaskIndex;
if (lpdis->CtlType == ODT_LISTVIEW)
{
LPCTSTR lpszText = (LPCTSTR) lpdis->itemData;

hdc = lpdis->hDC;
HBRUSH hbrBkColor = CreateSolidBrush (RGB(255,255,255));
HBRUSH hbrSEL = CreateSolidBrush (RGB(155,197,255));

if ((lpdis->itemAction | ODA_SELECT) && (lpdis->itemState & ODS_SELECTED))
{
SetTextColor(hdc, RGB(0,255,0));
SetTextColor(hMemDC, RGB(0,255,0));
FillRect(hdc, &lpdis->rcItem,hbrSEL);
FillRect(hMemDC, &lpdis->rcItem,hbrSEL);
}
else
{
SetTextColor(hdc, RGB(0,0,255));
SetTextColor(hMemDC, RGB(0,0,255));
FillRect(hdc, &lpdis->rcItem,hbrBkColor);
FillRect(hMemDC, &lpdis->rcItem,hbrBkColor);
}

DeleteObject (hbrSEL);
DeleteObject (hbrBkColor);

lpdis->rcItem.top+=10;
DrawText(hdc, szDraw, lstrlen(szDraw), &lpdis->rcItem, DT_LEFT|DT_SINGLELINE|DT_TOP);
DrawText(hMemDC, szDraw, lstrlen(szDraw), &lpdis->rcItem, DT_LEFT|DT_SINGLELINE|DT_TOP);
}
}
fandh 2010-03-31
  • 打赏
  • 举报
回复
你贴出自绘部分的代码!
jieleiping 2010-03-31
  • 打赏
  • 举报
回复
如果有需要,小弟可以提供现在的demo代码. QQ:914181182

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧