置顶随笔

     摘要: 姓名:陈碧惠Email: hui676@163.com电话:(86)1890-605-7061自我评价为人诚信,热情,能与团队成员有效的合作;热爱视觉设计, 对不熟悉的新技术能很快掌握, 并在项目中运用;熟悉Photoshop, Dreamweaver, Flash等设计辅助软件;熟悉 DIV + CSS,JavaScript等前端技术;对UI,UE设计有整体把握能力;工作经验(4 年+)2007...  阅读全文
posted @ 2009-07-21 21:49 micYng 阅读(630) | 评论 (1)编辑

2009年9月13日

前情提要:  http://www.cnblogs.com/lovesanni/archive/2009/09/08/1562844.html

前面说到模仿Control类自身的BeginUpdateInternal和EndUpdateInternal方法,封装各个控件都适用的基础类,先看代码吧

 1    class AvoidControlFlicker
 2    {
 3        private int _paintFrozen;
 4
 5        public void FreezePainting(Control toFreezeControl, bool isToFreeze)
 6        {
 7            if (null == toFreezeControl)
 8                throw new ArgumentNullException("toFreezeControl");
 9
10            if (isToFreeze && toFreezeControl.IsHandleCreated && toFreezeControl.Visible)
11            {
12                if (0 == _paintFrozen++)
13                {
14                    NativeMethods.SendMessage(toFreezeControl.Handle, NativeConsts.WM_SETREDRAW, 00);
15                }

16            }

17            if (!isToFreeze)
18            {
19                if (0 == _paintFrozen) return;
20                if (0 == --_paintFrozen)
21                {
22                    NativeMethods.SendMessage(toFreezeControl.Handle, NativeConsts.WM_SETREDRAW, 10);
23                    toFreezeControl.Invalidate(true);
24                }

25            }

26        }

27    }
代码很简单, 当需要"冻结" 控件对象时,由windows向该控件发送WM_SETREDRAW事件, 不需要"冻结"时,将该事件再发一次,改变参数即可,注意的是
1.添加一个计数器,防止多次发同一个消息
2.将控件"解冻"后,需要强制让控件重绘,即23行代码: toFreezeControl.Invalidate(true); 因为Invalidate方法是Control类自身提供的,所以可以直接拿来用了,其中true参数表示该控件的所有子控件也一并重绘了,false表示只重绘自身

那么,如果针对外部窗体怎么写呢? (不属于该进程的窗体,或者无法直接访问的窗体对象),拿windows任务栏来说,需要先获取它的句柄:
IntPtr taskBarHandle = NativeMethods.FindWindowA("Shell_TrayWnd""");
拿到句柄后就可以给它发windows消息了:
NativeMethods.SendMessage(taskBarHandle, NativeConsts.WM_SETREDRAW, 00); //禁止重绘
需要"解冻"时:
NativeMethods.SendMessage(taskBarHandle, NativeConsts.WM_SETREDRAW, 10);
NativeMethods.RedrawWindow(taskBarHandle, IntPtr.Zero, IntPtr.Zero, NativeConsts.WM_NCPAINT); 
//强制重绘

至于demo代码就很简单了, 在窗体的resize事件我创建了225个Button对象,如果不应用AvoidControlFlicker类,可以很明显看出窗体缩放时有大块的空白区域,实际效果在demo压缩包里有2个截屏视频比较,废话不多说, 点我下载

ps. 根据我测试的结果, 在vista上如果对任务栏禁止重绘,而没有启用重绘则后果很悲剧:鼠标点击之后根本无响应,还好能点击开始菜单; 在xp上暂不知晓,暂时没法找到xp环境
posted @ 2009-09-13 22:26 micYng 阅读(1820) | 评论 (5)编辑

2009年9月8日

适用场景: 

需要在某容器控件中动态装载多个子控件,而且该容器控件可能需要改变WindowFormState,即从Normal转变为Maxmized,或者是其他状态转换啦, what ever :)

如果没有应用任何特殊处理,你就会发现,当容器控件状态转换时,其上的子控件在经过一阵狂闪之后(可能背景控件颜色和自身相互交替出现),最终恢复至平静; 这种情形当然无论是程序员自己和客户都不愿意看到的

ok,废话一通之后,咱们开始解释原因,以及考虑解决方案

为什么会闪烁?

因为窗体控件状态转换时,windows需要负责"擦除"其背景,重新绘制,在一台性能并不优良的终端上(很大可能程度上客户端电脑都不是那么强劲吧) ,这个过程不是一时半会就能完成的,尤其对于很多个子控件的情况,因此就…

解决之道?

如果稍微写过WinForm程序的同学,肯定或多或少的用过ListView控件,简单易用嘛 :) 那么一定也知道该控件有2个比较有意思的方法:

BeginUpdate

Prevents the control from drawing until the EndUpdate method is called.

EndUpdate

Resumes drawing of the list view control after drawing is suspended by the BeginUpdate method.

