当前位置: 首页 > news >正文

网站界面设计 考虑因素河南建设人才教育信息网

网站界面设计 考虑因素,河南建设人才教育信息网,温州企业模板建站,建设银行网站查询余额原文 使用常用控件版本4.70中的自定义绘画功能自定义列表控件的外观. 介绍 常见控件的4.70版引入了一项叫自定义绘画的功能. 可按轻量易用的自画版本对待自定义绘画.易用性来自,即只需处理一条消息(NM_CUSTOMDRAW),且你可让窗口为你干活,因此你不必完成物主绘画中的所有粗活…原文 使用常用控件版本4.70中的自定义绘画功能自定义列表控件的外观. 介绍 常见控件的4.70版引入了一项叫自定义绘画的功能. 可按轻量易用的自画版本对待自定义绘画.易用性来自,即只需处理一条消息(NM_CUSTOMDRAW),且你可让窗口为你干活,因此你不必完成物主绘画中的所有粗活. 本文介绍重点如何用列视控件自定义绘画. 自画基础 我尽量在此总结自定义绘画过程.对这些示例,假设你在对话框中有一个列表控件,且该列表是带多列的报表视图模式. 勾挂自定义DrawMessage映射项 自定义绘画是一个类似回调的过程.窗口在绘画列表控件过程中的某些时刻通过通知消息通知程序.你可选择完全忽略通知(此时,会看到标准列表控件),自己处理绘画的某些部分(来实现简单的效果),甚至与在自画控件一样,自己绘画控件. 真正卖点是,你可选择只响应部分通知.这样,只需绘画你需要的部分,窗口完成其余工作. 假设想在现有列表控件中添加自定义绘画,以加一些光晕.假设在系统上拥有正确的常用控件DLL,窗口已按你的方式发送NM_CUSTOMDRAW消息; 你只需为消息添加一个处理器,即可开始使用自定义绘画.处理器如下: ON_NOTIFY ( NM_CUSTOMDRAW, IDC_MY_LIST, OnCustomdrawMyList )…原型如下: afx_msg void OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult );这会告诉MFC,在NM_CUSTOMDRAW通知码时,想处理从列表控件(其ID为IDC_MY_LIST)发送的WM_NOTIFY消息. 处理器叫OnCustomdrawMyList.如果要给它添加自定义绘画的CListCtrl继承类,则可改用ON_NOTIFY_REFLECT: ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomdraw )消息处理器有同上的原型,但它在继承类中. 自定义绘画阶段 自定义绘画将绘画过程分为两部分:擦除和绘画.窗口可能会在每个部分的开头和结尾,发送NM_CUSTOMDRAW消息. 所以总共有四条信息.但是,根据你告诉窗口期望内容,应用实际上可能会收到少至一条或多于四条消息.可发送通知的时间叫绘画阶段. 要很好地掌握该概念,因为在整个自定义绘画过程中使用它.因此,总结一下,在以下时间(或阶段)收到通知: 1,在画项前 2,在画项后 3,在擦除项前 4,在擦除项后 并非所有这些都同样有用,且实际上,还需要处理多个阶段. 响应NM_CUSTOMDRAW消息 从自定义绘画处理器中返回的值是一条至关重要的信息,因为它告诉窗口你已完成了多少绘画过程,及间接地告诉想让窗口完成的工作. 可从自定义绘画处理器中发送五个响应: 1,我现在什么都不想做;窗口应绘画控件或项自身,与没有自定义绘画处理器一样. 2,我更改了控件使用的字体;窗口必须重新计算正在绘画的项的矩. 3,我绘画了整个控件或项;窗口不应再处理控件或项. 4,我想在列表中每一项的绘画阶段,收到额外的NM_CUSTOMDRAW消息. 5,我想在当前正在绘画的行中,每个子项的绘画阶段接收其他NM_CUSTOMDRAW消息. 注意,控件或项经常出现.记住,我说过或会收到四条以上的NM_CUSTOMDRAW消息,就是这里.你收到的第一个NM_CUSTOMDRAW针对整个控件. 如果返回上面的响应4(按每一项请求通知),则在每一(行)项经过绘画阶段时,你都收到消息.如果随后返回响应5,则在每个子项(列)经过其绘画阶段时,你将收到更多消息. 在报告模式列表控件中,你可根据想要实现的效果类型,任意用这些响应中的一个.稍后提供一些如何响应NM_CUSTOMDRAW消息的示例. NM_CUSTOMDRAW消息提供的信息 NM_CUSTOMDRAW消息给处理器传递包含以下信息的NMLVCUSTOMDRAW结构的指针: 1,控件的窗口句柄 2,控件的ID 3,控件当前所在的绘画阶段 4,绘画时应使用的设环的句柄 5,正在绘画的控件,项或子项的矩 6,正在绘画的项的项号(索引) 7,正在绘画的子项的子项编号(索引) 8,正在绘画的项的状态(已选择,灰显等)的标志 9,正在绘画的项的由CListCtrl::SetItemData设置的长参数据 根据想要的效果,这些项中的一个可能很重要,但你总是会使用绘画阶段,一般还会使用设环.项索引和长参一般也非常有用. 简单示例 第一例非常简单,只需更改控件中文本的颜色,在红色,绿色和蓝色间旋转.这涉及四个步骤: 1,在控件的预画阶段处理NM_CUSTOMDRAW 2,告诉窗口想取每一项的NM_CUSTOMDRAW消息 3,处理为每一项发送的后续NM_CUSTOMDRAW消息. 4,设置每一项的文本色. 这是处理器: void CMyDlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult ) {NMLVCUSTOMDRAW* pLVCD reinterpret_castNMLVCUSTOMDRAW*( pNMHDR );//取默认处理,除非在下面按其他值设置它.*pResult CDRF_DODEFAULT;//首先,检查绘画阶段.如果这是控件的预绘画阶段,则告诉窗口想让每一项都有消息.if ( CDDS_PREPAINT pLVCD-nmcd.dwDrawStage ){*pResult CDRF_NOTIFYITEMDRAW;else if ( CDDS_ITEMPREPAINT pLVCD-nmcd.dwDrawStage ){//这是项的预绘画阶段.这是设置项文本色的地方.返回值告诉窗口绘画项自身,但它使用在此处设置的新颜色.将在红色,绿色和浅蓝色间循环显示颜色.COLORREF crText;if ( (pLVCD-nmcd.dwItemSpec % 3) 0 )crText RGB(255,0,0);else if ( (pLVCD-nmcd.dwItemSpec % 3) 1 )crText RGB(0,255,0);elsecrText RGB(128,128,255);//在NMLVCUSTOMDRAW结构中存储颜色.pLVCD-clrText crText;//指示窗口绘画控件自身.*pResult CDRF_DODEFAULT;} }看看每一行如何有告诉窗口使用Cool的颜色,所有这些都只需要几个如语句! 记住,在执行其他操作前,必须总是检查绘画阶段,因为处理器将收到许多消息,而绘画阶段决定了代码干的活. 一个不简单的示例 下一例演示如何处理子项(即列)的自定义绘画.处理器设置文本和单元格背景色,但它不会比上个复杂多少;只有一个额外的如块.处理子项时涉及的步骤包括: 1,在控件的预画阶段处理NM_CUSTOMDRAW. 2,告诉窗口想取每一项的NM_CUSTOMDRAW消息 3,当传入其中一条消息时,告诉窗口想在每个子项的预绘画阶段取NM_CUSTOMDRAW消息. 4,每次子项的后续消息到达时,设置文本和背景色. 注意,按一个整体,每一项收到一条NM_CUSTOMDRAW消息,并对0子项(第一列)收到另一条消息.这是代码: void CMyDlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult ) {NMLVCUSTOMDRAW* pLVCD reinterpret_castNMLVCUSTOMDRAW*( pNMHDR );//除非在下面按其他值设置它,否则取默认处理.*pResult CDRF_DODEFAULT;//首先-检查绘画阶段.如果这是控件的预绘画阶段,则告诉窗口想让每一项都有消息.if ( CDDS_PREPAINT pLVCD-nmcd.dwDrawStage ){*pResult CDRF_NOTIFYITEMDRAW;}else if ( CDDS_ITEMPREPAINT pLVCD-nmcd.dwDrawStage ){//这是项的通知消息.请求在每个子项的预绘画阶段前通知.*pResult CDRF_NOTIFYSUBITEMDRAW;}else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) pLVCD-nmcd.dwDrawStage ){//这是子项的预绘画阶段.在此,设置项的文本和背景色.返回值告诉窗口绘画子项自身,但它使用在此处设置的新颜色.文本色将在红色,绿色和浅蓝色间循环.第0列的背景色为浅蓝色,第1列的背景色为红色,第2列的背景色为黑色.COLORREF crText, crBkgnd;if ( 0 pLVCD-iSubItem ){crText RGB(255,0,0);crBkgnd RGB(128,128,255);}else if ( 1 pLVCD-iSubItem ){crText RGB(0,255,0);crBkgnd RGB(255,0,0);}else{crText RGB(128,128,255);crBkgnd RGB(0,0,0);}//在NMLVCUSTOMDRAW结构中存储颜色.pLVCD-clrText crText;pLVCD-clrTextBk crBkgnd;//指示窗口绘画控件自身.*pResult CDRF_DODEFAULT;} }这里有几点注意: 1,仅在列中绘画clrTextBk颜色.最后一列右边和最后一行下方的区域仍会取得控件的背景色. 2,查看文档时,我读了标题为NM_CUSTOMDRAW(列视)的页,它说你可从第一条自定义绘画消息中返回CDRF_NOTIFYSUBITEMDRAW,而无需处理CDDS_ITEMPREPAINT绘画阶段. 3,但是,测试了下,但它不管用.实际上确实需要处理CDDS_ITEMPREPAINT阶段. 处理绘画后绘画阶段 当前,这些示例已处理了预绘画阶段,这样在窗口绘画列表项时,更改列表项的外观.但是,在预绘画阶段,你的选项仅限于更改文本的颜色或外观. 如果想更改图标的绘画方式,可在预绘画阶段(过度)绘画整个项,或在绘画后阶段自定义绘画.当你在绘画后阶段自定义绘画时,在窗口绘画整个项或子项后,调用你的自定义绘画处理器,可执行想要的其他绘画. 在此例中,我创建一个列表控件,其中不会更改所选项的图标颜色.涉及步骤是: 1,在控件的预画阶段处理NM_CUSTOMDRAW 2,告诉窗口,想取每一项的NM_CUSTOMDRAW消息 3,传入其中一条消息时,告诉窗口,想在项的绘画后阶段收到NM_CUSTOMDRAW消息. 4,每次项的后续消息到达时,必要时重画图标. void CMyDlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult ) { NMLVCUSTOMDRAW* pLVCD reinterpret_castNMLVCUSTOMDRAW*( pNMHDR );*pResult 0;//如果这是控件绘画周期的开始,对每一项请求通知.if ( CDDS_PREPAINT pLVCD-nmcd.dwDrawStage ){*pResult CDRF_NOTIFYITEMDRAW;}else if ( CDDS_ITEMPREPAINT pLVCD-nmcd.dwDrawStage ){//这是项的预绘画阶段.在绘画后阶段,需要再次请求通知.*pResult CDRF_NOTIFYPOSTPAINT;}else if ( CDDS_ITEMPOSTPAINT pLVCD-nmcd.dwDrawStage ){//如果选择了此项,则按正常颜色(不用高亮颜色混合)重画图标.LVITEM rItem;int nItem static_castint( pLVCD-nmcd.dwItemSpec );//取此项的imageindex和状态.注意,需要手动检查所选状态.文档_说_该项的状态在pLVCD-nmcd.uItemState中,但在测试时它总是等于0x0201,这没有意义,因为commctrl.h中的最大CDIS_*常是0x0100.ZeroMemory ( rItem, sizeof(LVITEM) );rItem.mask LVIF_IMAGE | LVIF_STATE;rItem.iItem nItem;rItem.stateMask LVIS_SELECTED;m_list.GetItem ( rItem );//如果选中此项,则使用其正常颜色重画图标.if ( rItem.state LVIS_SELECTED ){CDC* pDC CDC::FromHandle ( pLVCD-nmcd.hdc );CRect rcIcon;//取包含项图标的矩.m_list.GetItemRect ( nItem, rcIcon, LVIR_ICON );//绘画图标.m_imglist.Draw ( pDC, rItem.iImage, rcIcon.TopLeft(), ILD_TRANSPARENT );*pResult CDRF_SKIPDEFAULT;}} }同样,自定义绘画可尽量少地干活.此例的作用是让窗口完成所有绘画,然后覆盖所选每一项的图标.这样,用户只看到我们绘画的图标. 注意,Stan的图标与未选中项的图标相同. 缺点是有时会看一点闪烁,因为图标是两次快速连续绘画的. 使用自定义画代替物主画 可用自定义画做的另一件巧妙的事情是,用来执行与物主画相同操作.区别在,使用自定义绘画时,更容易编写和理解代码. 另一个优点是,如果只需要自画某些行,则可这样并让窗口绘画其他行.在真正的自画控件时,即使不需要特效,也必须执行所有操作. 使用自定义绘画自画时,需要处理在项的预绘画阶段发送的NM_CUSTOMDRAW消息,执行所有绘画,并从处理器返回CDRF_SKIPDEFAULT. 这与迄今为止不同.CDRF_SKIPDEFAULT会告诉窗口不要在该行中绘画,因为你已完成了所有操作.
http://www.dnsts.com.cn/news/132157.html

相关文章:

  • 新郑网站开发北京厦门网站优化
  • 睢宁做网站公司网站项目计划书模板范文
  • 妇幼网站建设ppt网站后台 添加用户
  • 自建网站软件wordpress表单信息在哪里
  • 怎么选一个适合自己的网站做网站推广 seo的
  • 成都哪家网站建设好psd 网站
  • 自己做网站视频教程wordpress 功能介绍
  • 做动态图的网站房地产销售经理职责和工作内容
  • 加强机关网站建设app小游戏开发公司
  • 网站seo关键字wordpress网站秒开
  • 专业网站建设价格最优郑州建网站的好处
  • 徐州cms模板建站广告公司名字起名大全
  • html5微网站模板营销型网站设计内容
  • 胶南市场建设服务中心网站品牌推广公司排名
  • 网站所属权介绍一学一做视频网站
  • 做网站廊坊硬件开发语言有哪些
  • 门户网站定制开发工程竣工验收公示网
  • 北京建设工程建设交易信息网站网站业务怎么做的
  • 做网站客户最关心的是什么深圳网站建设ppchsj
  • 网站建设与规划案例南昌网站建设哪家好薇
  • 网站标题组合网页设计与网站建设 石油大学
  • 一个人可以建设网站吗网站开发liucheng
  • 有什么做图文长图的网站吗做实体店推广的网站
  • 长垣住房和城乡建设局 网站seo网站推广优化论文
  • 免费 开源 企业网站专业定制网页设计
  • 网站栏目词ip开源网站fpga可以做点什么用
  • 北京电力建设公司培训学校网站自己做视频网站能赚钱吗
  • 网站标题应怎设置在上阿里云做网站
  • 秦皇岛手机网站制作价格做足球推荐网站能赚钱吗
  • 网站开发不足之处广告公司怎么设置网站关键字