前几天,我定下了使用GWES的UI方案,周一开始工作后,果然在两天内应用程序开发一路高歌猛进势如破竹,大家用DialogBox、Button、Static Text控件都觉得巨爽无比,总比自己从CreateWindowEx开始写,然后一步一步CODE REVIEW和TEST上来舒服多了。但是昨天傍晚的时候,工程师A遇到个问题,在对话框中加入Slider(进度条)后,该DialogBox就无法显示出来了。

工程师A郁闷了一早上,把DialogBox和Slider的属性翻来复去地改,最后索性对.rc文件直接作文本编辑,但仍然没有效果。下午工程师B也放下手里的活,协助解决这个问题,仍然没有结果。问题的答案结果实在简单到无语,是工程师A没有仔细看文档导致的,然后工程师B也顺着A的方向落入思维陷阱,我也前赴后继掉进去了,一共折腾了大概15人时才爬出来。

晚饭后,我解决的思路大致如下

1、怀疑是DlgProc在WM_INITDIALOG或WM_PAINT时的处理不善导致。所以索性在DlgProc的首行直接打印消息看是否得到的消息正确。结果:只依次得到三个消息WM_SETFONT、WM_WINDOWPOSCHANGED、WM_CLICKACTIVE。连WM_INITDIALOG都没有收到。本思路否决。

2、怀疑是控件的STYLE问题,这个思路是沿着工程师A的方向考虑的。我尝试用VC6建立了X86上的PROEJCT,在VC6里建立DIALOG和SILDER,发现运行起来显示正常。于是比较了VC6的这个RC文件和EVC里有问题的RC文件,发现WINCE支持的控件STYLE只是WINXP上的一个子集。

3、继续上一步思路,在WINCE500里找到其他带有SILDER的RC文件,找到了控制面板里的Volume音量控制。拿来和出问题无法显示的RC做文本比较,发现两份RC文件没有差异,我这份的结果仍然出不来。思路2、3否决。

4、所以是代码问题。尝试了DialogBox和CreateBox, 结果一样出不来。

5、由于昨天在WINCE模拟器上遇到的一个静态全局变量地址传递异样的问题,所以我怀疑这是模拟器导致。把尘封已久的开发板连接起来跑,发现问题仍然存在。

6、想到TCPMP和音量控制即使跑模拟器上也仍然正常显示Slider控件,于是彻底推翻第5条假设。

7、考虑是否为STANDARDSDK_500和IBMCE两个PROJECT都缺少某个支持SLIDER所需的组件导致。由于前面第6条判断,于是立刻推翻本条推理

8、目前排除RC的问题,定位为代码或系统原因。我在WINCE HELP里搜了一下关键字“slider”,搜索结果第一条就是"Createing a TrackBar", 和目录同步后,发现该页处于目录结构 
Shell and User Interface -> Shell -> Shell Application Development -> Create Controls
而不是描述BUTTON控件的 
Shell and User Interface -> Graphics, Windowing and Events -> GWES Reference -> Window Control Reference
看到这里就知道方向应该对了。前面我们都习惯性思维认为所有的控件都在GWES下面,所以调用方式都一样的,而实际上虽然同样有着CONTROL的名头,却分在不同目录下,其中必有文章。

9、仔细看看Create Controls那一页,开头列出了多种控件的名字,但是没有BUTTON和STATIC TEXT。我选择了表格里的Tree views和Date and time picker控件,在EVC里把这两种控件分别加入DIALOG,结果DIALOG同样也显示不出来。这就进一步肯定了思考方向已经正确。

10、就ms-help://MS.WindowsCE.500/wceshellui5/html/wce50conworkingwithcommoncontrols.htm 这页看到下面,有这个描述

Before you create or use any common controls, you must register them. You register a common control by calling the InitCommonControlsEx function, which registers a specific set of common control classes. Calling InitCommonControlsEx ensures that the common DLL is loaded.

To use most of the common controls, you must include the Commctrl.h header file in your application. To use property sheets, you must include the Prsht.h header file.

MS还特意加粗了InitCommonControlEx。那么估计就是在工程师A的代码里面,没有调用该函数把COMMON CONTROL这个DLL加载进来。我查了一下InitCommonControlEx,先填写一个结构体参数就OK了。后来试了下,不填写结构体,直接调InitCommonControl()也是可以的。OK,都显示出来了,Tree View和Date and time picker也都可以显示了。

————————————————

总结起来,这事的思维陷阱在于:认为eVC绘图面板上的所有控件,调用方式都一样。因为VC上的绘图面板上控件调用方式都一样,而且即使eVC里其他以面板来分类的功能和操作,比如调试面板、文件操作面板,同个面板上按钮使用方法也几乎一样。这和我前面因为点了绘图控件就想着立刻去点Class Wizzard关联MFC类,因此在项目早期评估时错过GWES实现方案的逻辑漏洞有相似之处。结果就是,表面上看起来同类的、十分相似的东西,它的用法却可能是不同的。对接口函数或者工具的使用,还是必须忠于文档,而不是直觉。

本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2007/04/11/709670.html,如需转载请自行联系原作者

