其实刚开始用wpf写launcher的原因也就是因为用mfc写界面非常的麻烦,尤其是对于我这种后端转前端的程序员来说。在写这个launcher之前我连对话框单文档多文档有什么区别都不知道。而现在的界面不像是以前,现在的界面都是各种异形,要求做得非常漂亮的。当然你会说有直接的界面库可以用,但是在网上找了一圈之后发现很多的界面库都是从好几年前就没有再维护了,要么就是商业版的,简而言之要钱。我们老大看我直接硬写界面的时候也跟我说你用界面库啊,然后帮我找了一圈,我还默默的期待了一下能够有什么好的办法,后来跟我说他也没什么好办法还是硬写吧。。。。。。
说实话现在用mfc来写界面的人估计真的很少了,mfc大牛们不算,一般的游戏开发估计不会用mfc来写吧,能够在网上找到的最近的资料都是已经四五年以前的了,然后我每天都在跟我们老大吐槽==、
好了不说废话了进入正题。
异形窗口异形按钮什么的很多博客都有写,我也是从网上找的源码修改的就不说了,说一些我遇到的问题的点吧。
1.自定义控件类型的话是需要自己注册系统消息的,比如ON_WM_PAINT()什么的要在messagemap里注册,不然的话自己重写的OnPaint函数不会被执行。
2.窗口拖动的话整个窗口是需要重绘的,包括里面所有的控件。我用的是OnWindowPosChanged这个函数来标志窗口移动了,因为mfc中并没有mouseup这个消息。如果窗口移动的话onpaint函数里面加入控件的重绘。但是像按钮之类的控件可以利用窗口切割的方式,也就是说把主窗口和控件分割开来,在OnInitDialog()中加入ModifyStyle(0, WS_CLIPCHILDREN);这样就避免了一直去重绘其中的控件。但是像CStatic这样的类是必须要重绘的无法分隔开。
3.避免闪烁的方式就是双缓冲。这个对于我来说的话就是道理我都懂可是代码上还是不太理解,cdc、hdc什么的好想弄清楚。
wpf的界面就简单的多,直接载入图片就行了,button的不同状态就是不同的图片,mfc中我的做法是把不同状态的图片拼接在一起,然后根据不同状态显示不同的位置。wpf中需要注意的一点就是比如一个listbox,点击的时候会出现边框,或者按钮点击会出现闪烁,取消他的focus就行了。