标题
    
    
        使用.net c#自给制ListView控件(基础第一篇) [zt 可用做编写 sdk 时的参考] 
    
 
    
 	 
       
    
    clq
    
    
    
		
        浏览(0) + 
        2008-04-17 21:45:19 发表
        
编辑 
         
        
        
        
        关键字: 
        
 
        
 
        
        
        
                
        使用.net c#自给制ListView控件(基础第一篇)  来自 http://www.cnblogs.com/a-peng/archive/2007/12/05/984107.html 首先需要了解Windows消息编程的一些基本内容. Windows操作系统是消息驱动(或称为事件驱动) 例如: 1.用户单击了应用程序的菜单! 2.Windows就像用一个射像头监视你的一举一动.所以它拍到了你单击了应用程序的菜单. 3.Windows告诉应用程序:刚才有个用户单击了菜单,该怎么办?(通过消息来传递) 4.应用程序嘿嘿两下,收到我来搞定. 消息的种类: 1.(系统消息) Windows利用系统定义的消息控制应用程序(Windows与应用程序通信) 如 LB:列表框控制消息 SBM:滚动条控制消息 WM:通用窗口消息 2.通知消息(从子窗口包括控件发送至它们的父窗口的消息) Win32使用WM_NOTIFY消息通知它们的父窗口,如鼠标点击,控件背景重绘事件等等 在最初的Windows 3.x中不存在WM_NOTIFY.那么用什么通知呢? 使用一个简单的WM_COMMAND消息来通知 WM_COMMAND结构 {      code(放通知码)      lParam(放控件句柄)      wParam(放控件ID) } 这样一来lParam,wParam都被填满了,没有额外的空间来传递一些其它消息. 例如:鼠标按下的位置和时间.为了克服这个困难 windows3.x提出了一个比较低级的解决策略. 那就是给一些消息添加附加消息.最为明显的就是控件自画用到的DRAWITEMSTRUCT 这个结构包含9个内容.几乎你需要控件的信息都给你提供了.为什么说它比较低级呢? 因为不同的消息附加的内容不同,结果就是一盘散沙.非常混乱. 在Win32中,MS提出了解个更好的解决安案:引进NMHDR结构.这个结构的引进使得消息统一起来 NMHDR {     HWnd hWndFrom;相当于原WM_COMMAND传递方式的lParam放控件句柄     UINT idFrom;相当于原WM_COMMAND传递方式的wParam放控件ID     UINT code;相当于原WM_COMMAND传递方式的Notify code通知码 } 现在来说下WM_NOTIFY相对于WM_COMMAND有什么特别之处 {     code;一个通过码     wParam;控件ID,但一般不使用它     lParam;指向NMHDR结构体的指针     某些控件可能会发送更大的结构体,它们的第一个成员必须是NMHDR这样我们可方便的转换  } 比如自绘制传递的通常是 NMCUSTOMDRAW 结构体 typedef struct{     NMHDR hdr;     DWORD dwDrawStage; } NMCUSTOMDRAW 那么指向 NMCUSTOMDRAW的指针当然也指向了NMHDR了.所以二者的转化就成为了可能. 3.反射消息(自己生的孩子自己养,自已发的消息自已处理) 在Windows里面,子控件经常向父控件发送消息,例如很多子控件要绘制自己的背景,就可能向父窗口发送消息WM_CTLCOLOR。对于从子控件发来的消息,父控件有可能在处理之前,把消息返还给子控件处理,这样消息看起来就想是从父窗口反射回来一样,故此得名:消息反射WM_COMMAND	OCM_COMMAND WM_CTLCOLORBTN	OCM_CTLCOLORBTN WM_CTLCOLOREDIT	OCM_CTLCOLOREDIT WM_CTLCOLORDLG	OCM_CTLCOLORDLG WM_CTLCOLORLISTBOX	OCM_CTLCOLORLISTBOX WM_CTLCOLORSCROLLBAR	OCM_CTLCOLORSCROLLBAR WM_CTLCOLORSTATIC	OCM_CTLCOLORSTATIC WM_CTLCOLOR	OCM_CTLCOLOR WM_DRAWITEM	OCM_DRAWITEM WM_MEASUREITEM	OCM_MEASUREITEM WM_DELETEITEM	OCM_DELETEITEM WM_VKEYTOITEM	OCM_VKEYTOITEM WM_CHARTOITEM	OCM_CHARTOITEM WM_COMPAREITEM	OCM_COMPAREITEM WM_HSCROLL	OCM_HSCROLL WM_VSCROLL	OCM_VSCROLL WM_PARENTNOTIFY	OCM_PARENTNOTIFY WM_NOTIFY	OCM_NOTIFY 你会发现一一对应.OCM_*表示反射的消息 OCM_NOTIFY = OCM_BASE + WM_NOTIFY 消息反射的原理是将发送父窗体的消息加上OCM_BASE在反还给子窗体. 如果子窗体认识的话会减去OCM_BASE
         
        
        
        		
		        
                
                
     
    
 
	
	
     
    
       
    
    clq
    
    
    
    
    
    		    
    
          
              
    	使用.net c#自绘制ListView控件(基础第二篇)  自绘制当然少不了好好认识下NMCUSTOMDRAW这个结构体了 c# 中需要自己定义所有结构体 struct NMCUSTOMDRAW {     NMHDR hdr;     int dwDrawStage }  public struct NMHDR {    public IntPtr hwndFrom;    public int idFrom;    public int code; } public struct RECT {    public int left;    public int top;    public int right;    public int bottom; } public struct NMCUSTOMDRAW {    public NMHDR hdr;    public int dwDrawStage;//当前绘制状态(***)    public IntPtr hdc;//绘制操作所使用的设备环境    public RECT rc;//被绘制的矩形区域    public int dwItemSpec;//列表项的索引    public int uItemState;//当前列表项的状态    public int lItemlParam;//当前列表项的绑定数据 } dwDrawStage当前绘制状态 取值及含义 {     CDDS_POSTERASE 擦除循环结束     CDDS_POSTPAINT 绘制循环结束     CDDS_PREERASE 准备开始擦除循环     CDDS_PREPAINT 准备开始绘制循环     CDDS_ITEM 指定dwItemSpec,uItemState,lItemlParam参数有效     CDDS_ITEMPOSTERASE 列表项擦除结束     CDDS_ITEMPOSTPAINT 列表项绘制结束     CDDS_ITEMPREERASE 列表项准备开始列表项擦除     CDDS_ITEMPREPAINT 准备开始列表项绘制     CDDS_SUBITEM 指定列表子项 } 常用CDDS_PREPAINT 与 CDDS_ITEMPREPAINT = CDDS_ITEM | CDDS_PREPAINT uItemState当前列表项的状态 取值及含义  {     CDIS_CHECKED 标记状态      CDIS_DEFAULT 默认状态     CDIS_DISABLED 禁止状态     CDIS_FOCUS 焦点状态     CDIS_GRAYED 灰化状态     CDIS_SELECTED 选中状态     CDIS_HOTLIGHT 热点状态     CDIS_INDETERMINATE 不定状态     CDIS_MARKED 标注状态 } Message.Result指向状态值的指针,指定系统后续操作,依赖于dwDrawStage:  当dwDrawStage为CDDS_PREPAINT Message.Result取 {     CDRF_DODEFAULT 默认操作,即系统在列表项绘制循环过程不再发送NM_CUSTOMDRAW。          CDRF_NOTIFYITEMDRAW 指定列表项绘制前后发送消息。      CDRF_NOTIFYPOSTERASE 列表项擦除结束时发送消息。      CDRF_NOTIFYPOSTPAINT 列表项绘制结束时发送消息。 } 当dwDrawStage为CDDS_ITEMPREPAINT Message.Result取 {         CDRF_NEWFONT 指定后续操作采用应用中指定的新字体。      CDRF_NOTIFYSUBITEMDRAW 列表子项绘制时发送消息。      CDRF_SKIPDEFAULT 系统不必再绘制该子项。 }
     
    
     
 
	 
	
    NEWBT官方QQ群1: 276678893 
    可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧. 
    但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件. 
    验证问题说明申请入群原因即可.