资源树节点会出现虚线框的问题

窗前旧时光 2013-02-19 10:20:30
我creat的时候 添加了TVS_TRACKSELECT风格
我发现在XP或者按住ctrl再选中节点时,节点除了会显示背景的那个矩形,在矩形的边界还会有有一个虚线框,求去除这框或者改变这虚线框颜色的方法
ps:我在OnNMCustomdraw中重绘过树节点的字体和背景色
...全文
273 21 点赞 打赏 收藏 举报
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
schlafenhamster 2013-02-20
“按下键盘上任意的建 那个框就会出现” “没有处理WM_KEY ” ??? “CDIS_SELECTED中 但是不知道哪个属性表示虚线框” 有 focus 就是 selected 就有 虚线框 return CDRF_SKIPDEFAULT; 应该不画 虚线框 了 你 自己 画 虚线框 试试。
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-20
引用 20 楼 schlafenhamster 的回复:
“按下键盘上任意的建 那个框就会出现” “没有处理WM_KEY ” ??? “CDIS_SELECTED中 但是不知道哪个属性表示虚线框” 有 focus 就是 selected 就有 虚线框 return CDRF_SKIPDEFAULT; 应该不画 虚线框 了 你 自己 画 虚线框 试试。
我查了CSDN里面也是说return CDRF_SKIPDEFAULT之后系统就不会再去绘画了 可是我这边操作还是没有效果 ,我用其他办法规避好了 十分感谢你的帮助~
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-19
引用 1 楼 sha_jinhao 的回复:
把TVS_TRACKSELECT 风格去掉 没解决?
去掉TVS_TRACKSELECT的确可以解决这个问题 但是因为一些原因 不能去掉TVS_TRACKSELECT风格
  • 打赏
  • 举报
