Winapi 子级的CDDS\U ITEMPREPAINT GetItem返回false
我正在读CDDS_itemprespaint中子项的tv.pszText,但每次运行此代码时它都返回垃圾值。但对于父节点,它工作得很好Winapi 子级的CDDS\U ITEMPREPAINT GetItem返回false,winapi,custom-draw,Winapi,Custom Draw,我正在读CDDS_itemprespaint中子项的tv.pszText,但每次运行此代码时它都返回垃圾值。但对于父节点,它工作得很好 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { char achBuf[100]; case WM_NOTIFY: { LPNMTREEVIEW pnm = (LPNMTREEVIEW)lPara
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char achBuf[100];
case WM_NOTIFY:
{
LPNMTREEVIEW pnm = (LPNMTREEVIEW)lParam;
if (pnm->hdr.code == NM_CUSTOMDRAW)
{
LPNMTVCUSTOMDRAW lplvcd = (LPNMTVCUSTOMDRAW)lParam;
switch (lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT :
return CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
hwndTree = GetDlgItem(hWnd,ID_TREEVIEW);
if(lplvcd->iLevel==0)
{
lplvcd->clrText = RGB(0, 255,0);
ZeroMemory(&tv, sizeof(TVITEM));
tv.hItem=(HTREEITEM)lplvcd->nmcd.dwItemSpec;
tv.mask=TVIF_TEXT|TVIF_HANDLE;
tv.cchTextMax=100;
tv.pszText=(LPWSTR)achBuf;
if(TreeView_GetItem(hwndTree,&tv))
{
achBuf;
}
}
if(lplvcd->iLevel==1)
{
ZeroMemory(&tv, sizeof(TVITEM));
tv.hItem=(HTREEITEM)lplvcd->nmcd.dwItemSpec;
tv.mask=TVIF_TEXT|TVIF_HANDLE;
tv.cchTextMax=100;
tv.pszText=(LPWSTR)achBuf;
if(TreeView_GetItem(hwndTree,&tv))
{
achBuf;
}
}
}
}
}
它的ruuning fine对于级别==0(它是父节点)很好,但是对于级别==1(它是子节点)它将获取垃圾值。谢谢你的帮助 我们不知道什么是achBuf。或者为什么它需要一个明确的演员阵容。我们也不知道,
dwItemSpec
是否真的拥有一个HTREEITEM
@IInspectable你所说的“dwItemSpec真的拥有一个HTREEITEM”是什么意思?它是否包含除树项目之外的任何其他信息?正如我在上面提到的,对于父节点和achbuf is char array来说,它工作得很好,已经为您编辑了代码。我在achBuf中得到了非常奇怪的字符和符号,那么为什么achBuf
不是wchar\t
数组?achBuf
是char[]
。显然,您正在进行Unicode构建,因为您必须将其强制转换为LPWSTR
。所以像你应该的那样使用wchar\u t[]
。