SonicUI是一个GUI引擎,提供了一些简单的UI组件实现高效率的UI效果,例如:自绘按钮、异形窗体、动画、超链接和图像操作方法。此项目作者开源到CodeProject,地址为:http://www.codeproject.com/KB/GDI/SonicUI.aspx。下载源代码编译动态库版本和静态库版本,在此我以Visual Studio 2008 SP1编译,也打包到下面的下载地址里面。下面介绍下SonicUI在MFC中的使用,如果有错误之处,还请指出。

1.新建一个基于对话框、使用Unicode库的工程,工程名称SonicUITest;
2.复制ISonicUI.h文件到工程目录下,添加此文件进工程;
3.复制SonicUIUd.dll、SonicUIUd_Dll.lib和SonicUIU.lib到工程目录下(这些是自己编译出来的);
4.在stdafx.h文件,添加以下代码:

1
2
3
4
5
6
#include "ISonicUI.h" 
#ifdef _DEBUG 
#pragma comment(lib,"SonicUIUd_Dll")    //调试时用Debug动态库 
#endif 
#pragma comment(lib,"SonicUIU")        //发布时用Release静态库(目录下还需其他支持库) 
using namespace sonic_ui; 

5.在对话框头文件,添加以下代码:

1
2
3
4
];            //以关键字格式化字符串 
    void OnClose(ISonicString * pStr, LPVOID);    //委托关闭 

6.在对话框构造函数,添加以下代码:

1
2
3
    g_pEffect = NULL; 
    g_pText[] = NULL; 
    g_pText[] = NULL; 

7.在对话框OnInitDialog初始化函数里,添加以下代码:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
BOOL CSonicUITestDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 
    ,,)); 
 
    ] = GetSonicUI()->CreateString(); 
    g_pText[] = GetSonicUI()->CreateString(); 
 
    ]->Format(_T(]->Format(_T(, , )); 
    return TRUE;  
} 

8.添加窗体变换后的委托事件代码:

1
2
3
4
void CSonicUITestDlg::OnClose(ISonicString * pStr, LPVOID) 
{ 
    ::DestroyWindow(g_pEffect->GetSafeHwnd()); 
} 

9.窗体上添加3个按钮,事件分别如下:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
, ); 
} 
 
, , ), , LWA_COLORKEY); 
} 
 
, CRect(, , , ), ); 
} 

10.在对话框OnPaint()函数里面绘制文字,添加以下代码:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
]->TextOut(hdc, , , m_hWnd); 
        g_pText[]->TextOut(hdc, , , m_hWnd); 
        ::EndPaint(m_hWnd, &ps); 
        CDialog::OnPaint(); 
    } 
} 

11.编译、运行程序,截图如下:

SonicUI对异形窗体,自绘按钮等的支持。

1.首先准备素材文件,一张PNG背景图和一张PNG按钮图片,导入到上面工程的资源里面,VS2008会自动分辨为“PNG”资源类型名。
再加入一张动态GIF头像,加入到新建“IMAGE”资源类型,ID号为GIF_USERHEAD。再从“资源视图”打开IDD_ABOUTBOX对话框,删除默认控件,添加两个EDIT控件,设置其属性Border为False、Multiline为True、Want Return为True。
2.在对话框的实现文件,类CAboutDlg里面添加以下代码:

1
2
3
4
5
6
7
protected: 
    ISonicString* g_pButton;    //自绘按钮 
    ISonicImage* g_pImgButton;    //自绘按钮图片 
    ISonicImage* g_pImgBG;        //背景图片 
    ISonicImage* g_pImgUserHead;    //头像图片 
    ISonicAnimation* g_pUserHead;    //头像图片动画 
    void OnClose(ISonicString* pStr, LPVOID);    //委托关闭事件 

3.重载CAboutDlg的WM_PAINT消息函数,剩下的代码如下:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
BOOL CAboutDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 
 
    ,,)); 
    a_pEffect->SetLayeredAttributes(RGB(, , ), , LWA_COLORKEY); 
     a_pEffect->EnableWholeDrag(TRUE); 
 
    , , g_pImgBG->GetWidth(), g_pImgBG->GetHeight(), SWP_NOMOVE); 
    ::SetWindowPos(GetDlgItem(IDC_EDIT1)->m_hWnd, NULL, , , , , SWP_NOZORDER); 
    ::SetWindowPos(GetDlgItem(IDC_EDIT2)->m_hWnd, NULL, , , , , SWP_NOZORDER); 
     
    , , pGif->GetWidth(), pGif->GetHeight()); 
    g_pUserHead->AddObject(pGif->GetObjectId()); 
 
    , , m_hWnd); 
    ::EndPaint(m_hWnd, &ps); 
} 
 
