准备开始支教~

明天就要去见小孩子们了!就要当十天孩子王了~

我是实验课小组的一员。

虽然应用对象只是初一到初二的小孩,虽然我未来并不会选教师这个职业,虽然这次只是一次青草夏令营举行的活动……但是还是要认真对待啊。我期望的是,小孩子们认认真真听讲,从中能获取一些对他们将来有益的东西。

记得两个月前看中央九台的《新青年》,其中一集讲“中国花样调酒皇后”郑雯。我说,为什么我记住了这个人呢?郑雯在某电影里饰演一个配角,开拍之后认为服装太暴露,要求更换。她说:“我是一个老师,我要为人师表,有个老师的样子。”我一直对技校持比较鄙视的态度,听了这句话之后觉得,有些人还是不可小觑。所以我也要把这句话作为一个准则记住,有什么身份就要坚守什么身份的道德。

很期待明天~(哦,今天……)

分享到 评论

Astraea's Caroline 更新数据

UD 2012年9月15日

LT http://dx.kukai.cc/downfile.php?file_id=116425&file_key=o54yht02&uid=

EL ‘End log

注意:编辑地址时要取消超链接


2015-04-08 附注:原地址为 http://hi.baidu.com/micstudio/item/ff17cde06a210f226cabb8ea

分享到 评论

我的空间轨迹!

Six years

6年很长,6年很短,6年留下太多瞬间!

2010年02月13号,我在百度空间安家,截至目前我的空间访问量达到 5773次

2010年03月 7号,我在空间发表第一篇内容

我已记录 37 篇内容,共计 7 个标签分类

感谢空间好友这些年的陪伴,愿我们在这里共同记录每个6年的精彩!

6周年我们重新出发>>

分享到 评论

关于我的梦游……

昨天去参加青草夏令营的培训,小组备课。之前一天呢,我晚上看电影看到第二天(星期五)早上8:15,睡觉,起床时是10:15,全速赶到广州青年文化宫,生龙活虎地备了上午两个小时+下午三个小时课。回到家(约18:20),打开电脑,碰到 Visual Studio 2012 RC 更新,比较慢,看着等待屏幕,想躺在沙发上休息一下,结果直接睡着了(19:00)。

这是前奏。

然后今早起来,发现自家鞋柜旁边有一箱荔枝。忙问我妈怎么来的。她说:“是你抱上来的啊……”

天,我昨晚一直睡觉,连自己吃饭没有都忘了……愿闻其详……

原来,昨晚我妈接到电话说一个家长要送一箱荔枝来,就叫我(还睡着呢)下去拿。平时我都不会下去的……结果睡梦中的我(潜意识控制着)迷迷糊糊地答应了,连衣服都没换(因为回来时暴雨,所以把长裤换了,光膀子,光着脚,穿出门用的短裤[不是NK]),就下去了……然后拿到荔枝之后又坐电梯上来……到了家门前“妈……开……开门……”进家门之后放下荔枝又跑到沙发上睡着了……不对,这个过程中我一直没醒过……

天啊,我太强大了~

分享到 评论

WTF?!

重装系统之后 VS 2010 就崩溃了,IDE 启动时都报错。唉,重装吧。

用[程序与功能]一项一项卸载 VS 2010,卸载到 VS 2010 SP1 安装包的时候居然蓝屏了!

我勒个去……

重新启动系统之后,VS 2010 说什么都装不上。

Screenshot

至于 SP1 包……我已经看它不爽,手动删除了(包括注册表)。

这意味着我没法用 .NET Framework 做开发了!

以及, Astraea’s Caroline 要延期……

P.S.: 如果有大神能解决一下这个问题,请留言,谢谢。我已经试过的方法有:用管理员权限运行解压之后的文件;用 sfc /scannow 命令修复系统文件。


后记(2012-07-18):

前几天我上 MSDN 问人,回答的人看了错误报告,发现是 VC 10 Runtime 的 hash 错了,叫我用 VS Web Installer 安装,之后果然好了。不过……现在还是无法安装 SP1:什么叫“计算机的状态不支持安装”?!

分享到 评论

分享:Windows 7 正版激活工具

今天和昨天晚上,我一共花了6个小时找一个 Windows 7 的正版激活工具(呃,因为我是用一个非官方镜像安装的)。我的计算机是联想昭阳E23,原装 Windows Vista,然后被我装了 Windows 7……

好了废话不多说。在经过苦苦寻找之后,我试过用 KMS 激活、用 OEM 激活(当然,SLIC 要改),以及电话激活(“您的 Windows 版本无效,请购买一个正版”…… = =),但是卡在了找 BIOS 文件这一块。我差点就真的要用硬破解的方法了……

然后突然发现了 OEM7 这款软件,真正的一键安装(当然我属于高级用户,还是配置了一些高级选项),直接忽略 SLIC~重启后居然就正版了……

我的评价是:傻瓜化的操作很适合大众。

这么好的东西怎么能不分享呢?免得以后有人沿着我的老路走,费时费力。

115网盘上传:http://115.com/file/an7nniq5

分享到 评论

MIC恶搞——发扬学霸精神!关于模拟人生2神奇地违反遗传学定律的问题~

这是一个非常邪恶的操作~

在模拟人生2中自交,并以此为基础,展开一项科学实验。