从msdn的解释来看,这2个方法的应用能解决往ListView控件中分多次Add ListViewItem时闪烁的问题,ok,既然它能这么处理,咱们自己的容器控件为什么不能依葫芦画瓢呢?

btw. 其实我一开始也没任何好方法解决闪烁问题,后来偶尔想到ListView的此特性 :)

看看ListView.BeginUpdateInternal方法怎么写:

Code

关键一行在 this.SendMessage(11, 0, 0); 虾米意思呢? 它给自身Send了一个code为11的windows消息,11代表虾米?

在windows消息定义中可以看到 WM_SETREDRAW = 0x0B (0x0B也就是11),这行代码的意思是告诉windows对ListView控件停止重绘界面,直到显式要求重新绘制为止. 很牛叉对不对 :D
ok,在EndUpdateInternal中又做了虾米?

 

Code

 

同样有一行代码: this.SendMessage(11, –1, 0); 11还是同一个意思,此时告知windows可以重绘ListView控件了

ok,到这时候应该明白这2个方法含义了吧,也就是说对子控件的操作都是在一个“冻结”的状态中进行的,等到所有准备工作就绪,才对最终状态重新绘制,因此界面就不会出现闪烁状态.

如何依葫芦画瓢?

要知道不是每个控件类都有提供BeginUpdate和EndUpdate方法,所以需要自己亲自打造一个

1. SendMessage如何来? 从windows api interop而来,很简单,有个工具可以提供所有api函数到c#方法的转换: P/Invoke Interop Assistant

2.11这个定义以及类似的东东怎么找? 强大的google或者bing可以帮忙 :D

至于代码怎么写,就不需要偶来操刀啦 :D

 

后记:

这样处理之后,是不是发现闪烁从此就不再出现了?但是……还有问题

拿一个无边框窗体举例,当它从Normal状态变为Maxmized(顺便设置TopMost为true),你会很高兴看到该窗体包含的子控件真的不闪了,从Maxmized回到Normal时,也不闪了,但是很诡异的问题发生了: 任务栏不见了?取而代之的是当前窗体的背景色??? 难道任务栏没有重绘回来???

发生什么事情了? 不是只让窗体的重绘停止了吗,怎么会影响到任务栏窗口?

ok,解决办法是有的,发个消息给任务栏窗口让它强制重绘,怎么写?

同样,对于.net中的任何控件,都自带Invalidate方法,通过调用该方法,可以强制重绘控件的整体或某矩形部分, 又要画瓢啦

在Invalidate中可以看到这么一行

SafeNativeMethods.RedrawWindow(new HandleRef(this.window, this.Handle), (NativeMethods.COMRECT) null, NativeMethods.NullHandleRef, 0x85);

现在的问题是,如何获取任务栏窗口句柄?  bing一把就会发现,很简单: FindWindow(“Shell_TrayWnd”, “”);

ok, 后面的事情就简单啦

 

再后记

不难发现,Control对象其实是自带BeginUpdateInternal方法的,但m$很恶毒的把它弄成internal的了… 而且只被少数几个控件享用: ListView, ComboBox, DataGrid, TreeView

posted @ 2009-09-08 21:59 micYng 阅读(1730) | 评论 (20)编辑

2009年7月21日

姓名陈碧惠

Email: hui676@163.com

电话: (86)1890-605-7061

 

自我评价

 

为人诚信,热情,能与团队成员有效的合作;

热爱视觉设计, 对不熟悉的新技术能很快掌握, 并在项目中运用;

 

熟悉Photoshop, Dreamweaver, Flash等设计辅助软件;

熟悉 DIV + CSS, JavaScript等前端技术;

 UI, UE设计有整体把握能力;

 

工作经验(4 +)

 

2007/03 - 至今 富士通信息软件有限公司

主要职责: UI界面设计, UE交互设计, 快速原型制作

在职期间建立了整套UI界面和交互规范, 构建前端模板系统,使用Axure创建系统快速原型; 利用闲暇时间学习通过网页设计师认证

 

2005/11 - 2007/01 厦门博胜科技技术有限公司

主要职责: 网站美工设计,DM平面设计

 

2004/03 – 2004/09厦门奥博数码科技有限公司

主要职责:美工设计,海报设计,画册UI设计

 

软件,技术经验

 

Photoshop                          6

CorelDraw                           5

Adobe Illustrator              4

Dreamweaver                   5

Fireworks                            2

Flash                                      3

HTML/CSS/JavaScript     3


--------------------------------------
期待您的眷顾

posted @ 2009-07-21 21:49 micYng 阅读(630) | 评论 (1)编辑

2009年5月21日

我于2009年4月26日在贤贤网(贤智创富资产管理顾问(北京)有限公司)订下机票(2009年5月10日  厦门  -  北京),金额总计¥758.0元,包括机票+保险+10元快递费


订票成功后,因为其中涉及机票快递流程不清楚曾交涉过该网站客服,当时的答复是机票不负责送至客户,只是随其产生的保险单快递至客户,后来我的确通过该航班航空公司查询到机票已订成功,就暂时未曾催促贤贤网快递保险单


