`
hcmfys
  • 浏览: 348193 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

HDN_ENDTRACK

 
阅读更多
近期把List Control扩展成Grid,参考了两篇关于SubItem Selection的文章,一篇来自Piotr Szewczyk.. 采用NM_CUSTOMDRAW方法,另一篇来自Muhammad Azam.采用LVS_OWNERDRAWFIXED。我个人偏好于NM_CUSTOMDRAW,因为NM_CUSTOMDRAW可以控制是否自绘,可以控制自绘区域(CDDS_ITEMPREPAINT和CDDS_SUBITEM),详细内容请参阅Neat Stuff to do in List Controls Using Custom Draw
但两篇文章都存在一个问题:DrawText时总是用DT_LEFT,因为我为每个Column都设了Alignment,结果是每列都是Align Left。于是我用作了修改,DrawText时分别对应每个ColumnAlignment,但是问题又出现了。
我用NM_CUSTOMDRAW方法,当移动Column Header时,如果该列的Alignment为Center或Right时,该列的内容就出现“花屏”现象,原因是作者为了防止闪烁,采用以下方法:
void CMyList::InvalidateCell(int nRow, int nCol)
{
//I add this function to reduce flickering
CRect rc;
if(nCol==0)
GetItemRect(nRow,&rc,LVIR_LABEL);
else
GetSubItemRect(nRow,nCol,LVIR_BOUNDS,rc);
InvalidateRect(&rc);
}
程序中保存两个变量m_nRow,m_nCol,当变量的值改变了就会调用InvalidateCell(int nRow, int nCol)。而当我拖动Column Header时不会调用InvalidateCell(int nRow, int nCol)。
解决方法当然是捕获拖动Column Header时的消息,查看了相关资料,相关的消息是HDN_ITEMCHANGED:拖动过程中不断收到
HDN_BEGINTRACK:拖到开始时
EDN_ENDTRACK:拖动结束时
那些消息是从CHeaderCtrl反馈回来的。(注:CHeaderCtrl有两种获得方法:一种是CListCtrl::GetHeaderCtrl(),一种是CListCtrl::GetDlgItem(0)。)
我的CMyList是继承自CListCtrl,不论我怎样设定风格,如CMyList->GetHeaderCtrl()->ModifyStyle(0, HDS_HOTTRACK),还是捕获不了HDN_ITEMCHANGED,其它消息也捕不了。
最后的办法只有设计一个类CMyHeaderCtrl继承自CHeaderCtrl,然后在CMyList的SubclassHeaderControl加入以下代码:
CHeaderCtrl* pHeader = GetHeaderCtrl();
if (pHeader)
{
VERIFY(m_HeaderCtrl.SubclassWindow(pHeader->m_hWnd));
因为ClassView中没有HDN_ITEMCHANGED所以要自己加
ON_NOTIFY_REFLECT(HDN_ITEMCHANGED, OnItemChanged)
以下是OnItemChanged的实现
void CMyHeaderCtrl::OnItemChanged(NMHDR * pNMHDR, LRESULT* pResult)
{
*pResult = 0;
CMyList* pzList = static_cast<CMyList*>(GetParent());
ASSERT(pzList);
NMHEADER *pHdr = (NMHEADER*)pNMHDR;
int nCol;//The changed column
int topRow,bottomRow;//The visit top row and bottom row
nCol = pHdr->iItem;
if( pzList->Cols[nCol].getTextAlignFixed() == AlignLeft)
return;//因为AlignLeft不存在“花屏”现象
if( 0 == pzList->GetItemCount())
return;
topRow = pzList->GetTopIndex();
bottomRow = pzList->GetCountPerPage();
CRect rc1,rc2;
pzList->GetSubItemRect(topRow,nCol,LVIR_BOUNDS,rc1);
pzList->GetSubItemRect(bottomRow,nCol,LVIR_BOUNDS,rc2);
if( 0 == nCol)
{
rc1.left = 0;
rc2.left = 0;
rc1.right = pzList->GetColumnWidth(0);
rc2.right = rc1.right;
}
rc1.bottom = rc2.bottom;
pzList->InvalidateRect(&rc1);
TRACE("ItemChanged/n");
}
至此,虽然问题已解决,重画区域已减到最小,但也存在小小的闪烁,但比Invalidate好多了。
一些问题也是想不通:
1. 为什么继承的CListCtrl不能收到CHeaderCtrl的Trace消息?
2. 的Column为什么不会出现“花屏”现象?AlignLeft
今天收获很大,虽然最后也要动用到继承CHeaderCtrl,但也不失为好事,因为迟早也要继承CHeaderCtrl才能完成一些功能的,如禁止改变列宽,在列上画排序箭头。
分享到:
评论

相关推荐

    如何锁定 ListView 的栏目头宽度VC源代码

    世界之大,真是无其不有。Windows 应用程序的GUI标准明确规定了 ListView 栏目头(Column Header)的宽度必须是可调整的,这本来是专门为用户...关键字:listview,column,header,control,HDN_BEGINTRACK,列表视图,栏目

    德力西HDN 系列逆变电源.pdf

    德力西HDN 系列逆变电源pdf,德力西HDN 系列逆变电源适用于微机系统、通信系统,是医院、商店和家庭等经常停电地方提供交流电的理想设备。采用性能优良的PWM集成电路,大功率MOS管,设有过流、过压、欠压、电瓶充满...

    HDN方波通用型逆变器规格.pdf

    HDN方波通用型逆变器规格.pdf

    SANYO三洋VCC-HD4000P 1.06最终升级包支持中文

    SANYO三洋VCC-HD4000P/PC 1.06最终升级包支持简体中文,两个文件,升级内核和主程序,请阅读英文说明书,看不懂请翻译,若浏览器升级勿反应请尝试使用低版本的浏览器升级如IE6、7等

    hdn-neon-arena:hdn-neon-arena贴图的多个版本以及相关的自定义纹理,模型等

    hdn-neon-arena-v5(隐藏:源地图) 这是我为Hidden:Source创建的第一张地图的最终版本。此地图的目的是为可以与物理场媲美的phys-kills制作一张地图。原始地图的灵感来自Phenom的CS:GO地图gg_neon_lights Green /...

    喹啉和二苯并噻吩在磷化钼催化剂上的HDN和HDS性能 (2006年)

    通过程序升温还原磷钼酸盐前体的方法制备了无负载和负载型磷化钼催化剂,并采用TG-DTG,XRD和BET技术对催化剂进行表征。采用高压连续微反装置,以二苯并噻吩、喹啉的混合体系为模型化合物考察了MoP,MoP/γ-Al2O3,...

    新型柴油 HDN催化剂的制备与性能研究 (2009年)

    采用改进的溶胶凝胶法制备的TiO2-ZrO2-SiO2三元复合载体并负载磷化钼制备了MoP/ TiO2-ZrO2-SiO2新型加氢脱氮催化剂.以喹啉为模型化合物,考察催化剂的加氢脱氮性能,得出n(Ti):n(Zr):n(Si)为6:1:10时复合载体催化剂的...

    数字信号处理窗函数法设计FIR数字滤波器实验.doc

    hdn=sin(wc*m)./(pi*m); wn=hanning(N); hn=hdn.*(wn'); [H,w]=freqz(hn,[1],1024,'whole'); dbH=20*log10((abs(H)+eps)/max(abs(H))); figure(1);subplot(2,2,1); stem(n,hn,'.'); xlabel('n');ylabel('h(n)');...

    Angular.js中定时器循环的3种方法总结

    本文主要设计定时器的三种循环,模板自配,下面分享给大家供大家... var img=["http://hdn.xnimg.cn/photos/hdn321/20130612/2235/h_main_NNN4_e80a000007df111a.jpg" ,"http://ww2.sinaimg.cn/crop.0.0.1080.1080.1

    discretized-semantic-stream

    运行环境硬件环境主机名CPU内存磁盘网络地址HDN1Intel(R) Xeon(R) E5606@ 2.13GHz16GB1TB192.168.13.200HDN2Intel(R) Xeon(R) E5606@ 2.13GHz16GB2TB192.168.13.201HDN3Intel(R) Xeon(R) E5606@ 2.13GHz16GB1.8TB...

    数字信号处理课程设计MATLAB

    高通,带通)hdn idealhd 理想低通滤波器 /fir gui(fir滤波器GUI设计) gui_top 总图 gui_fir fir滤波器GUI gui_sigout 选择信号GUI /power caculate(功率谱分析) directpower 直接谱...

    HyperDualNumbers:Hyper-Dual Numbers的Python实现以计算精确的一阶和二阶导数

    超双数字 Python的Hyper-Dual Numbers [1]实现,用于计算精确的一阶和二阶导数。 [1] JA Fike和JJ Alonso。 精确二阶计算的双对数的发展。 AIAA纸2011-886,第49届AIAA航空航天科学会议,2011年1...x = hdn ( 5 , eps1

    自组装催化剂在混合油加氢精制中的应用 (2014年)

    实验原料油用回炼油与劣质催化柴油体积比2∶1配比,用一种新型的纳米自组装催化剂对其进行精制,设计正交试验,考察在不同温度、空速和压力下对加氢脱硫(HDS)、加氢脱氮(HDN)和加氢脱芳烃(HDAr)的影响,通过实验得出对...

    煤液化油催化加氢反应烃类气液产物的研究

    采用Ni-W/γ-Al2O3型催化剂,利用固定床反应器对煤直接液化油进行催化加氢改质,研究了反应温度和...催化剂的HDN(加氢脱氮)、HDS(加氢脱硫)和HDO(加氢脱氧)活性分别为35.56%,72.73%和24.20%,n(H)∶n(C)由1.37提高到1.52.

    元器件应用中的HM系列HM9201集成电路实用检测数据

    HM9201是开关电源误差放大与基准电压专用厚膜集成电路,为7脚单列直插式陶瓷封装,与HM9201-5、HM9203的功能、引脚结构等完全相同,所对应的开关电源输出电压均是110V,可以直接互换。该电路在日立CTP-2005型(NP84C...

    Anime4KCPP:高性能动漫升频器

    HDN模式可以更好地去噪,HDN级别为1到3,更高以实现更好的去噪,但可能会导致模糊和细节不足。 有关详细信息,请参见。为什么选择Anime4KCPP 跨平台的构建已经在Windows,Linux和macOS(感谢 )中进行了。 所有实施...

    过渡金属碳化物的催化研究进展

    过渡金属碳化物的催化研究进展,甘赠国,黄志宇,过渡金属碳化物作为一种催化新材料得到了人们广泛的关注,在催化加氢、脱氢、脱硫(HDS)、脱氮(HDN)和重整等方面,表现出优良的催�

    论文研究 - 糖尿病患者神经糖尿病严重程度对足部自我护理行为的影响

    方法:我们使用手持式神经传导测试仪DPN检查(HDN-1000,欧姆龙)来评估糖尿病性神经病变的严重程度。 使用日本SDSCA(糖尿病自我护理活动摘要)评估了脚部自我护理。 足部自我护理包括目视检查,洗涤,擦拭指间...

    联通大数据有限公司-招投标数据分析报告.pdf

    工商信息 企业名称: 联通大数据有限公司 统一社会信用代码: 91110108MA00HDN79U 工商注册号: 110108023999095 组织机构代码: MA00HDN79 法定代表人: 赵越 成立日期: 2017-08-24 企业类型: / 经营状态: 在业...

    bp4mc2-zvg:Dotwebstack可配置的Zorgeloos庞大网站

    bp4mc2-zvg 尝试达米尔 UC-1创建,编辑和删除新概念及其属性 功能要求: 。 系统应具有以下能力:a)创建b)编辑c)删除概念及其属性(请参阅带有的列表)。 。... HDN维护工具启用 7 C 输出:J

Global site tag (gtag.js) - Google Analytics