Windows Dev Intro - How to avoid TVN_SELCHANGED not captured

本文介绍在Visual Studio中处理TreeView控件的通知消息,特别是在多字节和Unicode版本间的区别。通过示例代码展示了如何安全地处理不同编码环境下TVN_SELCHANGING和TVN_SELCHANGED等消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  include commctl.h

#define TVN_SELCHANGINGA        (TVN_FIRST-1)
#define TVN_SELCHANGINGW        (TVN_FIRST-50)
#define TVN_SELCHANGEDA         (TVN_FIRST-2)
#define TVN_SELCHANGEDW         (TVN_FIRST-51)


ifdef UNICODE
#define TVN_SELCHANGING         TVN_SELCHANGINGW
#define TVN_SELCHANGED          TVN_SELCHANGEDW
#define TVN_GETDISPINFO         TVN_GETDISPINFOW
#define TVN_SETDISPINFO         TVN_SETDISPINFOW
#define TVN_ITEMEXPANDING       TVN_ITEMEXPANDINGW
#define TVN_ITEMEXPANDED        TVN_ITEMEXPANDEDW
#define TVN_BEGINDRAG           TVN_BEGINDRAGW
#define TVN_BEGINRDRAG          TVN_BEGINRDRAGW
#define TVN_DELETEITEM          TVN_DELETEITEMW
#define TVN_BEGINLABELEDIT      TVN_BEGINLABELEDITW
#define TVN_ENDLABELEDIT        TVN_ENDLABELEDITW
#else
#define TVN_SELCHANGING         TVN_SELCHANGINGA
#define TVN_SELCHANGED          TVN_SELCHANGEDA
#define TVN_GETDISPINFO         TVN_GETDISPINFOA
#define TVN_SETDISPINFO         TVN_SETDISPINFOA
#define TVN_ITEMEXPANDING       TVN_ITEMEXPANDINGA
#define TVN_ITEMEXPANDED        TVN_ITEMEXPANDEDA
#define TVN_BEGINDRAG           TVN_BEGINDRAGA
#define TVN_BEGINRDRAG          TVN_BEGINRDRAGA
#define TVN_DELETEITEM          TVN_DELETEITEMA
#define TVN_BEGINLABELEDIT      TVN_BEGINLABELEDITA
#define TVN_ENDLABELEDIT        TVN_ENDLABELEDITA
#endif


2. in visual studio window project

as far as multibyte version and unicode version, TVN_SELCHANGED

is mapped to different value, multibyte mapped to TVN_SELCHANGEDA         (TVN_FIRST-2),

but unicode version mapped to TVN_SELCHANGEDW         (TVN_FIRST-51)

Therefore care need be taked here.


3. Safe Solutions.

LRESULT DialogWindow::OnTreeNotify(LPNMHDR lp)
{
 HWND hTree = lp->hwndFrom;
 TRACE("notify code = 0x%X (%d)\n", lp->code, lp->code);
 switch (lp->code) {
#if 0
 case NM_CLICK:
 {
      return OnTreeClicked(lp);
 }
 case NM_DBLCLK:
 {
     return OnTreeDoubleClicked(lp);
 }
#endif
 case TVN_SELCHANGINGA:
 case TVN_SELCHANGINGW:
 {
         return FALSE;
 }
 case TVN_SELCHANGEDA:
 case TVN_SELCHANGEDW:
 {
        return OnTreeSelChanged(lp);
 }
 default:
  break;
 }

 return TRUE;
}


CREATE TABLE school ( school_id INT PRIMARY KEY AUTO_INCREMENT, -- 学校id school_name VARCHAR(100) NOT NULL UNIQUE -- 学校名称 ); CREATE TABLE user ( user_id INT PRIMARY KEY AUTO_INCREMENT, -- 用户id,主键 username VARCHAR(50) NOT NULL UNIQUE, -- 登录用户名 password VARCHAR(100) NOT NULL, -- 用户密码 school_id INT, -- 所属学校ID role VARCHAR(20) NOT NULL, -- 用户角色(学生/教职工/商业人士) gender VARCHAR(10), -- 性别 qq VARCHAR(200), -- qq email VARCHAR(200), -- email register_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 注册时间 login_count INT DEFAULT 0, -- 登录次数 space_click INT DEFAULT 0, -- 空间点击量 avatar_url VARCHAR(255), -- 头像图片路径 space_title VARCHAR(100), -- 个人空间标题 space_intro TEXT, -- 个人空间介绍 FOREIGN KEY (school_id) REFERENCES school(school_id) ON DELETE SET NULL -- 外键关联学校表 ) ; CREATE TABLE blog ( blog_id INT PRIMARY KEY AUTO_INCREMENT, -- 日志id, 主键 user_id INT NOT NULL, -- 日志作者ID blog_title VARCHAR(200) NOT NULL, -- 日志标题 category VARCHAR(50) NOT NULL, -- 日志分类 content TEXT NOT NULL, -- 日志正文 image_url VARCHAR(255), -- 日志配图 publish_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 发表时间 view_count INT DEFAULT 0, -- 日志查看次数 FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE -- 外键关联用户表 ); CREATE TABLE album ( album_id INT PRIMARY KEY AUTO_INCREMENT, -- 相册/照片唯一标识,自增 user_id INT NOT NULL, -- 所有者ID,关联用户表 name VARCHAR(100) NOT NULL, -- 相册名/照片名 perm VARCHAR(30) DEFAULT '所有人', -- 浏览权限(所有人/好友/同校) upload_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建/上传时间,默认当前时间 FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE -- 外键关联用户表 ) ; CREATE TABLE circle ( circle_id INT PRIMARY KEY AUTO_INCREMENT, -- 圈子id,主键 c_creator_id INT NOT NULL, -- 创建者id name VARCHAR(100) NOT NULL, -- 圈子名称 intro TEXT, -- 圈子简介 category VARCHAR(50), -- 圈子分类 join_type VARCHAR(20) DEFAULT '自由加入', -- 加入方式 create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间 FOREIGN KEY (c_creator_id) REFERENCES user(user_id) ON DELETE CASCADE -- 外键关联创建者 ); CREATE TABLE activity ( act_id INT PRIMARY KEY AUTO_INCREMENT, -- 活动id a_creator_id INT NOT NULL, -- 创建者ID title VARCHAR(200) NOT NULL, -- 活动主题 content TEXT NOT NULL, -- 活动详细内容 start_time DATETIME NOT NULL, -- 活动开始时间 end_time DATETIME NOT NULL, -- 活动结束时间 location VARCHAR(200) NOT NULL, -- 活动地点 FOREIGN KEY (a_creator_id) REFERENCES user(user_id) ON DELETE CASCADE -- 外键关联创建者 ) ; 给我er图
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值