在2009年4月26日到2009年5月14日期间,没有该网站任何一位客服与我联系关于保险单和快递之事
2009年5月14日下午3:46,我又打通贤贤网客服电话,催促其快递保险单,客服的说法尽快帮我催促相关人员,(很抱歉,我不知道他们所谓的相关人员指何人),到今天为止,2009年5月15日我还未收到任何他们的电话以及保险单


我严重怀疑该公司利用客户在其网站订机票的机会,私吞客户的快递费以及保险单费用(虽然该费用不是很多,但一旦发生次数很多,也是一笔很大的金额),因此要求该公司给我一个合理的解释,并退回我的快递费和保险单费用,谢谢

另外还有其他真实案例,我两同事是天津人,经常需要乘坐北京至天津的城际列车,也在这家网站订火车票,去年有一次,要了我同事一人10块钱买车票手续费,说是买好之后给寄到公司来,结果到后来的结果是要我同事俩自己去北京南站去找该公司工作人员取票…

帖子地址:http://www.315ts.net/archive/tousu/2009/0515/377167.shtml

----------------后续分割线--------------------

5月19日下午6点多,我接到贤贤网工作人员电话,一开始态度还是很差,质问我是不是在315网站投诉过该公司,然后又说保险单号可以在保险公司网站查询到云云,总之就是以我不太清楚保险单兑现流程之理由向我非难,我反驳她我连保险单长啥样都没见到过,而且此时她个人的说辞与我最初联系他们时完全不一样,然后该工作人员才哑口无言,最后才说保险单已于下午寄出.... 

结果等到5月20日下午我才从公司前台取到快递,拿到快递后第一件事,便是按照保险单上的单号查询保单是否有效,结果被保险公司询问一大堆细节之后,告诉我的结果是无法查到该保险单信息…

还有,我拿到的快递单上清楚地写着快递费:5元…

----------------分割线结束---------------------

 

强烈推荐园友出行买机票啥的,要么就去柜台买,要么就去航空公司官方网站订,千万别去这种第三方垃圾公司买,更不要去贤贤网订…

 

类似投诉帖子:

http://www.ts12315.cn/article/4b/386.html

http://www.315ts.net/archive/tousu/2009/0211/305652.shtml

http://www.tianya.cn/publicforum/content/free/1/1484455.shtml

http://zhidao.baidu.com/question/94339736.html

http://www.dianping.com/shop/2987683/all

posted @ 2009-05-21 21:58 micYng 阅读(838) | 评论 (0)编辑

2008年8月15日

     摘要: 怎样解决FileSystemWatcher多次触发问题?  阅读全文
posted @ 2008-08-15 19:36 micYng 阅读(1972) | 评论 (1)编辑

2008年7月22日

     摘要: 局域网内文件同步的玩具  阅读全文
posted @ 2008-07-22 17:45 micYng 阅读(3383) | 评论 (10)编辑

2008年7月11日

     摘要: 沿袭上一篇的猥琐方法,贴一段用c#拨号的代码 1: class AutoDialer 2: { 3: public void Connect(string connectionName, string user, string pass) 4: { 5: string arg = string.Format("rasdial \"{0}\" {1} {2}", connectionName, us...  阅读全文
posted @ 2008-07-11 17:47 micYng 阅读(2100) | 评论 (2)编辑

2008年7月10日

     摘要: 1: class EnumLocalCollection 2: { 3: private List<LocalCollectionInfo> _infos; 4: 5: public EnumLocalCollection() 6: { 7: _infos = new List<LocalCollectionInfo>(); 8: } 9: 10: private stri...  阅读全文
posted @ 2008-07-10 18:15 micYng 阅读(1191) | 评论 (0)编辑

2008年7月7日

     摘要: [代码]不知道和Threading.Timer哪个比较效率高一点,但是有2点弊病是确定的,即: 这个类由于是事件通知客户类,在当前事件链下会影响下一次的循环,而Threading.Timer完全不会影响 而且Timer还可以用Change方法更改频率,在处理方法重入上比较好  阅读全文
posted @ 2008-07-07 15:58 micYng 阅读(918) | 评论 (0)编辑

2008年6月28日

     摘要: If no encoder exists for the file format of the image, the Portable Network Graphics (PNG) encoder is used. When you use the Save method to save a graphic image as a Windows Metafile Format (WMF) or E...  阅读全文
posted @ 2008-06-28 19:20 micYng 阅读(404) | 评论 (0)编辑

导航

公告

垃圾Comment,Spam杀无赦!

<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

统计

最新闪存

搜索

 

常用链接

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

相册

收藏夹

.Net Enterprise Library

.Net Remoting

ASP.NET

Blog Friends:)

C# category

C# forum&blogs

C# Toolkit

CodeSmith Usages

cPP related

Design Pattern

Opensource project

Pervious Blog

Useful tip

积分与排名

最新评论

阅读排行榜

评论排行榜