SonicUI在MFC中的使用

article/2025/10/19 1:00:42

       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
protected:     
    ISonicWndEffect* g_pEffect;            //窗口的效果引擎 
    ISonicString* g_pText[2];            //以关键字格式化字符串 
    void OnClose(ISonicString * pStr, LPVOID);    //委托关闭 
6.在对话框构造函数,添加以下代码:

1
2
3
    g_pEffect = NULL; 
    g_pText[0] = NULL; 
    g_pText[1] = 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(); 
    //…… 
    //创建ISonicWndEffect 
    g_pEffect = GetSonicUI()->CreateWndEffect(); 
 
    //把窗体句柄加到ISonicWndEffect 
    g_pEffect->Attach(m_hWnd); 
     
    //设置窗体背景颜色 
    g_pEffect->SetBkColor(RGB(255,0,255)); 
 
    //委托窗体变换之后的事件,让其关闭窗体 
    g_pEffect->Delegate(DELEGATE_EVENT_TRANSFORM_OVER, NULL, this, &CSonicUITestDlg::OnClose);   
 
    //创建ISonicString 
    g_pText[0] = GetSonicUI()->CreateString(); 
    g_pText[1] = GetSonicUI()->CreateString(); 
 
    //格式化文字 
    g_pText[0]->Format(_T("/def/这是一段文字,使用SonicUI引擎实现")); 
    g_pText[1]->Format(_T("/c=%x, a='http://blog.csdn.net/akof1314', linkl=1, linkt='点击'/无幻博客http:blog.csdn.net//akof1314"), RGB(00255)); 
    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
void CSonicUITestDlg::OnBnClickedMoveButton() 

    //动画移动 
    g_pEffect->MoveGently(00); 

 
void CSonicUITestDlg::OnBnClickedAlphaButton() 

    //设置透明度 
    g_pEffect->SetLayeredAttributes(RGB(2550255), 0, LWA_COLORKEY); 

 
void CSonicUITestDlg::OnBnClickedAnicloseButton() 

    //变换窗体 
    g_pEffect->EnableTransform(TRUE, 0, CRect(0011), 20); 
10.在对话框OnPaint()函数里面绘制文字,添加以下代码:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
void CSonicUITestDlg::OnPaint() 

    if (IsIconic()) 
    { 
        //…… 
    } 
    else 
    { 
        PAINTSTRUCT ps; 
        HDC hdc = ::BeginPaint(m_hWnd, &ps); 
        g_pText[0]->TextOut(hdc, 5050, m_hWnd); 
        g_pText[1]->TextOut(hdc, 100100, 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(); 
 
    //窗口风格 
    SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE)&~(WS_CAPTION)); 
    SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE)&WS_EX_TOOLWINDOW); 
 
    //自绘按钮 
    g_pImgButton = GetSonicUI()->CreateImage(); 
    g_pImgButton->Load(PNG_BUTTON, NULL, _T("PNG")); 
    g_pButton = GetSonicUI()->CreateString(); 
    g_pButton->Format(_T("/a, p4=%d, linkt='关闭窗体', btn_text='关闭', animation=40/"), g_pImgButton->GetObjectId()); 
    g_pButton->Delegate(DELEGATE_EVENT_CLICK, NULL, this, &CAboutDlg::OnClose); 
 
    //异形窗体 
    g_pImgBG = GetSonicUI()->CreateImage(); 
    g_pImgBG->Load(PNG_BG, NULL, _T("PNG")); 
    ISonicWndEffect* a_pEffect = GetSonicUI()->CreateWndEffect(); 
    a_pEffect->Attach(m_hWnd); 
    a_pEffect->SetBkColor(RGB(255,0,255)); 
    a_pEffect->SetLayeredAttributes(RGB(2550255), 0, LWA_COLORKEY); 
     a_pEffect->EnableWholeDrag(TRUE); 
 
    //调整位置 
    ::SetWindowPos(m_hWnd, NULL, 00, g_pImgBG->GetWidth(), g_pImgBG->GetHeight(), SWP_NOMOVE); 
    ::SetWindowPos(GetDlgItem(IDC_EDIT1)->m_hWnd, NULL, 8115401205, SWP_NOZORDER); 
    ::SetWindowPos(GetDlgItem(IDC_EDIT2)->m_hWnd, NULL, 8330401117, SWP_NOZORDER); 
     
    //动态头像 
    g_pImgUserHead = GetSonicUI()->CreateImage(); 
    g_pImgUserHead->Load(GIF_USERHEAD); 
    ISonicString* pGif = GetSonicUI()->CreateString(); 
    pGif->Format(_T("/p=%d/"), g_pImgUserHead->GetObjectId()); 
    g_pUserHead = GetSonicUI()->CreateAnimation(); 
    g_pUserHead->Create(m_hWnd, 266, pGif->GetWidth(), pGif->GetHeight()); 
    g_pUserHead->AddObject(pGif->GetObjectId()); 
 
    return TRUE;  // return TRUE unless you set the focus to a control 

 