嗯,估计这么睾科技的东西,不是很多人会的吧。那么我来讲解一下步骤。

  1. 打开模拟人生2,选择一个城镇,然后在主界面按下 Ctrl+Shift+C,输入“BoolProp TestingCheatsEnabled True”;(问:这是怎么来的?答:在正版的碟里有,在 Readme.txt 里面。这告诉我们,要尊重他人的劳动成果,你才能见到好东西~)
  2. 选择一个家庭进行游戏。确保那个家庭里至少有一个成年女性A;
  3. 随便等A走到哪里,然后按住 Shift 左键单击她,选择[更多…]->[Spawn],选择 Tombstone of L and D(以下简称 TLD),就会跳出一个类似墓碑的东西。至此我们就打开了一个程序员的后门;(向 The Matrix 致敬!)
  4. 把 A 切到主角,左键单击 TLD,选择[更多…],然后选择[Make me pregnant with…],选择自己;
  5. 然后听到表明 A 有喜了的声音,再用 TLD,选择[更多…],选择[Speed up my pregnancy],过不久 A 就会生下一个小孩了;
  6. 观察并记录实验结果,包括小孩的各种性状,特别是性别;
  7. 重复步骤4~6多次(经检验,最多是4次,之后 A 就会绝育……);
  8. 分析实验结果。

结果:通过这样的繁殖方式,后代都是雄性的~这算是一个自然界的平衡么(雌性过多的时候就会有雄性出现。如,红腹水虎鱼,在群体里没有雄性时最强壮的雌性会变成雄性)?

但是请注意,后代中的 Y 染色体是从哪里来的?

通过类似的方法,我们可以进行杂交-自交-测交实验,以验证孟德尔的两个实验定律。(实际上游戏部分违背了实验定律。)

经过实验,另一些实验结果是:

  • 当 P 自交产生 F1 之后,P 与 F1 的杂交后代雌雄比例接近1:1;
  • 然后 F1 之间进行自由交配,后代性状与使用基因频率计算的结果吻合;
  • F2 经过实验,也出现了类似上面一行的结果。

请大家自行根据上述事实作出结论。(6分)

综上所述,模拟人生2的遗传系统不完善。

分享到 评论

这才是优秀的中国学生!

一个可以气死日本人的中国学生!这就叫文采,不愧是学国际关系的。 看完后记得顶贴哦~

6月19日,日本共同社记者小泽一郎到北大进行突击采访。在南阁(国际合作部)门口,小泽一郎采访了一小个子男生(后证实该男生为国际关系学院学生)。
以下是现场原版真实问答记录。

问:你支持抵制日货的这种观点或行动吗?
答:每一个人都是一个个体,每个个体都是自由的。我无法左右别人的思想,也无权控制别人的行动。
问:你如何定位中日关系?
答:客观定位,平等互利关系。
问:从学生的角度看,你认为两国关系中最大的障碍是什么?
答:显然,日方在很多方面做出了错误的言论和举动,而这是我们不能接受和容忍的!一句话,改善中日关系需要日方正视历史,拿出善意和诚意。
问:你个人使用日货吗?
答:有,马桶。(在场学生大笑)
问:那你告诉我,为什么日本的马桶会比中国的好?
答:在中国,这种话题是不登大雅之堂的,在公共场合提论这种话题是很变态的。(笑声)当然,我不知道是你有这样的嗜好,还是贵国有这种习惯。(笑声)
问:关于历史问题,中日两国是否有途径可以卸下这个沉重的“包袱”?
答:请注意你的用词!我不同意你的这种说法。你的这个问题本身就在诬陷中国。自古至今,中国从不存在什么“沉重包袱”。中华民族是心胸开荡,豁达前瞻的优秀民族,宽厚待人,睦邻周边是中国的美德。因此我们正视历史,但绝不以怨抱怨。我们容忍和解,包括对待日本。请问,中国和中华民族的历史包袱是什么?中国人民做过对不起日本的事吗?问题恰恰是侵略中国、犯下滔天罪行的日本不正视历史,在中国烧杀掠夺,疯狂地要灭绝中华民族。犯罪的日本不向中国和中国人民认罪赔偿损失,还要叫嚣海外出兵扩疆,分裂中国,霸占中国国土,激怒中国人民。这样的史实太多。请问,这是中国背历史包袱吗?(在场学生鼓掌)
问:我也经常看新闻,最近一段时间,中国生产事故频发,死亡率想必不会低吧?
答:同你们国家一样,每人死一次。(笑声、掌声)
问:在中国大学校园里,学生自杀频繁发生、屡禁不止,这是为什么?
答:事实上,学生自杀最多的是在你们国家。许多稀奇古怪的自杀方式就是你们国家的自杀一族发明的。在联合国公布的相关资料中,日本的自杀率排名世界第一。我不知道你手上有什么足够的证据来证明我国的校园自杀事件。主席有一句名言“没有调查就没有发言权”。希望你做客观真实的报道。对你刚才提问中使用的词语我有必要纠正,在中国汉语语法中,“频繁发生”和“屡禁不止”是重复累赘,用词错误。而且,你的说法不符合事实!(掌声)
问:在日本留学的中国学生非法窃取日本的机密情报,你知道吗?
答:我无法核实你的消息的准确性和真实性。这种荒唐说法就跟布什打伊拉克是因为萨达姆偷了布什家的高压锅一样可笑。(现场大笑)

原文地址(CSDN)

分享到 评论

Astraea's Caroline 正在编写

主界面截图

Screenshot 1

Screenshot 2

Screenshot 3

部分代码基于之前的 Z-Abby,不过更换了内核。

预计7月15日放出 Release。


2012-07-18:已经正式发布!界面改变了。

请见:http://hi.baidu.com/micstudio/item/3bc406d70627891a21e250b0