回复
jimette 2013-02-19
把TVS_TRACKSELECT 风格去掉 没解决?
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-19
引用 18 楼 schlafenhamster 的回复:
“只要按下键盘上任意的建” 你处理了 WM_KEY ?
没有处理WM_KEY 这也正是我好奇的地方 打日志发现问题应该是在CDIS_SELECTED中 但是不知道哪个属性表示虚线框....
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-19
“只要按下键盘上任意的建” 你处理了 WM_KEY ?
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-19
引用 15 楼 schlafenhamster 的回复:
“想要去掉selected item的虚线框”? 你的 代码里 绘制 完了没有 ? 绘制 完了 就 : return CDRF_SKIPDEFAULT
还是会出现那个框 我现在发现 只要按下键盘上任意的建 那个框就会出现 如果不按就不会出现
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-19
参考: if(lpnmh->code==NM_CUSTOMDRAW) {// LPNMTVCUSTOMDRAW pDraw=(LPNMTVCUSTOMDRAW)lParam; DWORD dwDrawStage=pDraw->nmcd.dwDrawStage; UINT uItemState =pDraw->nmcd.uItemState; HDC hdc=pDraw->nmcd.hdc; RECT rc; HTREEITEM hItem=(HTREEITEM) pDraw->nmcd.dwItemSpec; TreeView_GetItemRect(m_hTreeView,hItem,&rc,TRUE); HBRUSH brsh=0; char txt[260]; TVITEM tvi;//CDIS_HOT)) if((dwDrawStage & CDDS_ITEM) && (uItemState & CDIS_SELECTED)) {// brsh=CreateSolidBrush(RGB(255,0,0));//red FillRect(hdc,&rc,brsh); DeleteObject(brsh); //set colors SetTextColor(hdc,RGB(255,255,255));//white SetBkColor(hdc,RGB(255,0,0)); // memset(txt,0,sizeof(txt)); tvi.mask= TVIF_HANDLE | TVIF_TEXT; tvi.hItem=hItem; tvi.pszText=txt; tvi.cchTextMax=sizeof(txt); TreeView_GetItem(m_hTreeView,&tvi); TextOut(hdc,rc.left+2,rc.top+2,txt,strlen(txt));//not sizeof(txt) ! // //OutputDebugString(txt); //OutputDebugString("\n");//CDRF_NOTIFYITEMDRAW | return CDRF_SKIPDEFAULT; } else {// without these ,1st blue ! SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT)); SetBkColor(hdc,GetSysColor(COLOR_WINDOW)); // return CDRF_NOTIFYITEMDRAW; } }
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-19
“想要去掉selected item的虚线框”? 你的 代码里 绘制 完了没有 ? 绘制 完了 就 : return CDRF_SKIPDEFAULT
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-19
引用 13 楼 schlafenhamster 的回复:
怎么全是 CDIS_SELECTED ? CDIS_HOT 呢?
HOT和selected写的一样的 只是在设置颜色的时候不一样
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-19
怎么全是 CDIS_SELECTED ? CDIS_HOT 呢?
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-19
引用 10 楼 schlafenhamster 的回复:
要不 把 你 的 OnNMCustomdraw 发上来 看看。
else if (CDIS_SELECTED == (pNMCD->nmcd.uItemState & CDIS_SELECTED))/* 选中节点 */ { pNMCD->clrText = m_clrSelItemTextColor; /* 文字颜色 */ pNMCD->clrTextBk = m_clrHotItemBackColor; /* 文字背景颜色 */ hItem = (HTREEITEM)pNMCD->nmcd.dwItemSpec; //获取当前重绘的树节点句柄 pdc = CDC::FromHandle(pNMCD->nmcd.hdc); //获取当前要重绘的节点的DC if (NULL == pdc) { TREE_LOG(LOG_LEVEL_ERROR, "%s", "The pdc is NULL"); return; } strText = GetItemText(hItem); GetItemRect(hItem, &rcItem, TRUE); pFontNew = pdc->GetCurrentFont(); /*获取当前字体*/ if (NULL == pFontNew) { TREE_LOG(LOG_LEVEL_ERROR, "%s", "The pFontNew is NULL"); return; } iRet = pFontNew->GetLogFont(&LogFont); if (FALSE == iRet) { TREE_LOG(LOG_LEVEL_ERROR, "%s", "Call the GetLogFont Failed"); return; } LogFont.lfUnderline = 0; /*除去下划线*/ pFontNew->CreateFontIndirect(&LogFont); pFontOld = pdc->SelectObject(pFontNew); /*将新的字体方案加到上下文中*/ if (NULL == pFontOld) { TREE_LOG(LOG_LEVEL_ERROR, "%s", "Call the SelectObject Failed"); return; } // if (TVIS_SELECTED == (GetItemState(hItem, TVIS_SELECTED) & TVIS_SELECTED)) // { pdc->SetTextColor(m_clrSelItemTextColor); // } // else // { /* pdc->SetTextColor(m_clrHotItemTextColor); */ /* }*/ pdc->SetBkColor(m_clrHotItemBackColor); bRet = pdc->TextOut(rcItem.left+2, rcItem.top+2, strText); /*重绘出树*/ if (FALSE == bRet) { TREE_LOG(LOG_LEVEL_ERROR, "%s", "Call the TextOut Failed"); return; } 其他的状态也和这类似
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-19
引用 9 楼 schlafenhamster 的回复:
我给的代码 对 hot item 没有 虚线框,虚线框 只对 selected item 有。
我就是想要去掉selected item的虚线框
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-19
要不 把 你 的 OnNMCustomdraw 发上来 看看。
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-19
我给的代码 对 hot item 没有 虚线框,虚线框 只对 selected item 有。
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-19
引用 7 楼 schlafenhamster 的回复:
参考: if((dwDrawStage & CDDS_ITEM) && (uItemState & CDIS_HOT)) {// //set colors SetTextColor(hdc,RGB(255,255,255));//white SetBkColor(hdc,RGB(255,0,0)); // return ……
你给的这段代码里面 只是去设置了文字颜色和背景颜色,我原本就是这么写的 可是虚线框去不掉呀 是不是你误解了我对虚线框的意思了 我指的不是背景那个矩形 而是包围矩形的边界框
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-19
参考: if((dwDrawStage & CDDS_ITEM) && (uItemState & CDIS_HOT)) {// //set colors SetTextColor(hdc,RGB(255,255,255));//white SetBkColor(hdc,RGB(255,0,0)); // return CDRF_NOTIFYITEMDRAW; } else {// without these ,1st blue ! SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT)); SetBkColor(hdc,GetSysColor(COLOR_WINDOW)); // return CDRF_NOTIFYITEMDRAW; }
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-19
引用 5 楼 schlafenhamster 的回复:
有焦点的 项 才有一个虚线框。 OnNMCustomdraw中重绘树节点,注意 Focus 项
那在focus里面怎么写去除外面的虚线框呢? 能不能给个思路 谢谢
  • 打赏
  • 举报
回复
schlafenhamster 2013-02-19
有焦点的 项 才有一个虚线框。 OnNMCustomdraw中重绘树节点,注意 Focus 项
  • 打赏
  • 举报
回复
窗前旧时光 2013-02-19
引用 3 楼 schlafenhamster 的回复:
有一个虚线框? 焦点?
不是焦点 原本加了TVS_TRACKSELECT 风格后, 聚焦或选中节点会有一个背景框,我现在吧背景框变成透明之后,外面的虚线框还是残留在那
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
界面
加入

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2013-02-19 10:20
社区公告
暂无公告