Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1992861
  • 博文数量: 950
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 13070
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-04 09:23
文章分类

全部博文(950)

文章存档

2011年(1)

2008年(949)

我的朋友

分类: C/C++

2008-08-04 09:30:16

下载本文示例代码

下载源代码

大家知道,很多Windows程序都要使用MessageBox,只要在这个API函数的一个参数中使用MB_ICONQUESTION标志,便可以在MessageBox的对话框中显示问号图标。这样用不同的标志便可以显示不同的图标。与Windows以前的老版本相比,Windows 2000以及Windows XP中的图标越来越好看,种类也越来越多。为了更广泛地使用这些漂亮的图标,本文将介绍如何把它们运用到自己的对话框或窗体中去。为此,首先要解决的问题是:在哪里以及如何获取这些图标?
这个问题属于Windows中最基本的问题,同时也是最容易搞忘的问题。现在我们来看看一般情况下,我们是如何做的,通过使用预定义的形式为IDI_XXX的资源IDs作为参数调用::LoadIcon函数,我们可以获取任何所谓的系统图标。例如:
      HICON hIconQuestion = ::LoadIcon(NULL, IDI_QUESTION);      
图一是本文例子程序的运行画面,图中显示了所有的系统图标。


图一 例子程序运行画面

上图是例子程序在Windows 2000 SP3中运行结果。实现的细节都在mainfrm,cpp文件中。SysIcons[]是一个结构数组,其元素定义了图标资源的ID和名称:
const struct {

	LPCTSTR nResID;

	LPCTSTR name;

} SysIcons[] = {

	{ IDI_APPLICATION, _T("IDI_APPLICATION") },

	{ IDI_HAND, _T("IDI_HAND") },

	{ IDI_QUESTION, _T("IDI_QUESTION") },

	{ IDI_EXCLAMATION, _T("IDI_EXCLAMATION") },

	{ IDI_ASTERISK, _T("IDI_ASTERISK") },

#if(WINVER >= 0x0400)

	{ IDI_WINLOGO, _T("IDI_WINLOGO") },

	{ IDI_WARNING, _T("IDI_WARNING") },

	{ IDI_ERROR, _T("IDI_ERROR") },

	{ IDI_INFORMATION, _T("IDI_INFORMATION") },

#endif

	{ NULL, NULL }

};

加载图标是在CMainFrame::OnPaint()中进行的:
    ......

    for (UINT i=0; SysIcons[i].nResID; i  ) {

		HICON hicon = ::LoadIcon(NULL, SysIcons[i].nResID);

		ASSERT(hicon);

		CString name = SysIcons[i].name;

		......

    {

如果你想在自己的对话框或其它窗体中使用这些系统图标,方法是这样的:首先按通常方式创建一个静态控制,然后用下面的方法加载并显示图标:
HICON hicon = ::LoadIcon(NULL, IDI_HAND);

m_wndStatic.SetIcon(hicon);

这里假设m_wndStatic是你在对话框或窗体中创建的一个CStatic控制。在例子程序的“关于”对话框中,你可以看到一个问号图标,并且这个图标也有一个URL链接,这是因为使用了CStaticLink超链接类的缘故,它是由CStatic派生而来的。
虽然对系统图标的处理没有什么深奥的东西,但Windows把这些简单的东西弄得有点复杂化了,从图一中不难看出,IDI_HAND已不再是手的形状,至少在Windows2000和Window XP中是如此。从称呼上看也变味了,IDI_ASTERISK成了一个含有字母“i”的球形形状。微软对这种词汇上出现的困惑所做的解释是:老版本的Windows显示手形和星号;新版本则是用新的图标。在winuser.h文件中可以窥见这些变化:
#if(WINVER >= 0x0400)

#define IDI_WARNING     IDI_EXCLAMATION

#define IDI_ERROR       IDI_HAND

#define IDI_INFORMATION IDI_ASTERISK

#endif /* WINVER >= 0x0400 */ 

如果你想跟上微软的这些变化,那么就使用新符号好了。这样你的代码也会更可读一些,因为现在的警告、错误和信息符号更能传达图标所要表达的本意。
另外一个令人困惑的东西是:虽然winuser.h中新增了一个新的符号IDI_WINLOGO。在基于Windows XP的应用程序里使用这个图标产生的效果并不是我们所熟悉的那个家喻户晓飞扬的窗口标志,而是图一里IDI_APPLICATION所表示的一般窗口标志。仔细阅读有关文档后,你会发现微软对此的解释是“设计行为”。为什么这个具有某种代表意义的东西在不同的Windows OS中表现得如此模棱两可呢?此中缘由鲜为人知。 下载本文示例代码
阅读(334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~