C, C++, Obj-C

记录VS2010下用BCGControlBar编译程序时的一个小问题

链接期错误信息如下:

1>BCGCBPRO1200StaticUD100.lib(BCGPGridCtrl.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4
1>BCGCBPRO1200StaticUD100.lib(BCGPFrameImpl.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4
1>BCGCBPRO1200StaticUD100.lib(BCGPFullScreenImpl.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4
1>BCGCBPRO1200StaticUD100.lib(BCGPDlgImpl.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4
1>BCGCBPRO1200StaticUD100.lib(BCGPAppBarWnd.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4

win32下combobox控件的一个大量添加数据时的加速技巧

今天在做MFC程序的时候用到了combobox作下拉列表选择,以前也用过这个控件,但是很少有像今天这样大量AddString的情况,而且是做联动list会同时更新3个以上combo的列表项,运行发现会很卡,而且简单用GetTickCount查了一下,发现就是AddString在耗费时间。其实这个操作默认情况下会触发控件的重绘,从而导致浪费了时间,一般情况下,添加项的时候是不会即刻显示的,所以可以通过SetRedraw(FALSE)然后再add的方法就可以有效提高数据添加的速度了,当然结束以后要SetRedraw(TRUE)回来,然后随便用个什么方法触发一下重绘就可以了。

Win7下使用VS2008生成C++ 项目时的link error

最近发现在Win7下使用VS开发C++项目时,在编译生成目标文件的时候总会时不时的出个link错误:fatal error LNK1000: Internal error during IncrBuildImage,还以为是程序写的有问题,后来发现再执行一次build就不会出错了!其实原来在xp下用VS2008也没出过这个问题,直到最近发现出现频率越来越高,受不了了开始寻求解决方法,发现其实是bug,而且ms也已经提供了补丁:http://support.microsoft.com/kb/948127,打上补丁就解决了。

Symbian编译时的Error -1073741819错误

完整错误信息类似下面这样:

make[1]: *** [\Symbian\9.2\S60_3rd_FP1_2\EPOC32\BUILD\…\Gif_Reader.o] Error -1073741819
make[1]: *** Waiting for unfinished jobs….
make[1]: *** Waiting for unfinished jobs….
make[1]: *** Waiting for unfinished jobs….
make: *** [TARGETMGATE] Error 2

这只是在整个过程中的一部分出现,最后提示还是***Build Complete,carbide的problems里也没有任何对应的代码位置提示,很容易误解成sdk或这编译器坏了,网上有人说重装sdk,有人说clean一遍项目。其实这是由于代码里写了一些貌似合法但实际不对的写法,举个具体的例子就是拿对象类型的变量强制转换成指针使用,比如

CCoeControl& iParent;
((CTestAppView*)iParent)->foo();

这样,就会导致这种build错误。

WM下MFC基于对话框(dialog based)程序的最小化

在WM下的MFC基于对话框程序(VS模板自动生成状态下),运行之后右上角显示的是OK图标,点击后走的逻辑是dialog的OnOK()默认逻辑,会直接把对话框程序关闭掉。这个右上角的按钮据说在SDI或MDI程序运行时显示的是X,会有对应smart minimize的功能,就是点了是最小化隐藏的功能。开始尝试使用ShowWindow(SW_MINIMIZE)的方法来最小化对话框程序,发现结果是右上角的ok没了,下面的左右软键菜单没了,但程序主窗口还在显示,没有像用过的其他程序那样ok按了以后显示windows的today界面。后来换用ShowWindow(SW_HIDE),这样确实是隐藏了,也看见today了,但是再想重新打开程序就不行了,htc的应用程序列表里没有我的程序,开进程管理器直接激活进程倒是可以,但是切换的话会提示说程序窗口已被隐藏XX,不能再打开了,只能强制结束进程。
其实这个问题好像很早以前就被发现了,据说是个today的bug,详情看这:QA: How to create Today-friendly dialog based application?,默认对话框的窗口类型是WS_POPUP,而默认情况下基于对话框程序的这个dialog window的parent就是today这个窗口(等价于windows的desktop),最小化或者直接激活today显示会导致触发其子窗口的显示,所以又把dialog给弄出来了,解决方法倒是相当简单:把WS_POPUP样式换成WS_OVERLAPPED!

关于WM上左右软件菜单项的EnableMenuItem(使用MFC的CCommandBar添加)

关于WM上MFC程序对左右软件菜单的控制,可以用win32的方法ShCreateMenu这套逻辑,或者使用CCommandBar这个类(替换掉的以前5.0之前的CCeCommandBar类),先Create然后InsertMenuBar就可以将常规menu资源作为左右软键对应的菜单显示,还可以添加toolbar,虽然看上去有点挤。
由于这种创建菜单的方法,让我误认为只是将win32的menu换了个添加方法,换了个绘图位置,导致后来要实现动态enable,disable菜单项时遇到了挠头的问题。按照常规的做法,在执行逻辑时调用EnableMenuItem(hMenu,IDM_MITEM,MF_BYCOMMAND|MF_GRAYED),函数调用,返回值以及参数hMenu都没有问题,但执行起来就是没有disabled的效果,google了一通发现国内国外都有很多人提到这个问题,最终也没有个明确的答复,不是说参数hMenu不对,就是说用ShGetMenuXXX的去取菜单,怎么看也不像是真正的解决办法。
后来在一篇动态更新菜单名称的文章中看到貌似WM对左右软键的菜单是作为POPUP MENU处理的,也就不像是win32正统主菜单那样,嗖得丝内,恍然大悟,换用响应WM_INITMENUPOPUP消息的方式,对要变更的菜单项作弹出菜单时的enable disable处理,问题解决,没想到被一个菜单项给杯具了……

windows mobile 6环境下的OpenGL ES开发环境设置

  Mobile SDK用的是6 refresh附带6.5 chs的rom,IDE用的是VS 2008。

  由于google到的相关gles和mobile的开发教程大部分都是对比较早版本的mobile sdk写的,所以可能到了6.0这个时代发生了一些变化导致教程上的某些方法不再适用了(至少我按着其中的做法没有成功…)。这里把能在模拟器上成功运行gles程序的环境设置方法总结一下。

Continue reading…

WM模拟器上DirectDraw的BackBuffer问题解决方法

上次在参考研究mobile sdk 6.0中自带的DDraw例子时发现在模拟器上跑到创建后备缓冲时由于不支持DDSCAPS_BACKBUFFER而导致程序不能运行,google了一通发现m$网站和其他一些论坛上也有人问过类似问题,得到的答案貌似是说emlator上不能跑DDraw和D3D的程序,要测只能用device,其实只要自己实现一个创建后备缓冲以及用blit模拟flip的方式就可以在模拟器上跑了,并不是模拟器根本就没有实现DDraw,只是没有实现硬件后备缓冲、翻转等操作(其实在现在的PC模拟器上的这2种方式应该也没有什么效率上的差异吧)。
具体代码:
Continue reading…