XP 下 Edit 控件透明字体时的 Bug

前提

XP 系统,程序使用了 Manifest 指定使用 Microsoft.Windows.Common-Controls
现象:Edit 控件处理 WM_CTLCOLOREDIT 改变颜色,问题出在 SetBkMode 设置透明后,控件删除字符时无法立刻刷新,即会残留。

解決

方法 1

自残,别用 Microsoft.Windows.Common-Controls,删除类似下列的代码:

1
2
3
4
5
6
7
8
9
#if defined _M_IX86
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

方法 2

放弃“透明”,采用“伪透明”——如果您的背景是纯色,用 SetBkColor 就行。

方法 3(推荐)

检测到 XP 时,WM_CTLCOLOREDIT 返回画刷前,自己用 FillRect/Rectangle 涂一下……或者发一个 WM_ERASEBKGND,当然这个做法的前提是 WM_ERASEBKGND 的处理就是自己涂一下,如果就一句 return TRUE 那是等于啥也没干。

参考

同样悲剧的一个描述:http://zhidao.baidu.com/question/9749770.html

诗盗·挨踢威

《#诗盗#·挨踢威》:十年河西今河东,弱经烽火死无踪。未来岂是挨踢威?骚年摇头撸爱轰。

由霹雳角色“南冕.超轶主”的诗号获得灵感而作。

由来泉石潜蛟龙,
不经烽火不现踪。
风云岂是苍天主?
拈作轩冕上九重。

注解

挨踢威(iTV)势在必行了,产品可以做好,看好,蛋似利润肯定不如手机平板,出货量也不可能。没有跨时代意义。

诗盗·世界末日

《#诗盗#·世界末日》:骚年不肯琵碧玺,今日碧非昨日碧。恍若昙花开一瞬,世界末日明日至。劝君须惜骚年碧,劝君莫要再搞基。末日未日快去日,日完记得洗机机。

改编自唐朝诗人杜秋娘的古诗作品《金缕衣》。

劝君莫惜金缕衣,劝君惜取少年时。
花开堪折直须折,莫待无花空折枝。

诗盗·碉堡的机机

《#诗盗#·碉堡的机机》:身长长机机,一机装二逼。云端通讯录,网络三四G。

改编自霹雳角色“御天荒神六铢衣”出场诗。

身披六铢衣,
御宇藏真理。
云中封神路,
紫薇降天启!

注解

身长长机机:身上长着很长的机机。
一机装二逼:一个机机就可以装两个逼,不管是装牛逼还是撒逼,简直易如反掌,果然是装逼利器!
云端通讯录:现在的智能手机都可以把通讯录备份到云端。
网络三四G:支持 3G、4G,各种制式。

开发 LSP 遇到的蛋疼问题

今天发生一个莫名其妙的问题,导致浪费一个早上的时间排查问题。

测试 LSP 期间,已经反注册它,netsh winsock reset 加重启好几次……依然有程序加载它,用 Process Explorer 查了一下是:IpOverUsbSvc.exe 和 daemonu.exe,后来把 LSP 文件删掉,再重启,这时候当然无法加载了,可是 UMU 又想重现一下这个莫名其妙的问题,结果一个早上没了,无法重现……

15:38 2012/12/25 补充

今天这个现象又出现了。再手动重启这两个服务后,不再加载 LSP 了。它们对应的服务名是:IpOverUsbSvc 和 nvUpdatusService。这说明这两个服务很可能每次重启机器时都没有正常关闭,系统提供了某种机制让他们在下一次重启后快速恢复了运行现场(保留了有 LSP 注册时的环境)。

用树莓派 + USB 无线网卡做了一个蛋疼的 AP Client

需求

两个困境:

  • 有个只有 RJ45 接口的旧设备要上网,它的位置离路由器很远,家里的网线不够长……

  • UMU 买了一个支持 AP Client 的无线路由器(TP-Link TL-WR800N)每次把这个 AP Client 断电时,提供网络的主路由器都会被这个 AP Client 搞死掉,原因未知……

还没有树莓派的时候,UMU 用笔记本上的 Windows 的 ICS 功能给它提供网络,当然这方法很不好,于是有了现在的方案。

解决

仔细查看了树莓派支持的 USB WiFi Adapters 列表,挑选了 TP-LINK TL-WN823N(RT8192CU 芯片),这个在 Raspbian 上是 Work out-of-box。Mercury 150Mbps MW150U(Realtek RTL8188CU 芯片)也可以。

硬件准备好后,第一步,配置 Wifi,连上主路由器,假定,此步将 wlan0 的 IP 配置为 192.168.1.2,/etc/network/interfaces 的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
auto lo

iface lo inet loopback
iface eth0 inet static
address 192.168.24.51
netmask 255.255.255.0

auto wlan0
iface wlan0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp

192.168.24.51 这个 IP 可以改为别的,UMU 习惯用这个当网关地址。/etc/wpa_supplicant/wpa_supplicant.conf 的内容这里就忽略了,参考 http://elinux.org/RPi_Peripherals#Wireless:_TP-Link_TL-WN722N_USB_wireless_adapter_.28Debian_6.29。设置完,ifdown wlan0ifup wlan0,看看 USB 无线网卡的指示灯应该闪起来了……

第二步,配置 RJ45 网口的 NAT。首先,修改 /etc/sysctl.conf,增加以下两行:

1
2
net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_source_route = 1

运行 echo 1 > /proc/sys/net/ipv4/ip_forwardiptables -t nat -A POSTROUTING -s 192.168.24.0/24 -o wlan0 -j SNAT --to 192.168.1.2,并将这条命令写到 /etc/rc.local 中的 exit 前。

最后,reboot 一下试试。可以用网线把 PC 和树莓派连起来,PC 的网卡设为 24 段地址,网关 192.168.24.51,试一下 PC 通过树莓派的网口上网吧!