分享到 评论

前来的HF同学请注意

某些同学注意了,不要曝光我的身份!

以及,非理性审视是应当禁止的。

分享到 评论

毕业游随感

我正在和另外34个同学在一个岛上进行毕业旅游。明天……不,今天上午我们就要离开,这意味着至少3年(我们之中有不少6年)的同学最终最终要离别了。我很想把这两天半记录成什么(虽然不大可能),然后不断地过,不断地过,直到有一天我不想再过了为止。我真的是不忍心看到离别啊!

最有趣的事:我改动了一下宾馆的数字电视设备,用这个来上网,就是现在。没有宾馆的人发现了……

因为这是非正式的出游,大家都穿着日常的装束。一些同学(大多是女的)的头发等等不用再符合学校的要求,于是她们换了发型。平时大家穿没有便装的机会(长住生在周末除外),现在看起来大家都不像原来的大家了。(说真的,一些女同学确实很美观,或者说,漂亮;虽然不能称之为美若天仙,但是用网络语言说,养眼。或者说,那一刹那就怔住了。)唉!以后见不到大家的这些样子了!

而且,受益于“非正式”这个性质,没有老师管理,同学们之间的气氛和以往也不一样。真的……最主要的是亲昵的显现。嗯,这种感觉大概是由于至少3年的同学关系培养了感情吧!以后即使在大学,“同学”的性质也会发生变化,变得更加松散、没有凝聚力。那时毕业不知如何呢?更何况大家的心智也发生了变化,看人也不会再有现在的感情了吧。

分享到 评论

与两个同班女生有关的记忆碎片

写在前面

我一向被认为使很保守的。我听过我的一位同学说:“我姐(就是下文第一位,我们班那些乱认亲戚的情况非常混乱)说,小的时候你没有这么害羞的,越大反而越保守了。”呵呵,不敢当不敢当。自从觉察到这些心理的发展,我必须表现成这样以抵御它们,这样才能隐藏住我的想法。我的内心其实是很浪漫的(没开玩笑)……而现在,既然大家要分开了,那么公布我的一些历史也就无伤大雅。

我要写的,是关于我的两位同学——更加确切的说,是两位女同学的记忆碎片。她们,虽然大家已经高考完要分开了,但是已经给我留下了很深的记忆。我想说,不管她们是否喜欢过我,我曾经关注过她们,这是一个事实,烙在了历史上了。


XT:

她的名字与我的名字,两个字符串最后一个字发音相同,所以老师经常会把我们这两个字搞乱。一般来说,是会把她的那个字打成我的那个字。但是有一次——就那么一次,在临考的一次作文讲评上——老师把我的那个字打成了她的那个。当然,两个字读音相同这一点在初中就被那些不怀好意的家伙们发现了,他们最喜欢的就是叫“×××××,*”了,然后全班大笑(老师听着应该能听出来什么意思,不过一直没有明令禁止……)。所以我一直都很抗拒这句话。到了最后,我发现我还是喜欢她的。唉!这样的机遇有多少呢?小学的一个同学在毕业册上对我说:能碰上一个同月同日生,又是同姓的人真是太不简单了。那么碰上这样的女生的几率又是多少呢?

其余的记忆好像都跟升旗有关。

我们班高一时曾经是国旗班(正如我之前的一篇日志写的),其中我(升旗手,男的),XT和XK(护旗手),ZY(号手,这个可是男的)是一个小组的。XT在右(以面对旗杆时为准),XK在左。当我把国旗从旗箱里拿出来右转(规定永远不允许左转),走向教室前门的时候,XK的脸被墙壁挡着,XT则面对着我……这个时候,我的感觉真的是太美妙了。但是我知道,我必须隐瞒这些思想。然后走着走着,走上升旗台,护旗手再走上升旗台上的白色台,转身。这是我就递旗,理旗,然后将末端卷好握成一团,右手放胸前,左手垂下,立正。当两位护旗手把国旗的扣子扣好之后我就把国旗团给右手边的那个人——如前文所说,就是XT。这个时候,我的感觉也是非常美妙的……最后就是吹哨,等待报告,升旗,转身,下升旗台,解散。

有一天,好像就是我们班开始担任国旗班的第二还是第三周,在准备出国旗的时候(我们教室里只有我们小组4个人),她突然笑着(对XK)说:“我昨晚做了一个梦,梦见××(鄙人),捧着一摞书给我……”我当时还是当什么也没发生(必须的,要不然……太不合礼法了吧……),含糊着就过去了。现在想起来,可能她说的是真的吧;如果是,那么这应该算是我和一个女孩子在心灵上处过的最近的距离了吧。之后,这种事情再也没有在任何人身上发生过。唉!无限的怀念。

当下午下雨、国旗被淋湿的时候,晚上我们就需要晾国旗。方法是将国旗白色(靠近旗杆的)那一边置于黑板上面的平台上,另一端置于讲台上,然后用一些词典之类的厚书压好。一般来说,我们班不是全员晚自习的,而晾国旗的(必须是升旗手)就更少了。我高一时一般也不在学校晚自习,除了星期五晚上,因为那天晚上我会去参加AI社的活动,简单说就是机器人制作和编程。好了,不扯闲话。我期盼的(呵呵,说不上最,但是还是有一点)就是那天晚上下雨了。晾国旗的时候,我们先全体肃立,然后第一个升旗手把国旗拿出来,接着两个升旗手都面对教师后墙,盲视递旗,展旗。展旗的速率要一致。当国旗展开了一定的长度之后,护旗手要把旗角捋起来,放到讲台上,拿书压着。然后护旗手摆好两张凳子,升旗手就踩上去(仍然要步调一致),继续展旗,知道展开完毕,把国旗一端用手压住,右手接护旗手递上来的书(都是盲视操作),用书压好国旗,下凳子,立正,结束。任何人都不允许从国旗下面穿过,要经过讲台就必须绕道。收的时候基本上是这个过程的逆过程。我想起这个的原因是,如果哪天我负责晾国旗,她一般就是递给我书的那位护旗手。哦,还漏了一点,所有人,包括升旗手、护旗手和号手都是要戴白手套的~不知你们有没有体验过那种感觉……我无法表达,就是觉得有一种莫名的激动,我只能这么说吧……


