一个树控件函数ItemHasChildren在使用 Unicode 字符集 和 使用多字节字符集 的问题

梦入神機 2012-07-29 11:03:39

编译器是VS2010
是这样的。我在制作一个自己的Myctreectrl类,派生于CTreeCtrl
在类中,我有个消息响应函数

void aaasTreeCtrl::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
{
NMTVCUSTOMDRAW *ptvTreeCtrl=(NMTVCUSTOMDRAW *)pNMHDR;
if(ptvTreeCtrl->nmcd.dwDrawStage==CDDS_PREPAINT)
{
*pResult=CDRF_NOTIFYITEMDRAW;
return;
}
if(ptvTreeCtrl->nmcd.dwDrawStage== CDDS_ITEMPREPAINT)//项绘制前
{

CDC dc;
dc.Attach(ptvTreeCtrl->nmcd.hdc);

CRect itemRect(ptvTreeCtrl->nmcd.rc);
CRect selItemRect=itemRect;
CPoint ptItem(itemRect.left+1,itemRect.top+1);
HTREEITEM hTreeItem=HitTest(ptItem);//获取项句柄
BOOL isSelected=ptvTreeCtrl->nmcd.uItemState&CDIS_SELECTED;//
CString strItem=GetItemText(hTreeItem);//获得项内容
if(!isSelected)//项没被选中
{
dc.FillSolidRect(itemRect,RGB(221,221,221));
}
//----------------------------------------------------------
//----------------------------------------------------------

int a=ItemHasChildren(hTreeItem);
//--------------------看这里--------------------------------------

//----------------------------------------------------------

if(a) //有子项
{
DrawParItem(&dc,hTreeItem,itemRect);//画父项函数,画三角图形
itemRect.left+=20;

}
else
{
DrawChlItem(&dc,hTreeItem,itemRect);//画子项函数,画头像
itemRect.left+=33;
}

dc.SetTextColor(RGB(0,0,0));
dc.SetBkMode(TRANSPARENT);

dc.DrawText(strItem,itemRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE);//显示项文本
if(isSelected)//项被选中
{
Graphics graphics(dc.m_hDC);
LinearGradientBrush linGrBrush(
Point(selItemRect.left,selItemRect.top),Point(selItemRect.left,selItemRect.bottom),//渐变画刷的起点与终点
Color(100, 177,177, 177),
Color(100, 0, 0, 0));
graphics.SetSmoothingMode(SmoothingModeAntiAlias);//反锯齿,让边缘平滑一些
graphics.FillRectangle(&linGrBrush,selItemRect.left, selItemRect.top, selItemRect.Width(), selItemRect.Height());
}
dc.Detach();
*pResult=CDRF_SKIPDEFAULT;//跳过控件默认绘制

return;
}

}



然后在我的程序的OnInitDialog中有如下代码


HTREEITEM hFriends=m_TreeCtrl.InsertItem(_T("第一个列表"),0,0);//根结点
HTREEITEM hTreeItem;

hTreeItem=m_TreeCtrl.InsertItem(_T("无尽的路")0,0,hFriends);
m_TreeCtrl.SetItemData(hTreeItem,IDB_BITMAP7);//设置关联图片

hFriends=m_TreeCtrl.InsertItem(_T("第二个列表"),0,0);
hTreeItem=m_TreeCtrl.InsertItem(_T("混沌"),0,0,hFriends);
m_TreeCtrl.SetItemData(hTreeItem,IDB_BITMAP1);


然后,请看第1段代码中的

int a=ItemHasChildren(hTreeItem);
若我用Unicode 字符集
在初始化的时候这里必然为0

若我使用多字节字符集
在初始化的时候这里必然为1

求解惑。。。。
...全文
380 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-03-11
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
梦入神機 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

小程序测试过了??
你看看你的stdfax那些文件是不是有奇怪的预编译头?
[/Quote]

[code/]

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件

#pragma once

#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif

#include "targetver.h"

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的

// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS

