WINCE应用程序开发小记之五子棋


      前段时间在EVC下做了2个WINCE应用程序,实现方式为MFC。由于之前未曾做过WINCE平台开发,所以我先在WIN32上实现界面和功能,然后再用类似的实现方法建立EVC工程,如此可以方便调试——公司未提供WINCE环境调试工具或模拟器,只有真机。。汗个!

      两个工程分别是实现联网的五子棋游戏程序和支持拖动察看的文档、图片浏览程序。由于五子棋程序的算法部分已实现,并且无须区分平台,所以这里所说的主要是MFC在2个平台下界面上接口和功能的不同。

      WIN32上就不用多说了,有做过MFC的话,实现起来很快,界面也很美观。不过如果把这些功能接口同样用到EVC中,程序错误啥的就一骨碌冒出来了,然后到网上到处找啊找,论坛搜啊搜,有时候一个小问题要耗上一两天!没办法,谁叫WINCE只包含WIN32 20000个API中的2000个(这个子集可真够精简的)。。

      废话多了点,呵呵。这里先总结下做五子棋程序时碰到的问题,挑主要的说吧,这些可是偶在网上好不容易找到的:

      一、Dialog添加菜单栏问题

      关键语:“WINCE中,菜单并不是标准窗口中的一部分,而是被附加到为窗口创建的命令栏控件上了,主要也是主菜单和上下文菜单两种。”

      看来用WIN32的方法是行不通了:(既然是附件到命令栏控件上,自然还得求助于命令栏控件的帮助,于是咱得在OnInitDialog()函数中加上以下2行代码:
    •     HWND hwndCB = CommandBar_Create( AfxGetInstanceHandle(), m_hWnd, 1);    
    •     CommandBar_InsertMenubar( hwndCB, AfxGetInstanceHandle(), IDR_MENU, 0); 
      这里的IDR_MENU是已经在资源视图里面画好的Menu资源ID。BUILD个.EXE放小机上一跑,久违的菜单栏至于露面了!不过这里的菜单栏多了个方框——可能是附加到命令栏控件上的缘故吧。

      二、棋盘界面显示问题
  
      关键语:“BeginPaint()和EndPaint()可以删除消息队列中的WM_PAINT消息,并使无效区域有效;GetDC()和ReleaseDC()并不删除也不能使无效区域有效,因此当程序跳出WM_PAINT时,无效区域仍然存在。”

      以前在WIN32平台开发,一直用的GetDC(),也没去研究过有效、无效区域的问题,更没听说过BeginPaint()这个函数。于是我照旧用的 GetDC(),拿到小机上一运行,结果界面什么都没,只能看到对话框背景。。上网一查,说是OnEraseBkgnd()函数响应时把画出来的擦掉了,于是重载OnEraseBkgnd()函数,让其只返回0,不做任何操作。结果棋盘的界面是有了,不过界面一刷新,背景却不能正常显示。后面总算找到了 BeginPaint()函数,用其代替GetDC(),如此所做的界面绘制操作成了有效区域,OnEraseBkgnd()函数不会再把它擦除掉了——终于得到了跟WIN32下一样的显示效果!

      不过还有一个小BUG:一弹出子对话框,如果改变子对话框的位置或关闭子对话框,棋盘界面被子对话框遮住那部分就会被擦除掉,不能正常刷新!怀疑 WINCE下子对话框是不是会垄断主对话框的消息,然后在某个子对话框中加入了对主对话框的操作,结果主对话框能正常响应此操作,推断失败!于是卡壳了,既然主对话框能响应到WM_PAINT消息,为什么会不能正常刷新界面?这里卡了一两天,某次无心查看自己OnPaint()代码的过程中,发现自己定义了一个用于装载棋盘位图的CDC,并且在BitBlt和画线时有一部分直接用的此DC!问题总算找到了!由于这部分没有采用使用BeginPaint()函数的显示DC,导致所画区域无效,因此每次刷新后就被OnEraseBkgnd()函数擦掉了。。至此,问题总算解决,可以向主管交差咯!
  
      话说回来,像上面第二个问题,在WIN32下是绝对不会出现的,只有在WINCE下OnEraseBkgnd()函数才会擦除使用GetDC()方式所绘图形。做过WINCE开发之后,你就会发现二者有很多细节上的差别,这可能也是WINCE平台开发特有的一番风味吧——酸酸的,有点甜:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值