XK:

我曾经试过进入她的圈子,但是到了最后,我还是发现那不适合我。身为CC,我绝对不想往污水坑里跳!一开始我肯定是被迷了眼了。现在反省一下,还是觉得里面有一些值得留念的东西。

开始交流的时候,我们在学农期间互发短信。那时我还在用着我妈淘汰下来的旧手机,白色、厚厚的三星翻盖手机。我总是会发一条短信,等啊等啊,就在等那指示灯闪烁着红色。这表示有短信来了。那是一种多么值得怀念的等待啊,每一次见到灯亮起我都会小小地高兴一下,如果长时间没亮我反而觉得有点焦急。有一次,我问道:“你们那里需要割禾吗?”她说:“你随便吧。”过了一会我听到她那里似乎需要割禾,就拉了几个同屋的同学一起跑过去了。那时正是高二期中考试之前(回去过两天就要考试),大家伙都恨不得在屋里呆着自习呢。我为什么会做出这种举动……难道就是因为我当初以为是她认定的,而值得牺牲一些什么吗?这个例子教育我们,保持理智很重要……

到了那一年年末,我们准备举行新年班会。我作为计算机技术强人,要做一个程序。当时我正好没有带以前的程序的代码,因为里面可能要用到如 Auto Presentation Assistant(呵呵,自制的)等需要慢慢调试才能完成的程序的代码。因此我晚自习上课开始写,到了晚自习第一节下课(1小时40分钟)还在写及调试。班主任说:“不要花太多精力在这上面了啊。”我倒觉得编程是一件很快乐的事情,但是编程很费时,我必须承认这一点。晚上我发短信说:“今天的效率太低了。”她的回复我还记得清:“看你从上课开始搞,用了这么久,我有点担心你的身体。”我接到短信的时候吓了一跳!

后来我有一次看《星际迷航》(2010年电影版)的时候,我看着序章(intro,就是引入故事情节的那一段),不禁YY我留守在船上……呃呃呃,很不现实对吧。

她还抹过护肤油(估计许多女生都在公众场合做过吧)。我故意问她那是什么味道,因为我就是喜欢听着一些句子从她嘴里出来。我本来还想狠狠地嘲笑这种过度防护的行为,最后顾及和谐还是没有说出来。嗯,估计她还没有识破过。

最令我感动的是两类三件事。前两件是暖手的……我只记得其中一次经过了。高二的冬天,晚自习过20分钟才开始,这时大家都在闲聊。我不知道当时每个人都说了什么,然后她就走过来,一把把我的左手抓起来,把她的手伸进我的袖子里(我们当时大多穿冬装,长袖校服)。如果推论没错,她的体质应该属于极寒的那一类;我的体质是极热的,到了冬天也不会觉得冷。我就感觉她的手冰凉冰凉的,于是想把我的手缩回来。但是她抓住了,说:“哇,好暖啊!”整个就把我的手(科学一些,是小臂)当成暖炉了。我敢肯定,当时我的脸看起来绝对像熟透的番茄!第三件事发生在高一的冬天。晚自习第一节课下课之后,大家自由走动。我跑到教室后部的公告栏,去看一些通知。当然大家还是穿着长袖。我正看着,突然感觉衣领被人翻动了。我那个时候真的就跳了起来,“啊”地大叫了一声,准备肘击来犯之敌。结果听到她说:“嗯嗯?我看到你的衣领乱了,帮你整理一下,有必要这么紧张吗?”好嘛,脸又要像大番茄了……我只好乖乖地让她整理完,她还拍了几下。一直到高二末这段时期是我们相处(注意:还是一般关系)最好的时期,后来她的思想发生有害变异,我曾经试过把它拉回正轨,但是此时另一个人介入了。我没法抗击两个人,在坚持了两个月之后还是决定抽身。


这就是有关她们的一些故事。我把它们记录下来,希望最终有人知道我曾经的想法。这并不意味着我对其他人没有过观察,不过数据更少一些,无法得出有效结果。

但是在真正到了那个时候之前,我只能说:我曾经对你们有过好感,但是因为责任,我不能把我的想法说出来,以至于平常我的表现有些奇怪,愿你们原谅我。


2015-04-08

今天搬运过来的时候读到第一段,一看就记起来了,那话不是LZX说的嘛。

分享到 评论

高考结束~

高考结束,更新要开始啦!

分享到 评论

声明

因即将面临高考,我无法使用电脑(家长控制。现在我就在用手机),所以博客更新缓慢。软件与技术帖、杂文都会到时更新。

望各位为高考的学子们加油!

分享到 评论

新的同桌

我终于做了一个实验——

从小学开始,18任同桌全是男的。而我呢,比较保守,确实比较保守,除了公事,其他时候不会主动和女生挑起话头,而且对话完全是为目的服务的(即不会去闲谈)。

