12月必须不忙

c++,GUI

(动笔于2010年12月6日晚11点40分,搁置若干年之后于2018年4月3日补完)

眼看着2010快到头了,再不写的话,真要成微博了。由于我追求的是博大精深,微博不符合我的世界观价值观人生观,所以我必须多写两句。(补记:谁知道我直到2018年才放弃微博=v=)

俗话说吐槽要趁热,挖坑要趁早,时间一长就没兴致了。我本来想大力吐槽某个诡异的Win32API,时隔2个月,我都记不太清楚细节了。总之,故事是这样开始的……

在一个阳光明媚春暖花开的日子里,我决定使用API画一个窗口。

自从Windows诞生以来,就有无数仁人志士前仆后继翻来覆去的画窗口。更有蛋疼者,不喜欢方形的窗口,非要搞成其他形状。于是M$提供了SetWindowRgn,满足了他们搞怪的欲望。

然而蛋疼是病,得治。在M$的娇惯下,蛋疼的人们不满足于这种用Region来定义外形的方式,因为各种奇形怪状的窗口已经成为流行趋势,仿佛用方形的外观就是土老冒儿(补记:2018年再看特别有意思,现在又流行方块和扁平化了)

总之长话短说,我阅读了API手册,准备好Mask图层,设置Colorkey,在WPF里调用Win32API,终于成功的搞出了镂空效果。也许WPF有什么其他设置可以完成同样 的工作,但我实在懒得研究这个庞然大物了。

本以为大功告成,然而程序在WinXP上运行效果正常,放到Win7就变回了难看的方形窗口,似乎Colorkey完全失效了。

在GetLastError()也没有报错的情况下,我百思不得其解。上网研究查询了一大堆文档之后也没有头绪,只能随便乱试。结果意外的发现,我只要使用“纯绿色”来做为Colorkey,这个Mask就可以生效。

这样一来总算凑合能用,我隐约猜到了问题的原因。于是乎联系了M$的朋友,拜托他帮忙看看这API的实现到底是肿么回事……

侯捷大大说过,“源码面前了无秘密”。朋友告诉我,Win7版的API不知道为啥把RGB的顺序调整了。果然是RGB在新的代码里被认成了BGR,当Colorkey包含其他通道的数据,颜色就乱掉了。如果只有Green通道,就能阴差阳错的避开这个坑。

事到如今真相大白,也不知道这算不算Bug,或许只能去问The Old New Thing的作者了:)

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.