void CAboutDlg::OnClose(ISonicString * pStr, LPVOID) 
{ 
    OnOK(); 
} 

4.编译、运行程序,截图如下:

下载地址:http://download.csdn.net/source/3561699

参考资料:

1.SonicUI - A Convenient GUI Engine You've Never Seen  http://www.codeproject.com/KB/GDI/SonicUI.aspx
2.让UI开发轻松而快乐,用SonicUI引擎实现常见UI效果 http://blog.csdn.net/zskof/article/details/3496343
3.SonicUI运行机制的粗略分析 http://blog.csdn.net/alien75/article/details/5940210

SonicUI在MFC中的使用的更多相关文章

  1. MFC中使用FLASH

    一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...

  2. MFC中换行实现

    在mfc中编辑框允许输入多行时,换行符被表示为<归位><换行>即"\r\n",用ascii码表示为13 10 如果为编辑框中想要输入换行,就请将编辑框的属性 ...

  3. MFC中的各种DC区别

    转载自:xntop的<区别MFC中的CClientDC.CWindowDC.CPaintDC.CMetaFileDC> CClientDC及其子类 1. CClientDC类只能在客户区绘 ...

  4. VC++ MFC中如何将应用程序的配置信息保存到注册表中(二)

    在上一篇中介绍了几个写入注册表数据和读取注册表数据的接口,并介绍了使用方法. 这一片教你如何使得你的应用程序在下次打开时保持上一次关闭前的状态. 在上一篇添加的代码的基础上,要添加WM_CLOSE消息 ...

  5. MFC中对话框类(Dialog)的应用

    转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85 Windows应用程序通常是通过对话框接收用户输入.向用户输出信息,本节介绍应 ...

  6. MFC中添加消息响应函数

    转自:http://blog.csdn.net/eddy_liu/article/details/8474677 目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构.这种程序框架与简单 ...

  7. MFC中使用Duilib--2

    在上一篇文章"MFC中使用Duilib--1"中, 没有用到资源文件,即xml,本篇讲怎样加载文件. 1.  在exe输出目录下,创建一个skin目录,里面放入需要用到的图片文件, ...

  8. MFC中,如何自定义用户消息

    1.用处 在多个类之间传递消息.当需要响应用户操作,本类却无法实现时,可以向系统发出消息.然后让系统中的需要的位置实现它. 2.方法 2.1定义这个消息,并让拥有者发送这个这个消息,传递一个整型参数 ...

  9. 互斥对象 Mutex 和MFC中的CMutex

    互斥(Mutex)是一种用途非常广泛的内核对象.能够保证多个线程对同一共享资源的互斥访问.同临界区有些类似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共 ...

随机推荐

  1. Android项目增加混淆

    主要介绍向Android项目中添加混淆功能 增加混淆的原因 提高安全性,增加反编译的难度 减少APK的文件大小 实践 混淆的配置 一般情况下,app module 的 build.gradle 文件默 ...

  2. java 抽象类与接口的区别 整理

    抽象类与接口的区别 抽象类 包含抽象方法的类就是抽象类,声明的语句:abstract class 必须是public protected 接口 对行为的抽象,声明语句:interface 抽象方法的修 ...

  3. 关于R.styleable的问题

    原来想直接想调用程序的东西,但是使用R.styleable的时候 eclipse不能解析了,后来发现原来被删除了此方法 public ImageAdapter(Context c) { mContex ...

  4. BZOJ 2440 完全平方数

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 966  Solved: 457 [Submit][Sta ...

  5. SQLite取值时的下标与创建表中字段的关系

  6. jQuery遍历table

    1. $("table").find("tr").each(function(){ $(this).find("td").each(func ...

  7. centos6.5 mysql安装+远程访问+备份恢复+基本操作+卸载

    参考博文: Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置 MySQL修改root密码的多种方法 MySQL的备份与还原 解决mysql导入还原时乱码的问题 ...

  8. 批量的单向的ssh 认证

    <pre name="code" class="python">if [ ! $# -eq 2 ] ;then echo "请输入用户密码 ...

  9. [置顶] hdu3018解题报告--也是白话几笔画学习总结

    1.题意 2.分析难点(结合图形) 1.首先说说题意吧...题意很简单...但是一开始很菜的我就很迷惑..在想啊...题目怎么就会有没有连接边的点呢....因为你每次给出一条边..就把 a,b连接啦. ...

  10. cocos2d-实现读取.plist文件(使用数组CCArray)

    学习札记之cocos2d-x2.1.1实现读取.plist文件(使用数组CCArray) <?xml version="1.0" encoding="UTF-8&q ...