好吧,既然我的高中生涯还有几个月就要结束了,我就体验一下和女生做同桌的感觉。于是乎,我就在换位的时候提出了申请啦。

这是一个破天荒的举动啊!之前我都是“你把我安排到哪里就哪里”型的,更何况这次还要求和一个女生同桌呢!

Anyway… 那天投影仪坏了,老师直接读出新的座位表……呜呼……我的新位置立刻就被公开了……不要啊……

反正第一次和女生做同桌的经历就这么开始了。

一句话,压力。嗯,一切都要谨慎,再谨慎,细节很可能透露一些信息。所以绝对不能出差错!还有,以前我可以因为一个成功而大笑,拍同桌的肩膀,但是现在可不行;以前可以随便开同桌的玩笑,可以在相互损人自己损不过的情况下掐同桌的肩胛骨逼迫其就范,现在不行。唉,这不行,那不行,如何是好?所以所谓 restricted,大概就如此了吧。

Whatever…

嗯,还有有一些不好的是,她比较喜欢玩手机,你可以想想做题的时候旁边一个人拿着手机上网你是什么感受。不过她很聪明,这我承认,刷题速度比我快 - -! 而且……计算错误几乎为0。(你要问:“计算不是很基本的么?”唉,我被老师评价“眼高手低”,就是方向没问题但是总是因为计算的失误而得出奇奇怪怪的答案。一个问题有时要算三四遍才对……)

作为一个完美主义者(至少自认为),压力真的不是一般的大……

就正常的推理得出,玩手机的后果就是休息不好。

有一次,是第三节课和第四节课之间的30分钟休息(我们学校的课程表就是如此),她用手肘捅一捅我,说:“过15分钟叫我起来。”这就是“经历”了,如果我没有提出申请,所有的一切我都不会知道。她说完之后就用手枕着头睡在桌子上。我在做题,回答了一声。

不知大多数有这些经历的人来说这怎么样,总之我的感觉是很奇妙的。如此安静——就这么躺着。如果这是一张照片的话(应该不难想象吧),那就是在旁边的人谈话、走动的时候(模糊),两个人,一个在做题,另一个在睡觉,就这么静静地。这种感觉……真的很难体会到。

如此唯美。就像水晶玫瑰(恶搞一下,Photoshop 教程里有“水晶苹果”咧),正所谓“捧在手心里”。这是 CCN 的通病么……?Never mind. 总之她也是非常独立的,并不需要过多的关心,我很清楚。

唉!这样的心情,以后还能体会到多少呢?

在写了这么多技术日志之后,就写一篇比较情感化的东西吧。


1-28

之前有一段时间……唉,不知道怎么说好……算了,过去的就过去了吧。总之我一向是有理的就行了。


2012-10-14

根据 2012-10-12 的谈话,之前的……从2011年12月到2012年3月,那是一场误会,很大很大的误会,但是我们都没有说过,直至相互“不认识”……所以,就是现在的这个样子。

对“关于两个女生的记忆碎片”一文中,“她的思想发生有害变异”一句对她造成的损害表示歉意。

分享到 评论

Zinc 技术披露

涉及的几项技术:

  1. Aero 效果的实现
  2. ListView 控件的系统风格化
  3. 控件默认使用 GDI+ 绘制文本
  4. 异步数据传输
  5. 全局热键的使用
  6. 在 .NET 中使用回调

一、Aero效果的实现

关键 API:

窗体的扩展样式必须带有 WS_EX_LAYERED,并部分(或全部)透明,因为 DWM 只会在窗体透明的部分进行渲染。

Declare Function DwmExtendFrameIntoClientArea Lib "dwmapi.dll" (ByVal hWnd As IntPtr, ByRef margin As MARGINS) As Integer

函数讲解:将 DWM 的渲染范围向窗体内拓展。hWnd 为窗体句柄,marginMARGINS 结构,表示拓展的量。MARGINSRECT 本质上相同,但是 MARGINS 表示向内范围,RECT 表示向外范围。

Declare Function DwmEnableBlurBehindWindow Lib "dwmapi.dll" (ByVal hWnd As IntPtr, ByRef pBlurBehind As DWM_BLURBEHIND) As Integer

函数讲解:启用窗口的 DWM 模糊渲染。hWnd 为窗体句柄,pBlurBehindDWM_BLURBEHIND 结构,指明如何进行渲染。

Public Function DwmIsCompositionEnabled Lib "dwmapi.dll" (ByRef enabledPtr As Integer) As Integer

函数讲解:判断DWM 渲染是否已经启用。enablePtr 为是否已经开启的判断变量(注意传址的方式),enabledPtr 返回1为已经启用,0为未启用。

关键常数:

'是否只是渲染区域
Public Const DWM_BB_BLURREGION As Integer = &H2
'是否启用渲染
Public Const DWM_BB_ENABLE As Integer = &H1
'最大化窗口时是否渲染
Public Const DWM_BB_TRANSITIONONMAXIMIZED As Integer = &H4

关键结构:.

Public Structure MARGINS
    Public m_Left As Integer
    Public m_Right As Integer
    Public m_Top As Integer
    Public m_Bottom As Integer
End Structure

结构讲解:四个数值分别是四周向内拓展的大小(以像素为单位)。

Public Structure DWM_BLURBEHIND
    Public dwFlags As Integer
    Public fEnable As Integer
    Public hRgnBlur As Integer
    Public fTransitionOnMaximized As Integer
End Structure

