SonicUI在MFC中的使用

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(0, 0, 255)); 
    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(0, 0); 

 
void CSonicUITestDlg::OnBnClickedAlphaButton() 

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

 
void CSonicUITestDlg::OnBnClickedAnicloseButton() 

    //变换窗体 
    g_pEffect->EnableTransform(TRUE, 0, CRect(0, 0, 1, 1), 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, 50, 50, m_hWnd); 
        g_pText[1]->TextOut(hdc, 100, 100, 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(255, 0, 255), 0, LWA_COLORKEY); 
     a_pEffect->EnableWholeDrag(TRUE); 
 
    //调整位置 
    ::SetWindowPos(m_hWnd, NULL, 0, 0, g_pImgBG->GetWidth(), g_pImgBG->GetHeight(), SWP_NOMOVE); 
    ::SetWindowPos(GetDlgItem(IDC_EDIT1)->m_hWnd, NULL, 8, 115, 401, 205, SWP_NOZORDER); 
    ::SetWindowPos(GetDlgItem(IDC_EDIT2)->m_hWnd, NULL, 8, 330, 401, 117, 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, 26, 6, 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, 352, 456, 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

时间: 2024-11-03 16:50:13

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

位图显示-MFC中OnPaint函数显示BMP图片的问题

问题描述 MFC中OnPaint函数显示BMP图片的问题 为什么我在MFC对话框中,在OnPaint函数中加入以下代码,BMP图像不能显示啊~~· BITMAP bm; CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); CDC memdc; CDC dc; memdc.CreateCompatibleDC(&dc);/ bmp.GetBitmap(&bm); CBitmap *bmpold=memdc.SelectObject(&bmp);/ dc

画图-如何用MFC中OnDraw函数输出的文字是反向的?

问题描述 如何用MFC中OnDraw函数输出的文字是反向的? 如题,要用绘图程序画图,在OnDraw函数中,如何输出反向的文字? 解决方案 自己先把文字反向reverse了,再OnDraw来TextOut 解决方案二: 只能是先把你要输出的字符改为反向的,然后再输出,比如用strrev来吧字符串反向一下

VC++ MFC中标题栏的文字,如何横向滚动,用定时器实现的话怎么写呢?

问题描述 VC++ MFC中标题栏的文字,如何横向滚动,用定时器实现的话怎么写呢? VC++ MFC中标题栏的文字,如何横向滚动,用定时器实现的话怎么写呢? 解决方案 用CString的Mid函数,依次从左边去掉一个字符加在右边,然后设置下标题. 解决方案二: 主要就是定时器中每次都把字符串做一个偏移,然后再显示,这样看上去就是滚动的了

mfc-求大神解答,在MFC中如何通过代码将本地的图片加载到资源中并分配ID?

问题描述 求大神解答,在MFC中如何通过代码将本地的图片加载到资源中并分配ID? 求大神解答,在MFC中如何通过代码将本地的图片加载到资源中并分配ID? 解决方案 资源是编译时候的概念,加载是运行时候的概念. 资源被资源编译器编译,再通过链接器附加到可执行文件上.程序运行的时候它是只读的. 解决方案二: 不知道你为什么要怎么做,不可以直接在程序中调用资源吗 解决方案三: 用CXImage等类库可以加载文件 解决方案四: 用CImage加载本地图片就不要放到资源视图中了,也就没有资源ID的概念了.

mfc-关于MFC中nEscapement和nOrientation的区别和用法

问题描述 关于MFC中nEscapement和nOrientation的区别和用法 我使用的是cEscapement的方式调整字体角度,结果是以每行的首字为原点的角度变化,即如果换行了,文字变换角度是对的但上下两行仍然是对齐的. 有没有什么办法使得角度变换后能够将整个字体作为整体一起改变. (_T("字体角度") == strName) { lf.lfEscapement = _ttol(strVal) *10; pText->m_pFont = pText->m_pLay

绘图-MFC中如何给CLientDC添加滚条

问题描述 MFC中如何给CLientDC添加滚条 小弟在MFC中的View类中用clientDC进行绘图,但是加了滚条之后拖动滚条,原来绘制的图形都会消失,点击最小化或者改变Client区的大小也会侍原来的图形消失,请问有没有什么办法可以实现滚条的功能? 解决方案 其实加滚动条很简单,View类继承CScrollView,然后就可以有滚动条了.然后设置滚动视图的大小和单页大小以及单步滚动的大小.如下:CRect rcClient;GetClientRect(&rcClient);CRect rc

MFC中自定义窗口类名

MFC中封装很多常用的控件,把类名也给封装了,没有提供明显的接口出来,用win api写窗口程序, 第一步就是注册窗口类. 此时类名和标题名是一起注册的,所以能把标题很好地让用户来设定,类名也应该是很简单的,可惜 的是MFC没有这样做,原因也许是window name可以不停的改,而类名不能.窗口的类名是有Create来确定 的,要在Create前,给窗口选择一个已经注册的窗口类名,作为参数窗口 Create就ok了,CWnd的Create 最终还是到了CreateEx中来,看看CreateEx

更新MFC中的视图,跟踪.NET Framework中的事件

本文配套源码 如何更新MFC中的视图? 如何跟踪.NET Framework 中的事件? 我在 MDI 程序中打算通过 CMainFrame 中的定时器事件来更新所有的子窗口. 视图用于显示许多图表.用如下的代码只能更新当前活动窗口: GetActiveWindow()->GetActiveView()->GetDocument() 是否有其它的方法从 CMDIFrame 类中获得所有的子窗口或者所有的文档? Makarand 你的情况并不罕见.许多采集实时数据的程序需要定时更新屏幕.即使你的

多线程编程之二——MFC中的多线程开发

五.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等.用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等.但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务. 在MFC中,一般用全局函数Afx