#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展


#include <afxdisp.h> // MFC 自动化类



#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxcontrolbars.h> // 功能区和控件条的 MFC 支持









#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif



[/code]
schlafenhamster 2012-07-31
  • 打赏
  • 举报
回复
不是TVHT_ONITEMLABEL都跳过,等待TVHT_ONITEMLABEL
梦入神機 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

TVHT_ONITEMINDENT In the indentation associated with an item.
还没在:
TVHT_ONITEMLABEL 上!
[/Quote]

翻译成:在与项目相关的缩进?不是很明白

多字节的是:标签上(字符串)与项目相关联。

但,主要是
HTREEITEM h = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0,
(LPARAM)&hti);

这样我要怎么修改才能使他正常工作呢?
schlafenhamster 2012-07-31
  • 打赏
  • 举报
回复
TVHT_ONITEMINDENT In the indentation associated with an item.
还没在:
TVHT_ONITEMLABEL 上!
梦入神機 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

CTreeCtrl::HitTest HTREEITEM HitTest( CPoint pt, UINT* pFlags = NULL ) const;
加上Flags
查查hit到那里了。
[/Quote]
加了以后

宽字节的标记是

TVHT_ONITEMINDENT
In the indentation associated with an item.

多字节的标记是
TVHT_ONITEMLABEL
On the label (string) associated with an item.


代码里面是这样的


HTREEITEM CTreeCtrl::HitTest(CPoint pt, UINT* pFlags) const
{
ASSERT(::IsWindow(m_hWnd));
TVHITTESTINFO hti;
hti.pt = pt;
HTREEITEM h = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0,
(LPARAM)&hti);
if (pFlags != NULL)
*pFlags = hti.flags;
return h;
}

梦入神機 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

HitTest、ItemHasChildren F11跟进去这两个函数看看就知道了,代码面前无秘密!
[/Quote]

第1个函数无异常,异常在第2个。。
BOOL CTreeCtrl::ItemHasChildren(HTREEITEM hItem) const
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.hItem = hItem;
item.mask = TVIF_CHILDREN;
::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
return item.cChildren;
}
item.cChildren=1 多字节
item.cChildren=0 宽字节


但。。。这是发送消息滴。。。我蛋疼了。。。。
傻X 2012-07-31
  • 打赏
  • 举报
回复
小程序测试过了??
你看看你的stdfax那些文件是不是有奇怪的预编译头?
梦入神機 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

特地试了一下,Unicode字符集 有节点ItemHasChildren返回一直是1。
你重新用个小工程测试一下看看是不是也这样,如果不是,那应该是你程序其它部分的问题。
[/Quote]

目前就是小工程测试的...........
就对话框 一个树控件 一个树控件的类
然后加上初始化的几行代码.....
用原始的树控件类是木有问题
只是我这个.....
所以一直在寻找原因....
只是困难重重...
gibsonboy 2012-07-31
  • 打赏
  • 举报
回复
特地试了一下,Unicode字符集 有节点ItemHasChildren返回一直是1。
你重新用个小工程测试一下看看是不是也这样,如果不是,那应该是你程序其它部分的问题。
schlafenhamster 2012-07-30
  • 打赏
  • 举报
回复
CTreeCtrl::HitTest HTREEITEM HitTest( CPoint pt, UINT* pFlags = NULL ) const;
加上Flags
查查hit到那里了。
gibsonboy 2012-07-30
  • 打赏
  • 举报
回复
HitTest、ItemHasChildren F11跟进去这两个函数看看就知道了,代码面前无秘密!
梦入神機 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你Debug下调试一下,你的hTreeItem是否有效?
[/Quote]
额怎么说。我一直都是Debug下调试的。HTREEITEM hTreeItem=HitTest(ptItem);//获取项句柄

我看见是已经获得了指针的,
Eleven 2012-07-30
  • 打赏
  • 举报
回复
你Debug下调试一下,你的hTreeItem是否有效?

15,979

社区成员

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

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