结构讲解:dwFlagsDWM_BB_BLURREGIONDWM_BB_ENABLEDWM_BB_TRANSITIONONMAXIMIZED 的组合。若指定一项,相应的值必须置为非零。其中 hRgnBlur 为目标渲染区域句柄(似乎没用),fEnablefTransitionOnMaximized 置为1为打开,0为关闭。

使用 Windows.Forms.TransparencyKey 可以轻易实现透明效果。

综合使用效果如图:

Z1


二、ListView控件的系统风格化

关键函数:

Public Function SetWindowTheme Lib "uxtheme.dll" (ByVal hWnd As IntPtr, ByVal textSubAppName As String, ByVal textSubIdList As String) As Integer

函数讲解:该函数用于开启或关闭或改变某窗口(及子窗口)的窗口主题。hWnd 为窗口句柄,textSubAppName 为主程序样式名称,textSubIdList 为子样式名称。

函数使用:若 textSubAppNametextSubIdList 使用 ByVal 传递整数零则可以启用一个窗口的主题,若使用 ByRef 传递空格字符(Chr(32))则会停用一个窗口的主题(停用后窗口类似 Windows 98 中的窗口)。

使用 SetWindowTheme(ListViewCtrl.Handle, "Explorer", Nothing) 可以启用 ListView、TreeView 的资源管理器效果:

Z2

上面是使用了 SetWindowTheme 函数之后的效果,下面是未使用的效果。


三、控件默认使用GDI+ 绘制文本

为什么要用 GDI+ 绘制文本?这是因为,如果启用了 Aero 效果,则窗体的所有颜色将会使用ARGB 方式参与计算。普通的 GDI 文本绘制函数如 DrawText 等绘制的文本会造成很奇特的效果,严重影响文本可读性。由于 GDI+ 也是使用 ARGB 方式计算颜色,就可以在使用 Aero 效果的窗体上绘制正常的文本。

在 Visual Studio .NET 2005(.NET Framework 版本 2.0)及以上的版本中,可以使用两种方式启用控件的 GDI+ 文本绘制。

1、使用 Application.SetCompatibleTextRenderingDefault

原型:SetCompatibleTextRenderingDefault(defaultValue As Boolean)defaultValueTrue 时所有支持 GDI+ 绘制文本的控件都启用 GDI+ 绘制,为 False 时使用 GDI 绘制。默认值为 False

在应用的时候会有一个问题。该函数需要在创建第一个窗口前调用,否则引发异常 InvalidOperationException。如果启用应用程序框架,则无法在第一个窗体加载之前调用函数。

解决方法如下:取消应用程序框架,使用 Sub Main() 启动,调用 Application.SetCompatibleTextRenderingDefault(True) 之后在结束之前调用 Application.Run(MainForm),其中 MainForm 为主窗体名称。

2、使用控件的 UseCompatibleTextRendering 属性。

属性为 True 时所有支持 GDI+ 绘制文本的控件都启用 GDI+ 绘制,为 False 时使用 GDI 绘制。默认值为 False

支持 GDI+ 文本绘制的控件有:Label,LinkLabel,Button,CheckBox,RadioButton,CheckedListBox,GroupBox,PropertyGrid。


四、异步数据传输

使用 WebClient 类的 DownloadDataAsyncUploadDataAsync 等函数进行异步数据传输。这里以 DownloadDataAsync 函数为例。

DownloadDataAysnc 的好处在于不占用系统时间,应用程序不需要等待数据返回才响应,之间可以完成其他工作。如果使用 DownloadData 函数,则在数据接收到之前无法进行其他操作。

那么控制权交给了其他函数,如何确定接收过程呢?

使用 AddHandler 语句注册回调函数。AddHandler 使用方法如下:AddHandler ControlName.EventName, AddressOf CallbackProcCallbackProc 的声明要与 ControlName.EventName 的声明参数一致,否则会造成“签名不一致”错误。实际上,AddHandler 是注册隐式委托的一个有效方法。关于委托请见第六点。

比如,注册 WebClient 的 DownloadDataComplete 事件函数例子:

Public Sub DDACallback(ByVal sender AsObject, ByVal e As System.Net.DownloadDataCompletedEventArgs)

然后在里面处理就行了。


五、全局热键的使用

关键函数:

Public Function RegisterHotKey Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nHotkeyID As Integer, ByVal fsModifiers As Integer, ByVal nVK As Integer) As Integer

函数讲解:hWnd 为窗口句柄,nHotkeyID 为热键 ID(应用程序范围为 &H0000~&HBFFF,DLL 范围为 &HC000~&HFFFF),fsModifiers 为修饰键(MOD_CONTROLMOD_ALTMOD_SHIFTMOD_WIN),nVK 为虚拟键码。注册热键之后按下热键系统会将 WM_HOTKEY 发往 hWnd 指定的窗口的消息循环,wParam 为热键 ID,lParam 的高位为虚拟键码,低位为修饰键值。

使用方法:重写窗口消息处理函数。

Protected Overrides Sub WndProc (ByRef m As System.Windows.Forms.Message)
   If m.Msg = WM_HOTKEY Then
       If m.WParam = ID_HOTKEY Then
            '这里做你想做的。
       End If
   End If
   MyBase.WndProc(m)
End Sub

自然之后要解除注册:

Public Function UnregisterHotKey Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nHotkeyID As Integer) As Integer

函数讲解:hWnd 为窗口句柄,nHotkeyID 为已注册的热键 ID。


六、在 .NET 中使用回调

