1

我正在使用 NM_CUSTOMDRAW 在某些条件下更改树视图项及其子项的颜色。我想单独控制子项,但 dwDrawStage 从来没有遇到这种情况 CDDS_ITEMPREPAINT| CDDS_SUBITEM 我的代码片段在这里:

 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
  int wmId, wmEvent;
  PAINTSTRUCT ps;
  HDC hdc;
  int j;
  HWND hwndTree;
  TVITEM tv;
  TVHITTESTINFO hti;
  char achBuf[100];
  switch (message)
  {
  case WM_CREATE:
 RECT rcClient;  // dimensions of client area 
  // handle to tree-view control 

// Ensure that the common control DLL is loaded. 
InitCommonControls(); 

// Get the dimensions of the parent window's client area, and create 
// the tree-view control. 
GetClientRect(hWnd, &rcClient); 
hwndTV = CreateWindowEx(0,
                        WC_TREEVIEW,
                        TEXT("Tree View"),
                        WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES, 
                        0, 
                        0, 
                        rcClient.right, 
                        rcClient.bottom,
                        hWnd, 
                        (HMENU)ID_TREEVIEW, 
                        hInst, 
                        NULL); 



// Initialize the image list, and add items to the control. 
// InitTreeViewImageLists and InitTreeViewItems are application- 
// defined functions, shown later. 
if (!InitTreeViewItems(hwndTV))
{ 
    DestroyWindow(hwndTV); 
    return FALSE; 
} 
        break;
case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
        break;
    case IDM_EXIT:
        DestroyWindow(hWnd);
        break;
    case IDC_MAIN_BUTTON:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
        //TreeView_EnsureVisible(hwndTV,hti);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    EndPaint(hWnd, &ps);
    break;
   case WM_NOTIFY:
    {
        LPNMTREEVIEW pnm = (LPNMTREEVIEW)lParam;

        if (pnm->hdr.code == NM_CUSTOMDRAW)
        {
            //LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
            //TreeView_GetItem(
            //pnm->iItem
            LPNMTVCUSTOMDRAW lplvcd = (LPNMTVCUSTOMDRAW)lParam;
            //pnm->iItem
                //TreeView_GetItem(hWnd,pnm->iItem);
            switch (lplvcd->nmcd.dwDrawStage)
            {
                case CDDS_PREPAINT :
                    return CDRF_NOTIFYITEMDRAW;
                    break;
                case CDDS_ITEMPREPAINT:

                            if(found_unMatched(lplvcd->nmcd.lItemlParam))
                                {
                                    hwndTree = GetDlgItem(hWnd,ID_TREEVIEW);
                                    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;
                                    }
                                hChild =(HTREEITEM)TreeView_GetChild(hwndTree,(HTREEITEM)lplvcd->nmcd.dwItemSpec);
                                hSibling=(HTREEITEM)TreeView_GetNextSibling(hwndTree,hChild);

                                }



                        return CDRF_NOTIFYSUBITEMDRAW;
                        break;

                         case CDDS_POSTPAINT:

                        return CDRF_DODEFAULT;
                        break;
                   case  CDDS_ITEMPOSTPAINT| CDDS_SUBITEM :
                                 hwndTree = GetDlgItem(hWnd,ID_TREEVIEW);
                                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((HTREEITEM)lplvcd->nmcd.dwItemSpec==hSibling)
                                {
                                    lplvcd->clrText = RGB(176, 0,0);
                                }
                    return CDRF_NEWFONT;  
                    break;
                   case CDDS_ITEMPOSTPAINT:
                       double_click=1;
                    break;
            }
        }}break;
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;

}

这将为我的父节点着色,但子节点(子项)保持默认(黑色)并返回 CDRF_NOTIFYSUBITEMDRAW 不起作用。请帮忙!!!

4

0 回答 0