Just in Works

December 18, 2007 No Comments

MFC开发中,利用LoadCursor(该函数有两个,一个是SDK的,一个是类CWinApp中的)来加载光标。

1.使用系统预设的光标:

HCURSOR hCursor = ::LoadCursor(NULL, IDC_ARROW);

第一个参数须为NULL。注意,传递IDC_HAND(设置手形的光标)的时候,如果系统是Windows 98/Me, Windows 2000/XP,须在 #include <afxwin.h> 语句前加上 #define WINVER 0×0500 (主要是用来指明所运行的系统类别),方得以成功编译并实现手形光标的加载。

2.使用自定义的光标,假如已在资源中建立ID为 IDC_MYCURSOR 的光标,

HCURSOR hCursor = ::LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_MYCURSOR));

据同事及网上的朋友介绍,他们以前这样用基本上都是没问题的。不过在我的程序中,就奇了怪了,获得的hCursor 值一直为空。经测试,AfxGetInstanceHandle() 返回的值正确,下面考虑是不是MAKEINTRESOURCE()这个宏里出了问题,具体有待解决。

替代方案:

HCURSOR hCursor = AfxGetApp()->LoadCursor(IDC_MYCURSOR); // OK, no problem here!

疑惑,这里又有点不明白。按理说,类中的LoadCursor在底层实现的时候还是要调用SDK的LoadCursor…

Next a problem
在网上讨论了一阵,还是没有解决,最后还是冷静地停了下来,仔细地想了想,就这样,也竟然发现了问题的根源。

关于所建资源的ID号,外加引号的问题。经证实,若某个资源ID号的定义并不在该资源文件所包含的头文件中时,系统(这里指VC++6)会自动给该资源ID加上引号。一旦加上引号,貌似有些调用就得修改了,具体情况似乎得具体对待。当然也可以自行加上引号,然后一切按字符串方式传递。

有时觉得自己在钻牛角尖,也经常犹豫,在想这些繁多而琐碎的细节到底值不值得去花时间关注。对于这样的工作,细节的问题不可避免,但一直这样,总觉得难成气候,但如果不去解决,工作就会受阻,总之挺烦人的。
可能是我还没平衡好吧,希望这只是暂时的…

没有什么是放之四海而皆准的,写程序时也是,最好把各个接口的条件给限制好了,当然也得说明清楚!

, , Technology

Leave a Reply

Flickr Photostream