VB6 中使用回调很简单,AddressOf 就行了。比如:EnumWindows(AddressOf EWProc, 0)。.NET 可是宣称有安全性的,怎么会直接采用这种可能引发堆栈错误(比如参数不匹配)的方式呢?所以在 .NET 中,AddressOf 已经成为了创建显式委托的语句。如果直接对一个声明为 lpFunc As Integer 的函数传 AdressOf ProcName 的话,则会引发异常。

那么 Windows 中这么多的回调该怎么使用呢?

题外话:其实一开始我也没有理解 .NET 中所谓“委托”为何物。为什么要选用“委托”一词呢?这个词在中文中可是一个动词啊……看了 MSDN Help Library 的示例之后我终于理解了,原来“委托”就是 C++ 中所谓的影子函数啊!

对比一下:

C++:

int doSomething(int, int, float);

int doSomething(int a, int b, float c) {...}

VB .NET:

Delegate Function DoSomethingDelegate(ByVal X As Integer, ByVal Y As Integer, ByVal Z As Integer) As Integer

Function DoSomething(ByVal A As Integer, ByVal B As Integer, ByVal C As Integer) As Integer
...
End Function

怎么样?很像吧!

而且 MSDN Help Library 说“委托是一种类型”。那么,我们就可以用委托进行回调。

声明一个影子:

Delegate Function EnumWindowsProc(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Integer

此时,EnumWindowsProc 已经成为一个“委托”类型。在函数中可以使用这种类型,可以且仅可以接受 AdressOf 对正确函数实体的返回。

API 函数也要重新声明:

Declare Function EnumWindows Lib "user32.dll" (ByVal EnumProc As EnumWindowsProc, ByVal lParam As Integer) As Integer

然后接下来声明真正的函数:

Function EnumWindowProcRealizer(ByVal Handle As IntPtr, ByVal lParam As Integer) As Integer
    SetWindowText(Handle, "窗口标题")
    Return 1
End Function

接着进行调用:

EnumWindows(AddressOf EnumWindowProcRealizer, 0)

这样进行的调用就会传到实际的函数 EnumWindowProcRealizer

另外,和 C++ 里的影子函数一样,实际的函数和形式函数要有相同的参数、参数类型和参数顺序(本质上是要保证堆栈一致),否则会引发“签名不匹配”的错误。

分享到 评论

一些技术细节

最近在写一个启动软件,现在的版本是 1.0.2.1 Beta。里面的一些技术细节会在正式版时更新到日志中。

包括:Aero 的完美无错误实现及故障排除(Visual Studio 2010 - VB),利用网页进行数据更新,以及一些界面效果。

分享到 评论

Vista Aero 效果的纯 DWM API 实现,以及发光字 etc

DWM API 的使用已经更新,请见:http://hi.baidu.com/micstudio/blog/item/29ec4cef245164ca2e2e21d3.html


比如:

Z-Abby Aero test

Example in VB6

'很好的代码,粘贴到窗体内即可使用
'缺点:直接使用 GDI+,导致 GDI 绘制的图像及文本出现不正常;在没有使用另外的某 DWM API 时(忘了……),窗口边框与客户区间还会有边界。
'Vista Home Premium 以下(不含)的系统不支持,请勿使用
'此源代码为从网上某处搜索得来,感谢原作者!

Option Explicit

Private Declare Function DwmIsCompositionEnabled Lib "dwmapi.dll" (ByRef enabledptr As Long) As Long
Private Declare Function DwmExtendFrameIntoClientArea Lib "dwmapi.dll" (ByVal hWnd As Long, margin As MARGINS) As Long

Private Type MARGINS
  m_Left As Long
  m_Right As Long
  m_Top As Long
  m_Bottom As Long
End Type

Private Declare Function DwmEnableBlurBehindWindow Lib "dwmapi" (ByVal hWnd As Long, pBlurBehind As DWM_BLURBEHIND) As Long
Private Declare Function DwmEnableComposition Lib "dwmapi" (ByVal bEnabled As Long) As Long

Private Const DWM_BB_ENABLE = &H1&
Private Const DWM_BB_BLURREGION = &H2&
Private Const DWM_BB_TRANSITIONONMAXIMIZED = &H4

Private Type DWM_BLURBEHIND
    dwFlags As Long
    fEnable As Long
    hRgnBlur As Long
    fTransitionOnMaximized As Long
End Type

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long

Private Const LWA_COLORKEY = &H1
Private Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20)

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributesByColor Lib "user32" Alias "SetLayeredWindowAttributes" (ByVal hWnd As Long, ByVal crey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long

Private Sub Form_Load()
    Dim m_transparencyKey  As Long
    m_transparencyKey = 0
    SetWindowLong Me.hWnd, GWL_EXSTYLE, GetWindowLong(Me.hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED
    SetLayeredWindowAttributesByColor Me.hWnd, &HC8C9CA, 0, LWA_COLORKEY
    Dim mg As MARGINS, en As Long
    mg.m_Left = -1
    mg.m_Bottom = -1
    mg.m_Right = -1
    mg.m_Top = -1
    Dim R&, t&, bb As DWM_BLURBEHIND
    bb.dwFlags = DWM_BB_ENABLE Or DWM_BB_BLURREGION
    bb.fEnable = 1
    bb.hRgnBlur = 0
    bb.fTransitionOnMaximized = 1
    DwmEnableBlurBehindWindow hWnd, bb
End Sub

Private Sub Form_Paint()
    Dim hBrush As Long, m_Rect As RECT, hBrushOld As Long
    hBrush = CreateSolidBrush(&HC8C9CA)
    hBrushOld = SelectObject(Me.hdc, hBrush)
    GetClientRect Me.hWnd, m_Rect
    FillRect Me.hdc, m_Rect, hBrush
    SelectObject Me.hdc, hBrushOld
    DeleteObject hBrush
End Sub

+新内容

以及自己根据资料写的一个函数,绘制发光文本(使用 VB .NET):

Public Function DrawGlowingText(ByVal hDC As IntPtr, ByVal Text As String, ByVal Font As Font, ByVal Color As Color, ByVal Rect As Rectangle, ByVal GlowSize As Integer) As Integer
    Dim hTheme As Integer = OpenThemeData(GetDesktopWindow, "TextStyle")
    If hTheme > 0 Then
        Dim dib As New BITMAPINFO
        Dim dto As New DTTOPTS
        Dim hMemDC As Integer = CreateCompatibleDC(hDC)

        With dib.bmiHeader
            .biSize = 40
            .biWidth = Rect.Width * 40
            .biHeight = -Rect.Height * Font.Size
            .biPlanes = 1
            .biBitCount = 32
            .biCompression = BI_RGB
        End With

        With dto
            .dwSize = Len(dto)
            .dwFlags = DTT_GLOWSIZE Or DTT_COMPOSITED Or DTT_TEXTCOLOR
            .iGlowSize = GlowSize
            .crText = ARGB2RGB(Color)    '注意,.NET 中以 ARGB 方式保存颜色信息,而 Windows Theme API 以 RGB 方式解读信息
        End With

        Font = New Font(Font.FontFamily.Name, Font.Size)

        Dim hDIB As Integer = CreateDIBSection(hDC, dib, DIB_RGB_COLORS, 0, 0, 0)
        Dim hObjectOld As Integer = SelectObject(hMemDC, hDIB)
        SelectObject(hMemDC, Font.ToHfont())
        Rect.X = Rect.X + GlowSize

        DrawThemeTextEx(hTheme, hMemDC, 0, 0, Text, -1, 0, Rect, dto)
        BitBlt(hDC, Rect.Top, Rect.Left, Rect.Width, Rect.Height, hMemDC, 0, 0, SRCCOPY)

        SelectObject(hMemDC, hObjectOld)
        'SetTextColor(hMemDC, intOldTextColor)

        DeleteObject(hDIB)
        DeleteDC(hMemDC)
        CloseThemeData(hTheme)
        Return 0
    Else
        Return GetLastError()
    End If
End Function

附:最好是使用相应 WM_PAINT 消息时将窗体整个用黑色画刷填充,然后再向上面绘制图片、文字(DrawThemeTextEx 或者 GraphicsPath 均可),这才是最终的解决方案。

相关声明嘛……啊我放在另一个模块里面了,比较乱,不复制了,网上都有。

分享到 评论

一些有用却没怎么见到过的常数

注:

分类为“Style”的常数通用使用方法是 Call SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) Or {VALUE})

