C, C++, Obj-C

Nokia官网Sound Mixer Example v2.1中用的wav文件格式

Nokia官网提供的混音示例程序中http://www.forum.nokia.com/info/sw.nokia.com/id/650db12f-06aa-4608-b17a-387b70412304/S60_Platform_Sound_Mixer_Example_v2_1_en.zip.html使用的wav格式为16-bit mono的标准pcm采样文件的纯采样数据部分(这样好处是去掉了wav头信息,减少了一定的容量,坏处就是不能用一般的播放器直接播放),以下为生成该种wav的方法:
Continue reading…

windows mobile中的directdraw

今天说研究一下mobile的游戏开发吧,先从2d这块入手。查到资料说早期是用一种叫做gapi的接口作的,但后来被directdraw取代了,那就用dd吧,好在以前研究过pc的,找了个例子看了看基本差不多,可发现模拟器上无法运行,因为后备缓冲不支持,真是麻烦了啊,调试只能用真机了?

一篇Mac OS下的GL中glFlush和glFinish的区别解释

Q: What’s the difference between glFlush() and glFinish()?
A: OpenGL commands are not executed immediately. Instead, they are submitted to a command buffer that is then fed into to the hardware. The glFlush() and glFinish() commands are both used to force submission of the command buffer to the hardware for execution. glFlush() causes all OpenGL commands currently queued to be submitted to the hardware for execution. This function returns immediately after having transferred the pending OpenGL command queue to the hardware (or software) renderer. These commands are queued for execution in some finite amount of time, but glFlush() does not block waiting for command completion.

Continue reading…

[ZT]怎样写参数个数可变的宏?

一种流行的技巧是用一个单独的用括弧括起来的的 “参数” 定义和调用宏, 参数在宏扩展的时候成为类似 printf() 那样的函数的整个参数列表。

#define DEBUG(args) (printf("DEBUG: "), printf args)
if(n != 0) DEBUG(("n is %d\n", n));

明显的缺陷是调用者必须记住使用一对额外的括弧。

gcc 有一个扩展可以让函数式的宏接受可变个数的参数。 但这不是标准。另一种可能的解决方案是根据参数个数使用多个宏 (DEBUG1, DEBUG2, 等等), 或者用逗号玩个这样的花招:

#define DEBUG(args) (printf("DEBUG: "), printf(args))
#define _ ,
DEBUG("i = %d" _ i);

C99 引入了对参数个数可变的函数式宏的正式支持。在宏 “原型” 的末尾加上符号 … (就像在参数可变的函数定义中), 宏定义中的伪宏 __VA_ARGS__ 就会在调用是替换成可变参数。

最后, 你总是可以使用真实的函数, 接受明确定义的可变参数。参见问题 15.415.5。如果你需要替换宏, 使用一个函数和一个非函数式宏, 如 #define printf myprintf。

参考资料: [C9X, Sec. 6.8.3, Sec. 6.8.3.1]。

windows shell extension的注册表问题

CodeProject上有个非常好的讲shell扩展的系列文章:The Complete Idiot’s Guide to Writing Shell Extensions,作者在文章中提到了一下关于如何处理注册表的问题,主要是在哪添加context menu handler的问题。
以下是原话:
We can’t reliably use an RGS script since “txtfile” may not be the correct key name.
Some other text editor may be installed that associates itself with .TXT files. If it changes the default value of the HKEY_CLASSES_ROOT\.txt key, all existing shell extensions will stop working.
实际应用时我发现,如果ext针对的是一些比较常用的格式,如PNG,那么出现上述作者预料到的问题的可能性极高,原始情况下的PNG是这样:.png->pngfile,安装PhotoShop或ACDSee等软件并关联png后,就会改变.png想对应的名字项.png->ACDSee.png .png->PhotoShop.PNG.8,类似这样的东西,所以在实际应用中依赖.rgs注册表脚本文件是一种很不可取的方式,正确的做法应该是在dll注册服务器的时候,手动处理添加关联,当然,一些com的其它注册问题写在.rgs里还是没问题的,最后也别忘了在反注册的时候,手动删除自己添加的关联。(有ATL的话直接用CRegKey非常简单)

[ZT]DLL导出函数中有namespace时的用法

DLL中可以导出很多用户自定义的函数、类型、全局变量等。但是,我们有必要注意到这样的一种情形:我们写的DLL中有一些函数,能满足我们的需要,同时,我们也需要用到其他人写的DLL,但是不幸的是,这两个DLL中有同名的函数。尽管你可能还没碰到这样的情形,但是你可能要开始留意这个问题了,那么有什么好的办法来避免吗?

Continue reading…

vcl线程内Synchronize更新主线程ui的问题

问题是这样的:我的Form会触发一个相当耗时的work,而同时我又不希望这个Form在做这个work的时候UI停止响应,所以,我把这个work放到了线程里执行(起了个继承自TThread的TWorker类),现在的问题时我想让这个工作的当前完成度在Form上以进度条的形式反馈给用户,也就是在线程中更新vcl组件的问题,

Continue reading…

[ExpressBars]How to Force a Main Menu to Always Be on Top of a Form

This can be accomplished if the main menu is placed onto a dock control, whose AllowDocking is set to False. Here are the step-by-step instructions of how to implement this feature in your application:
1. Drop the TdxBarDockControl component onto a form. The dock control is aligned to the top by default. Set the BarManager property to the BarManager of the form;
2. Dock the main menu to the dock control;
3. Set the AllowDocking to False of the dock control;
4. Set the NotDocking property of the main menu to [dsNone, dsLeft, dsTop, dsRight, dsBottom] (i.e. activate all options of the NotDocking).
The attached samples demonstrate the results of these steps.