void CAboutDlg::OnPaint() 

    PAINTSTRUCT ps; 
    HDC hdc = ::BeginPaint(m_hWnd, &ps);     
    g_pImgBG->Draw(hdc); 
    g_pButton->TextOut(hdc, 352456, 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


http://chatgpt.dhexx.cn/article/k9L54N4q.shtml

相关文章

将ribbon主题应用到对话框中去(转载)

原帖地址:这里 找了N久,终于在无幻大神这里找到了将ribbon sdi主题应用到对话框程序中的方法,好像这是一个开源的项目,google code里有,地址在 这里。记录下: 1、下载网页里的资源KofPack0.1,vs里打开工程…

如何制作一个横版格斗过关游戏 Cocos2d-x 2.0.4

本文原创版权归 csdn 无幻 所有,转载请详细标明原创作者及出处,以示尊重! 作者:无幻 原文:http://blog.csdn.net/akof1314/article/details/8549150 本文实践自 Allen Tan 的文章《How To Make A Side-Scrolling Bea…

VC复制HTML格式到剪贴板 HTML Clipboard Format

本文作者:无幻 测试环境:Windows 7 开发环境:Visual Studio 2008 SP1 参照MSDN和帮助,在VC下测试代码如下: C语言: BOOL CBaseDialogDlg::CopyHtmlToClip( const CString &strHtml ) { // 1)转换成UTF-8 CW2A p…

如何制作一个横版格斗过关游戏(2) Cocos2d-x 2.0.4 .

本文原创版权归 csdn 无幻 所有,转载请详细标明原创作者及出处,以示尊重! 作者:无幻 原文:http://blog.csdn.net/akof1314/article/details/8572546 在第一篇《如何制作一个横版格斗过关游戏》基础上,增加…

Cocos2d-x 2.0.1 学习tests示例(二)ActionsTest

作者:无幻 博客: http://blog.csdn.net/akof1314 初学Cocos2d-x,如文章有错误之处,欢迎指出 自上篇《 Cocos2d-x 2.0.1 学习tests示例(一)Manual Transformation》继续学习tests示例。 1 2 3 4 5 6 7 8 9…

改变CMFCRibbonBar高度

本文作者:无幻 测试环境:Windows XP 开发环境:Visual Studio 2010 要改变CMFCRibbonBar的高度,需要重载CalcFixedLayout函数,例如如下: 头文件: #pragma once// // CKofMFCRibbonQuickAccessTo…

Cocos2d-x 2.0.1 学习tests示例(一)Manual Transformation

作者:无幻 博客: http://blog.csdn.net/akof1314 初学Cocos2d-x,如文章有错误之处,欢迎指出 从上次《Cocos2d-x 2.0 从HelloWorld入手》,继续学习tests示例。 1.右键点击“Solution ‘cocos2d-win32.vc2008’"&…

Unity3d好东西应该被看见_分享一个Assetbundle分析工具

关于Assetbundle分析 很多年前获得过搜狐畅玩的代码 不确定是不是腾讯流出版本,反正经历了深圳畅玩,到北京畅玩。 整个中国地图,从南到北,成熟的Unity手游团队,手上几乎都是那一份ASSETBUNDLE处理代码 功能太多&am…

Visual C++ 2008 Feature Pack 示例截图

Visual C 2008 Feature Pack 示例截图 by 无幻 百度文库:http://wenku.baidu.com/view/f09e5575a417866fb84a8eb6.html 豆丁文档:http://www.docin.com/p-55873972.html CSDN下载:http://download.csdn.net/source/2380293 动态图片显示…

CRichEditCtrlEx支持静态表情聊天类的使用

本文作者:无幻 博客地址:http://blog.csdn.net/akof1314 平时我们在做IM聊天之类的软件的时候,一般都会使用Rich Edit控件来作为聊天编辑框和聊天记录框的控件,在之前的VC知识库看过《类似 MSN 信息发送框的制作(上)》、《类似 MS…

方舟服务器文件夹,方舟生存进化文件夹里哪个才是打开游戏 | 手游网游页游攻略大全...

发布时间:2016-04-07 有许多玩家反映在方舟生存进化当中自己在洞穴里只能挖到石头,挖不到水晶,这是怎么回事呢?接下来小编就为大家带来方舟生存进化在洞穴里怎么才能采集到水晶的详细攻略. 答:用铁镐挖才能采集到水晶,用石镐就只能采到石头,希望能帮到 ... 标签&am…

【VC学习】VC2010 Windows Media Player控件的使用技巧

声明:以下博客基于无幻 VC2008 Windows Media Player控件的使用技巧,自行学习整理 附上原地址:http://blog.csdn.net/akof1314/article/details/4900040 本是跟着老师选修课学习,编程都是基于MFC,手动在toolbox里面修…

真Unity3d_分享一个编辑器扩展模型预览视图Mesh Preview Inspector窗口

预览窗口 在 Unity 编辑器界面上可以看到除了 Game 视图、Scene 视图,其他的视图也会出现绘制三维物体的地方,比如检视器的预览窗口,当选中网格时,会对网格进行预览,如下所示: 预览窗口是UnityEditor的底层框架 UnityEditor框架图 可看我之前的博客: https://blog.c…

lookup

这里注意数组 1.{ sum((E3:E11)*(F3*F11) )} 代表数组运算ctrlentershift,因为(E3:E11)*(F3*F11)返回的是数组 2. sum(E3:E11)其中E3:E11也是数组但是直接enter就可以‘ 为什么:因为(E3:E11)是本来就存在的列,(E3:E11)*(F3*F11)是运算出来…

access Dlookup的值写入表

目的 写入供应商名称,自动弹出供应商代码,然后将该条记录增加到表中 方法 在供应商名称的属性表写,不是供应商代码的属性表 在事件过程中写入- Private Sub 供应商名称_AfterUpdate() Me.供应商代码.Value DLookup(“供应商代码”, “Q_…

access-vba之用户登录窗口

界面截图如下: 创建一个窗体设计,然后在设计中找到控件 因为科室更新,带来了用户的更新,所有用户的行来源不指定,但科室的行来源要指定 最后,我们通过VBA实现用户的行来源,这样可以保证在科室变化的情况下,用户实时显示每个科室的人员 Private Sub keshi_AfterUpdate(…

Excel函数公式大全—LOOKUP函数

EXCEL系列文章目录 Excel系列文章是本人亲身经历职场之后萌发的想法,为什么Excel覆盖如此之广,几乎每个公司、学校、家庭都在使用,但是它深藏的宝藏功能却很少被人使用,PQ、BI这些功能同样适用于数据分析;并且在一些需…

Dev的searchLookUpEdit

新添加的searchLookUpEdit的Text属性值为[EditValue is null],并且无法直接通过修改Text属性来修改,而是可以通过修改它的Properties.NullText属性来修改,比如将该属性赋值为空,则为如下效果: searchLookUpEdit1.Prop…

LOOKUP函数10种经典用法

转载 https://mp.weixin.qq.com/s?__bizMzI0NzA5MTAyNg&mid2653352337&idx1&sn7494ca76ddf66483d8961f84fdbc958e&chksmf2670bacc51082baa65caa5f9af84e2f2121d635a16be1e9fd9557c6d8c68a5fe17bf90a4ce8&scene27 案例1:按照销售金额区间查询提成比例 此法…

LOOKUP函数

数值可升序: lookup(查找值,查找区域,返回值) lookup(查找值,查找区域返回值B2) B2的 第一列为查找区域,最后一列返回值 https://wenku.baidu.com/view/ddce993ae45c3b35…