分类为“ExStyle”的常数通用使用方法是 Call SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) Or {VALUE})


1、PS_ALTERNATIVE(= &H8)

所属分类:Style

作用于 PorgressBar,可以实现动态效果。

当用一个 Timer 去不断改变 ProgressBar 的值的时候,会显示出渐变的效果。有了这个,网上所有的模拟 Windows XP 或 Windows Vista 动态进度条的控件全部不需要了。

Progress

2、BS_COMMANDLINK(= &HE)

所属分类:Style

作用于 Button 类且样式为 Button 的窗口(不支持 CommandButton),可以实现 Vista 按钮效果。

在 VB6 下需要自己用 CreateWindowEx 来创建窗口,这个窗口会自绘。一般来说,重载可以简化操作。

Vista button

3、LVS_EX_ 系列

所属分类:ExStyle

作用于 ListView(TreeView 自行推论),实现各种高级效果。

有了这个,不用担心 Common Controls 5.0 不支持一些 6.0 才提供的属性了,真是不错。不过有时会出现异常。

分享到 评论

微软都给可怜的 VB6 用户们隐藏了什么

1、最简单的,PrivateExtractIcons(系统主版本大于5才有)。不过今天我看了 VC++6,里面也没有这个声明,应该是微软当时没有想到吧。

2、IMAGE_*_HEADER,组成 PE 文件的结构的结构声明。在 API 浏览器中根本没有,要自己到头文件里去找然后翻译。话说最近我直接写了一个程序,输入结构声明输出 VB6 式的结构声明,所以还不算特别辛苦。但是这样搞 PE 结构就非常麻烦了……当然 API 浏览器比起别的辅助软件实在是太简单了,所以也不能算它的错。

3、很多人把 Microsoft Windows Common Controls 6.0 奉为神,因为它在很多方面都强于5.0。但是很致命的是它不响应 InitCommonControls!这样就做不出 XP 效果了。其实5.0+SendMessage 就可以做出6.0的效果,还附带着 XP 风格;不过有时会出现异常(我的系统是 Windows Vista),比如用 LVS_EX_FULLROWSELECT 的时候会出现风格变为无图标+有复选框+首项有下划线,有时甚至不能显示首项。按理说 LVM_FIRST 应该是内定的啊……

4、一堆的 Nt* 函数都没有公开,这点不详细谈了吧。所以如果没有高人指点,CPU 使用率等等等等的问题只有微软会获取。

更多更多,在以后的实践中我会不断更新这篇日志。敬请期待。或者可以发表评论协助补充,相关评论我不会删除。

分享到 评论