`
hcmfys
  • 浏览: 356271 次
  • 性别: 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才能完成一些功能的,如禁止改变列宽,在列上画排序箭头。
分享到:
评论

相关推荐

    Catching header messages in a CListView捕捉CListView的头消息

    在这个例子中,我们检查了WM_NOTIFY消息的子类型,如LVN_COLUMNCLICK(列点击)和HDN_BEGINTRACK/HDN_ENDTRACK(列宽调整)。当用户单击列标题时,我们可以调用自定义的`OnColumnClick`函数进行排序操作;而当用户...

    CListCtrl 完全重绘(包括表头,表项和滚动条,带checkbox)

    同时,需要处理`HDN_BEGINTRACK`和`HDN_ENDTRACK`消息,以便在用户调整列宽时响应。 3. **表项(Items)**: 对于表项的重绘,需要重载`CListCtrl`的`OnDrawItem`方法。在这个方法中,你可以控制每一项的绘制,...

    ListCtrl的系列操作

    4. **处理拖放事件**:处理`HDN_BEGINTRACK`和`HDN_ENDTRACK`消息,以确保在拖动过程中正确更新列表项的位置。 **二、左键单击列头排序** ListCtrl支持根据列头的单击进行自动排序。这通常通过以下步骤实现: 1. **...

    HeaderCtrlDemo.rar_图形图像处理_Visual_C++_

    这通常涉及到重写OnDrawItem和OnMeasureItem方法,以及处理HDN_BEGINTRACK和HDN_ENDTRACK等通知,以实现拖动排序时的动画效果。 7. **性能优化**:考虑到效率,应该避免在每次界面更新时都重新创建或加载图像列表。...

    在MFC中创建HeaderBar控件

    你需要处理HDN_BEGINTRACK、HDN_ENDTRACK等通知消息,以便在用户拖动标题时做出反应。 6. **样式和外观定制**:CHdrCtrl类提供了许多成员函数来改变HeaderBar的外观,如SetBkColor、SetTextColor和SetFont。此外,...

    winform listview,不可,拖动列头,锁定列头Columns

    const int HDN_BEGINTRACKW = (HDN_FIRST - 26); bool callBase = true; switch (message.Msg) { case WM_NOTIFY: if (locked) { message.Result = (IntPtr)1; callBase = false; } break; } if ...

    CTreeCrl退拽树退拽树退拽树

    还要处理`HDN_BEGINRDRAG`和`HDN_ENDDRAG`等通知消息,这些消息在拖放操作开始和结束时触发。 3. **创建数据对象**:在拖动开始时,你需要创建一个`COleDataObject`实例,用于存储要拖动的数据。这个数据可以是树...

    显示树状目录的组合框

    7. **拖放操作**:`TreeDropList.cpp`可能包含了实现拖放功能的代码,这需要处理`HDN_BEGINDRAG`, `HDN_ENDDRAG`等通知,以及`DoDragDrop`函数。 8. **对话框类**:`ComboTreeShowDlg.cpp`和`ComboTreeShow.cpp`...

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

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

    CListCtrl

    3. 处理拖放事件:注册HDN_BEGINDRAG和HDN_ENDDRAG消息,以便在用户拖动列头时进行相应的处理,如重新排列列。 五、实例代码展示 下面是一个简单的示例,展示了如何在CListCtrl中添加列头图像并处理拖放事件: ``...

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

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

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

    HDN方波通用型逆变器是一款适用于多种场合的电力转换设备,主要由HDD系列组件、VMOS管或进口功率模块以及PWM脉宽调制技术构建,具有较高的性价比。这款逆变器能够为一般的电器提供电力供应,1KVA以下的型号采用PWM推...

    VC锁定ListView控件的栏目头宽度

    对于拖动调整列宽,我们需要处理`HDN_BEGINDRAG`通知。同样,我们可以通过重载`OnHdnBeginDrag`函数来阻止这一行为: ```cpp afx_msg void CMyListView::OnHdnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult) { ...

    MFC中ListCtrl控件的表头/标题栏中增加复选框checkbox

    ON_NOTIFY(HDN_ITEMCLICK, 0, OnHdnItemclick) END_MESSAGE_MAP() void CCustomHeaderCtrl::OnHdnItemclick(NMHDR* pNMHDR, LRESULT* pResult) { LPNMHEADER pHdr = (LPNMHEADER)pNMHDR; if (pHdr-&gt;iItem == 0) ...

    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年)

    ### 新型柴油HDN催化剂的制备与性能研究 #### 概述 本文介绍了一种新型加氢脱氮(HDN)催化剂的制备及其性能评估。该催化剂以TiO2-ZrO2-SiO2三元复合材料为载体,并负载磷化钼(MoP),用于提高柴油的质量。通过实验...

    基于MATLAB的FIR滤波器设计

    hdn = sin(w_c * (n - r)) ./ (pi * (n - r)); if mod(N, 2) == 0 hdn(r + 1) = w_c / pi; end wn1 = boxcar(N); % 矩形窗 hn1 = hdn .* wn1; wn2 = hamming(N); % 汉明窗 hn2 = hdn .* wn2; % 绘制滤波器脉冲响应...

    人类疾病网络分析报告.pptx

    报告中提到的研究主要关注两个核心概念:人类疾病网络(Human Disease Network, HDN)和疾病基因网络(Disease Gene Network, DGN),它们是通过对疾病与基因的关联进行建模而形成的。 【疾病网络构建】 疾病网络...

    文华财经指标公式源码 量动红绿量价多空.doc

    `DMPN:=SMA(IF(HDN&gt;0 AND HDN&gt;LDN,HDN,0),N,1)` 其中,HDN表示最高价的涨幅,LDN表示最低价的跌幅,IF函数用于判断条件,SMA函数用于计算移动平均值。 3. Directional Movement Index(DMI) 在这个公式中,我们...

Global site tag (gtag.js) - Google Analytics