ImageVerifierCode 换一换
格式:DOCX , 页数:6 ,大小:18.15KB ,
资源ID:677085      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-677085.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(关于C#绘制qq好友列表控件Word下载.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

关于C#绘制qq好友列表控件Word下载.docx

1、上一个效果图左边那张图貌似忘了展示一个功能源码下载 个人感觉注释还是比较详细貌似这是第一次 直接继承Control写控件 以前都是UserControl 对于写控件真没啥经验 途中遇到各种问题 各种蛋疼 所以代码有啥不对的地方 多包涵- -!、其实 这里面有一个问题 就是TypeConverter哪里 不知道咋搞 不不用转换器的话 在窗体设计时候 向控件添加项的时候调用默认构造器 然后其余属性挨个赋值 所以自动生成的代码 非常臃肿 最开始写了TypeConverter但是没有果断窗体设计时自己都不生成代码了 经测试 转换器内的代码压根就没有执行 后来不知道咋搞的貌似有点反应了 不过编译就报错

2、说 属性代码生成失败 无法将XXXX转换为 XXXX.InstanceDescriptor 我就郁闷了 然后XX说 把程序集版本改成1 0 0 * 就可以 试了一下 确实没有报那个错了 不过又有其他问题 .XXXXXXXXXX.!¥%&U总之 p话不多说 由于没有这方面经验 希望哪位会的人士 给予一下指点到底要怎么才能让那个自己写的 TypeConverter 类正确执行 在窗体设计时候自动生成的代码 看上去和谐 虽然说 这东西一般都是程序运行出来动态加载列表的 但是在窗体设计的时候 手动添加项的时候 自动生成的代码真的很不和谐 虽然一般情况下也不去看但感觉已经不爽了.好吧 上面的都是

3、p话 只是希望有人能解决一下我的问题 现在来说说 我做这个控件的时候的感想吧 在做之前我在网上参考过一些也下载过两个 不过感觉真不咋滴(我指的是 我下载的那两个 不代表全部) 运行出来 亲一色的 全是企鹅头 这也就算了 还亲一色的只有在线状态 XXXX.!#¥ 我总结出来的就是 只以做的像为目的 压根就没有考虑过投入使用的问题 所以我在制作的时候考虑了要投入使用的问题(-!、其实是压根本来就要用所以才考虑到的) 比如图片上 每一个子项拥有一个 布尔 值来决定是否闪烁 还有不同的在线状态 而且还是按照状态进行排序的.现在来说思路 我在里面 分Item 和 SubItem Item就是看到的分组而

4、SubItem就是分组下的子项 所以我就搞了两个类 ChatListItem 和 ChatListSubItem 这两个类ChatListItem被控件包含 而ChatListSubItem 被 ChatListItem 包含 所以大概的代码就是csharp view plaincopypublic class ChatListBox : Control XXXXXXX public ChatListItem Items get; set; XXXXXXX . public class ChatListItem XXXXXXX public ChatListSubItem SubItems g

5、et; XXXXXXX . public class ChatListSubItem public int ID get; public string NicName get; . . 当然 真实情况下不是用的数组 这里 只是为了方便 这样 就有了一个层次关系 然后就是绘制的问题绘制的时候在 OnPaint 中循环Itemscsharp view plaincopyprotected override void OnPaint(PaintEventArgs e) for(int i = 0;i < Items.Count;i+) /循环绘制每一个Item DrawItem(itemsi)

6、; /绘制Item if(itemsi.IsOpen) /如果Item的列表是展开的 那么还得绘制他的子项 for(int j = 0;j & Itemsi.SubItem.Count;j+) DrawSubItems(Itemsi.SubItemsj); /绘制子项 大概也就这样 不过里面还要计算区域 不能每个Item或者SubItem绘制的时候都重叠到一起啊 所以代码改一个就成这个样子csharp view plaincopyprotected override void OnPaint(PaintEventArgs e) Rectangle rectItem = new Rectangl

7、e(0,0,this.Width,20); /假设每个item的高度是20 这是第一个的 Rectangle rectSubItem = new Rectangle(0,21,this.Width,50) /假设每个SubItem高50 这个是第一个的 21 是在Item标题下移动一格像素的 for(int i = 0;i+) /循环绘制每一个Item DrawItem(itemsi,rectItem); /绘制Item 增加一个参数 if(itemsi.IsOpen) /如果Item的列表是展开的 那么还得绘制他的子项 rectSubItem.Y = rectItem.Bottom + 1;

8、 /这个是展开的第一个的子项 那么他的位置 就该是Item标题的下面一个像素 for(int j = 0;j+) DrawSubItems(Itemsi.SubItemsj,rectSubItem); /绘制子项 增加一个参数 rectSubItem.Y = rectSubItem.Bottom + 1; /计算下一个子项的区域 rectItem.Y = rectSubItem.Bottom + 1; /子项绘制完 那么该计算下一个Item的坐标 else rectItem.Y = rectItem.Bottom; /如果没有展开 那么下一个item的坐标就是上一个Item的下面一个像素 这样

9、绘制上 基本没有啥问题了不过 这也只是绘制出来了而已 你还得在上面操作 比如鼠标点击一个子项 你用什么来判断鼠标点击了一个子项?所以还得把每个Item和SubItem绘制在什么地方记录下来 到时候用鼠标坐标去比对所以不管是ChatListItem 还是 ChatListSubItem 都要在他们里面加一个 Rectangle 类型的属性 每绘制一个Item或者SubItem 的时候就把那块区域赋值过去到时候就用Rectangle.Contains(Point)来判断鼠标到底在那一块区域内所以就有了我代码中的csharp view plaincopyfor (int i = 0, lenItem

10、 = items.Count; i & lenItem; i+) DrawItem(g, itemsi, rectItem, sb); /绘制列表项 if (itemsi.IsOpen) /如果列表项展开绘制子项 rectSubItem.Y = rectItem.Bottom + 1; for (int j = 0, lenSubItem = itemsi.SubItems.Count; j & lenSubItem; j+) DrawSubItem(g, itemsi.SubItemsj, ref rectSubItem, sb); /绘制子项 rectSubItem.Y = rectSub

11、Item.Bottom + 1; /计算下一个子项的区域 rectSubItem.Height = (int)iconSizeMode; /大图标小图标模式的高度 rectItem.Height = rectSubItem.Bottom - rectItem.Top - (int)iconSizeMode - 1; /这里之所以给rectItem高度重新复制 是因为 SubItem 是包含在 Item 内部的 /所以rectItem的高度就是 他标题的高度 加上他内部所有子项的高度 把他所有的子项都圈起来 itemsi.Bounds = new Rectangle(rectItem.Locat

12、ion, rectItem.Size); rectItem.Y = rectItem.Bottom + 1; /计算下一个列表项区域 rectItem.Height = 25; 每个item和subitem有了一个自己的区域后 那么要判断鼠标是否落在他们某一个区域上就方便了csharp view plaincopyfor(int i = 0;i+) if(itemsi.Bounds.Contains(MousePoint) /如果鼠标位置在 某一个item上 if(itemsi.IsOpen) /判断该Item是否为展开的 for(int j = 0;j+) if(Itemsi.SubItem

13、sj.Bounds.Contains(MousePoint) XXXXXXXX.; return; /鼠标位置只可能在某一个Item 或者 SubItem 上所以找到一个后处理完事情直接return /如果该项又是展开的 循环完子项却又没有找到符合条件的子项 那么就极有可能鼠标位置在标题上(因为每个Item或者SubItem有一像素间隔) if(new Rectangle(0,Itemsi.Bounds.Top,this.Height,20).Contains(MousePoint) .; 主要思路 也就差不多是这些 怎么绘制 绘制后取得相应区域 剩下的就是一些细节上的功能 还有滚动条 对对对

14、 滚动条 所以在绘制的时候 要根据滚动条进行y坐标的一个偏移g.TranslateTransform(0, -chatVScroll.Value); /根据滚动条的值设置坐标偏移这个是我控件中 完整的OnPaintcsharp view plaincopyprotected override void OnPaint(PaintEventArgs e) Graphics g = e.Graphics; g.TranslateTransform(0, -chatVScroll.Value); /根据滚动条的值设置坐标偏移 Rectangle rectItem = new Rectangle(0,

15、 1, this.Width, 25); /列表项区域 Rectangle rectSubItem = new Rectangle(0, 26, this.Width, (int)iconSizeMode); /子项区域 SolidBrush sb = new SolidBrush(this.itemColor); try for (int i = 0, lenItem = items.Count; rectItem.Height = rectSubItem.Bottom - rectItem.Top - (int)iconSizeMode - 1; itemsi.Bounds = new R

16、ectangle(rectItem.Location, rectItem.Size); g.ResetTransform(); /重置坐标系 chatVScroll.VirtualHeight = rectItem.Bottom - 26; /绘制完成计算虚拟高度决定是否绘制滚动条 if (chatVScroll.ShouldBeDraw) /是否绘制滚动条 chatVScroll.ReDrawScroll(g); finally sb.Dispose(); base.OnPaint(e); 也就是 在绘制控件的时候 坐标就不是 0 0 左上角位置开始绘制了 而是一个 0 Y 的一个虚拟的坐标

17、了 Y 的值是由滚动条决定的 所以在判断鼠标落的区域的时候 也有点变化了 Rectangle.Contains(MousePont.Y + 滚动条的值);还有就是 离线 离开状态什么的 这些都是枚举值 然后ChatListSubItem实现一个排序接口 按照他们的顺序排序就可以了其实 枚举值 也就相当于 int 值所以在 定义枚举类的时候 把顺序搞定 对SubItem排序的时候 按照一个升序排序就搞定了 这个和普通的排序没啥区别还有就是 头像闪动的问题 在SubItem里面有一个 布尔值 来决定是否闪动 不仅是它 它所属的Item也的有关联 (在定义ChatListSubItem类的时候里面有

18、个ChatListItem类型的一个Owner属性来表示该SubItem是属于哪个Item的 Item 同理有一个表示属于哪一个ChatListBox控件的 因为 在这些类中的一些操作要引发控件的重绘 所以要把他们一级一级关联)因为 列表关闭的时候 头像没有办法闪动 所以只有列表标题闪动 所以在ChatListItem类里面 还定义了一个 计数器保存在它列表下的子项闪动的个数 重绘的时候 如果列表关闭 计数器不为0 那么闪动列表标题 如果列表打开 那么闪动头像 当然在给ChatListSubItem的那个决定是否闪动的属性赋值的时候 响应的也要给所属的Item的计数器 进行操作对于这个控件 我

19、暂时能想到的就这些控件自身功能 然后就是给用户的接口了我里面只定义了上个自定义事件 因为想了一下 在实际应用中 也就只有这三个有用双击一个列表中的子项的时候 (QQ的话就弹出聊天对话框了) 【DoubleClickSubItem】鼠标移动到一个子项的头像上面 (QQ这个时候 坐标出现一个小窗体 来加载该用户的一些资料) 【MouseEnterHead】鼠标离开该子项的头像 (QQ的画 那个小窗体就消失了) 【MouseLeaveHead】不过 我还是希望有谁能 解决一下那个TypeConverter的问题 虽然感觉没啥用处 不过 心理上却感觉不爽源码连接等资源通过在上传上来吧!、分享到: 上一篇:C#制作内存修改器

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2