登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: 使用.net c#自给制ListView控件(基础第一篇) [zt 可用做编写 sdk 时的参考]     [回主站]     [分站链接]
标题
使用.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
2008-4-17 21:45:51 发表 编辑

使用.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 系统不必再绘制该子项。
}


总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1