思维习惯埋下的陷阱:在eVC中使用Slider、Spin等控件相关推荐

  1. 记录下帮助一位网友解决的关于android子控件的onTouch或onClick和父OnTouch 冲突的问题。

    记录下帮助一位网友解决的关于android子控件的onTouch或onClick和父OnTouch 冲突的问题. 参考文章: (1)记录下帮助一位网友解决的关于android子控件的onTouch或o ...

  2. 【Android归纳】基于XListView的下拉刷新、上拉加载更多的控件分析

    目录 前言 功能介绍 总体设计 组成 类关系图 详细设计 XlistViewHeader原理分析 XListViewFooter原理分析 XListView原理分析 代码带注释下载 目录 前言 如果你 ...

  3. Windows环境下使用Python设计应用软件——【2】pyqt给控件添加功能(弹窗功能)

    PS:本文主要用于自我整理总结,方便后续参考,如果恰好帮助到你,也是件值得高兴的事 之前我们简单设计了界面,现在是给控件加我们想要的功能的时候了. 首先我么要知道这个控件名是什么 然后是设置单击控件后 ...

  4. 解决问题:win10下VS2013报错:此电脑没有安装ActiveX控件

    现象:之前在win7下建的工程,写的程序.程序中用到ActiveX控件--串口mscomm. 电脑换成win10系统以后,再次打开工程,报错:此电脑没有安装ActiveX控件. 解决办法: 1.下载m ...

  5. 入门级: WinForm 下的 ComboBox,ListBox 的使用 (三) 选择控件

    平常我们经常会用到这样的控件:选中一个ListBox 中的项移动到另外一个 ListBox 中,反过来也行.像下面这样: 我们需要将上面两个涂黑的地方 (Label),以及两个 ListBox,四个操 ...

  6. 时间选择控件在不同场景下的应用

    时间选择控件在产品设计中是一个非常常见且通用的元素,在各种产品中几乎都有应用.随着各种App和网站类产品在不同操作场景中的渗透发展,我们在进行产品设计时也应更追求功能实现方式的"恰如其分&q ...

  7. qt 设置焦点 跳到下个控件_【Qt】Qt之Tab键切换焦点顺序【转】

    简介 Qt的窗口部件按用户的习惯来处理键盘焦点.也就是说,其出发点是用户的焦点能定向到任何一个窗口,或者窗口中任何一个部件. 焦点获取方式比较多,例如:鼠标点击.Tab键切换.快捷键.鼠标滚轮等. 习 ...

  8. 具有TreeView下拉控件的ComboBox

    具有TreeView下拉控件的ComboBox 没错,如标题所说的那样,在下拉框中是一个TreeView,但是,为什么我们需要这样的控件?事实上这样的需求我已经遇到很多次了,比如适用于:  当遇到层 ...

  9. 鸡啄米vc++2010系列32(标签控件Tab Control 下)

    上一节中鸡啄米讲了标签控件知识的上半部分,本节继续讲下半部分. 标签控件的创建 MFC为标签控件的操作提供了CTabCtrl类. 与之前的控件类似,创建标签控件可以在对话框模板中直接拖入Tab Con ...

最新文章

  1. 6月机器学习热文TOP10,精选自1400篇文章
  2. UDP对应的应用层协议之DHCP协议
  3. Hdu 3478 Catch
  4. 使用Zookeeper共享锁和排它锁和分布式队列的原理和实现(ZkClient)
  5. vscode pyqt 环境搭建
  6. C语言:替换字符串中某一段子字符串
  7. 鸿蒙系统适配机型_余承东:华为手机鸿蒙系统体验比安卓更好,主流应用已完成适配...
  8. python模块之feedparser学习使用
  9. 1079 Total Sales of Supply Chain(25 分)
  10. 〔转〕Word域的应用和详解2_等式和公式域
  11. 新华三(H3C)校园招聘技术类笔试题2019
  12. tomcat内存溢出:PermGen space解决方法
  13. cass等距离等分线段的命令键_CAD定距等分与定数等分使用技巧 - CAD自学网
  14. 第11章 UART串口通信 练习题
  15. 新浪云存储 php,【PHP】新浪云SAE平台将本地图片和远程图片保存至Storage
  16. UG编程加工之非切削移动
  17. Python 3中 mp3play module 的使用
  18. c31 rotc_百度百科
  19. mac电脑开机进入grub界面
  20. 总结——硬件工程师面试容易碰到的问题

热门文章

  1. evoc服务器长鸣报警显示正常,研祥工业服务器出大事了!
  2. 用python可以解决什么问题_学 Python 能帮你解决什么问题 ?
  3. 接口自动化关联解决方案
  4. python 元组 列表 字典区别_Python列表、元组、字典、集合、字符串的异同总结
  5. python string转int_Python int与string之间的转化
  6. 安卓案例:帧式布局演示(切换颜色)
  7. 基于注解使用MyBatis
  8. 链表 java详解_链表详解——Java版
  9. java编译生成哪些文件_java编译后生成什么文件?生成的文件包括什么?
  10. 算术运算导致溢出。_【S7200指令教程】数据运算指令ADD SUB MUL DIV