SonicUI免费皮肤引擎新葡萄娱乐,SonicUI在MFC中的使用

1个开源的库很不利。

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

 

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

新葡萄娱乐 1
图二:异形窗体效果图
值得一提的是,假如采纳UpdateLayeredWindow做窗体的像素级阿尔法特效,文字输出就成为了叁个费劲,因为gdi的文字输出函数是不
带阿尔法通道的,间接TextOut上去不可能平常表现。不过ISonicString能够帮您消除这一难点,小编在里面已经为文字扩展了阿尔法通
道,能够很好的适应背景。

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); 

//GetSonicUI是引擎导出的唯一函数,是类厂和引擎总控,负责创建对象和销毁对象等。
ISonicImage * pImg = GetSonicUI()->CreateImage();
pImg->Load("C:\\1.png");
pImg->Draw(hdc, 10, 10);
GetSonicUI()->DestroyObject(pImg);

SonicUI是一个GUI引擎,提供了1些简单的UI组件达成高效用的UI效果,例如:自绘按钮、异形窗体、动画、超链接和图像操作方法。此项目小编开源到CodeProject,地址为:http://www.codeproject.com/KB/GDI/SonicUI.aspx。下载源代码编写翻译动态库版本和静态库版本,在此作者以Visual
Studio 二〇〇八SP一编译,也卷入到下边包车型地铁下载地址里面。下边介绍下SonicUI在MFC中的使用,假诺有荒唐之处,还请提出。

作为windows工程师,UI开发是无可制止的做事,无论你是写贰个供应和销售存系统,依然1款聊天IM,UI开发连接会占有你大批量的大运。前段时间在店铺开
发项目中,带着多少私心完结了三个构想了较长期的UI引擎,自已在应用进程中感觉相当大的增速了UI开发的频率,希望与咱们大饱眼福,并用大家的建议来不断完
善。

1一.编写翻译、运维程序,截图如下:

E_mail:zs_kof@163.com 

八.添加窗体变换后的信托事件代码:

VS 2008 Feature Pack

http://blog.csdn.net/barech/archive/2009/07/02/4315157.aspx 

 

 

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, p肆=%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(); 

SkinSE(全称:skin so easy)

参考资料:

作者Blog:http://hi.csdn.net/space-157361.html

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(); 
    } 

四.脏处理与区域刷新
大家都理解gdi的绘图功能是不高的,无法像DDraw直接操作显存buffer那么爽快,所以InvalidateRect才提供了一些刷新的参数,而
局地刷新也是gdi下进展优化的关键所在。可在实操中,笔者不常看见有人做那样精致的切割,都以三个InvalidateRect(hwnd,
NULL,
TRUE)了事。那也难怪,笔者任由TextOut2个字符串,小编假设要去关切它占据了多少区域,区域里面包车型客车接力裁剪等等,未免就太繁琐了。所以本人的汽油发动机提
供了3个ISonicPaint对象,意如其名,就是1块画布。创设那块画布时,你可以内定其持有和谐的memDC,而由于节省gdi对象的思索,你也可以钦命其是一块无memDC的画布,怎么着抉择根据实际处境。
开创1个画布

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

充实三个’animation=40’的控制符(40是渐变速度),就足以拿走2个QQ二〇〇八1模壹样赏心悦目的三态渐变按钮了。按钮的点击响应是
用“委托”的点子,你供给向按钮委托四个形如void WINAPI Func(ISonicBase *,
LPVOID)的大局函数或类的成员函数,以供引擎在按钮被点击时回调。
新葡萄娱乐 2
图壹:自绘按钮

1
2
3
4

文书档案也很全。

一.先是准备材质文件,一张PNG背景图和一张PNG按钮图片,导入到上边工程的财富里面,VS二零一零会自行识别为“PNG”财富类型名。
再进入一张动态GIF头像,参与到新建“IMAGE”财富类型,ID号为GIF_USE帕杰罗HEAD。再从“财富视图”打开IDD_ABOUTBOX对话框,删除暗中认可控件,添加多个EDIT控件,设置其品质Border为False、Multiline为True、Want
Return为True。
贰.在对话框的落到实处公文,类CAboutDlg里面添加以下代码:

其它UI软件

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=一, linkt=’点击’/无幻博客http:////blog.csdn.net//akof1314“), RGB(0, 0, 255)); 
    return TRUE;  

...
// ISonicImage * pImg
SetWindowRgn(hWnd, pImg->CreateRgn());

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

2.文字和超链接
UI开发进程中时常最辛苦的是绘制文字,须求你不停的初阶化字体,设定字体属性,假如产品人士要求文字按自然的格式排版或输出彩色文字,这几乎便是大家的
恐怖的梦了。而在大团结的界面到场超链接,网上早已有多如牛毛示范代码了,但自作者深信ISonicString是1个更简便易行的落到实处方案。ISonicString是三个能够举办消息交互的UI组件对象。只要求像html语言一样出席1些接近的控制符,你就足以任意的控制字体的分寸颜色,超链接等属性,非凡便于。

1
2
3
4
5
6
7

http://topic.csdn.net/u/20100127/12/491a7a32-9231-4227-bc33-fb9a2f629457.html

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

class CTest
{
public:
   void RenderImage(ISonicPaint * pPaint, LPVOID);
};

void CTest::RenderImage(ISonicPaint * pPaint, LPVOID)
{
    if(pPaint->GetCurrentPaint() == NULL)
   {
      return;
    }
  HDC hdc = pPaint->GetCurrentPaint()->hdc;
    int x = pPaint->GetCurrentPaint()->x;
    int y = pPaint->GetCurrentPaint()->y;
    // draw here
   ...
}

CTest test;
pPaint->Delegate(DELEGATE_EVENT_PAINT, NULL, &test, CSonicString::RenderImage);
1
2
3
4
5
6
g_pTest[10]->Format("/a, p=%d, ph=%d, pc=%d, linkt='点我移动', animation=40/", pImgNormal->GetObjectId(), 
 pImgHover->GetObjectId(), pImgClick->GetObjectId());

#include “ISonicUI.h” 
#ifdef _DEBUG 
#pragma comment(lib,”SonicUIUd_Dll”)    //调试时用Debug动态库 
#endif 
#pragma comment(lib,”SonicUIU”)        //发布时用Release静态库(目录下还需任何支持库) 
using namespace sonic_ui; 

重点字:UI引擎 异形窗体 动画按钮 gdi引擎 自绘控件 轻便

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16

这么每一遍只供给调用pPaint->Redraw()便会开始展览画布的区域重绘。那里需求评释的是,ISonicString,包蕴接下去要介绍的多少个指标都是基于画布的,也正是说引擎的具备指标都以享有脏处理检查和区域自绘制优化的,可以十分大的拉长运维效能。
除开委托绘制以外,你还能向画布上一直添加UI对象,画布协助的指标有:ISonicImage,
ISonicString, ISonicPaint

protected:     
    ISonicWndEffect* g_pEffect;            //窗口的意义引擎 
    ISonicString* g_pText[2];            //以重大字格式化字符串 
    void OnClose(ISonicString * pStr, LPVOID);    //委托关闭 

void WINAPI OnMove(ISonicString * pStr, LPVOID)
{
 g_pEffect->MoveGently(0, 0);
}

// 加载三态图片资源
ISonicImage * pImgNormal = GetSonicUI()->CreateImage();
pImgNormal->Load(BMP_NORMAL);
pImgNormal->SetColorKey(#ff00ff);

ISonicImage * pImgHover = GetSonicUI()->CreateImage();
pImgHover->Load(BMP_HOVER);
pImgHover->SetColorKey(#ff00ff);

ISonicImage * pImgClick = GetSonicUI()->CreateImage();
pImgClick->Load(BMP_CLICK);
pImgClick->SetColorKey(#ff00ff);

// ISonicString * g_pTest[10]
g_pTest[10]->Format("/a, p=%d, ph=%d, pc=%d, linkt='点我移动'/", pImgNormal->GetObjectId(), pImgHover->GetObjectId(), 
 pImgClick->GetObjectId());
g_pTest[10]->Delegate(DELEGATE_EVENT_CLICK, NULL, NULL, OnMove);

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

这么就足以像写网页壹样在你的界面上进展文字和图片的插花排版输出了。

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

伍.异形窗体(包涵像素级透明异形窗体)
异形窗体也是UI特效中不时须要动用的技术,常见的有三种完成格局。1种办法是依据图片裁剪出二个rgn,然后调用SetWindow奥德赛gn,另二个办法
是将窗体设为WS_EX_LAYERED属性,调用SetLayeredWindowAttributes或UpdateLayeredWindow完成透明裁剪。前一种办法成效较低,而且拖动窗体时会出现难看的残影,后1种方式展现著效果果更加好,拖动时得避防止残影出现,但不能够作用于WS_CHILD属性的
窗体。2者各有高低。SonicUI同时提供了那二种实现方式,能够依据气象选用。
方法1:

4.编写翻译、运转程序,截图如下:

摘要:作为windows工程师,UI开发是无可幸免的劳作,无论你是写一个供应和销售存系统,依然壹款聊天IM,UI开发连接会占有你大量的年月。接下来显示的将是一种windows下的那一个轻松便捷的UI开发消除方案,落成我们其实工作中不时索要贯彻的UI特效,力争将你从繁杂的UI工作中解放出来,将集中力投入到更有挑战性的干活中去。

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

1律的,格式化好后的ISonicString在OnPaint的时候输出即可,那样你就持有三个富有3态变换的脍炙人口按钮,个中’p’关键字表示
normal态,’ph’代表hover态,’pc’代表click态。如若从美术那里拿走的源图是一张图纸三态平铺的也无妨,只需求将ph,pc都指
向平等张img即可,内部会活动举行源区域裁剪。别的用过QQ2008的人大概会发觉,2010的很多按钮三态变换是潜移默化的,体验很
好,ISonicString1样能够做,只需求格式化时稍稍修改一下,

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

http://topic.csdn.net/u/20100306/00/ad4496f4-7d82-459b-b523-e18b42675580.html 

void CSonicUITestDlg::OnClose(ISonicString * pStr, LPVOID) 

    ::DestroyWindow(g_pEffect->GetSafeHwnd()); 

何以,只须要创建,然后像CString的Format一样格式化一个字符串,在WM_PAINT响应中输出即可,只须要三步,你就获取了1行靛蓝的法力
完整的超链接,是否很有益于。通过控制字符,你还是能设定下划线的体裁,鼠标形状,响应鼠标时变色等细节,具体参看ISonicUI.h中的注释即可。
ISonicString也能够将文字和图纸混合输出,或使图片带有超链接属性,要求用’p’控制符内定1个ISonicImage的id:

新葡萄娱乐 3

作者:Sonic

新葡萄娱乐 4

接下去将以多少个在实际工作中普遍的UI开发难题为例,介绍完毕方式及意义,相信那多少个难点能引起客户端UI开发同仁的共鸣。
1.多格式图片帮忙
二.文字和超链接
三.自绘按钮
四.脏处理与区域刷新
5.异形窗体(包涵像素级透明异形窗体)

1.SonicUI – A Convenient GUI Engine You’ve Never Seen  http://www.codeproject.com/KB/GDI/SonicUI.aspx
二.让UI开发轻松而欢畅,用SonicUI引擎完成常见UI效果 http://blog.csdn.net/zskof/article/details/3496343
叁.SonicUI运行机制的归纳分析 http://blog.csdn.net/alien75/article/details/5940210

Codejock Xtreme Toolkit

    g_pEffect = NULL; 
    g_pText[0] = NULL; 
    g_pText[1] = NULL; 

...
// ISonicImage * pImg
// ISonicWndEffect * pEffect
pEffect->Attach(hWnd, TRUE);    // 使用像素级alpha模式attach
pEffect->SetShapeByImage(pImg);
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17

1.多格式图片援救
UI开发离不开图片,windows的api提供了部分加载图片的主意,如常用的LoadImage,使用很不难。但其效率也跟其用法一样简单,只好加载
bmp,ico等二种格式。门到户说,bmp是不带阿尔法通道的,一旦必要贯彻阴影等阿尔法渐变的功效,系统提供的api就有些捉襟见肘了。当然
很多个人会想到家弦户诵的CxImage,那也是个不错的抉择。小编在里面也是包裹了CxImage帮助加载和封存多格式的图纸,但加载之后的图像数据处理都是自处理的了,因为CxImage在处理途睿欧GB转hsl,旋转等特效时大批量采纳了浮点运算,成效不可能使人拾叁分满足。小编把富有的浮点运算都转为整形运算,并
多量用到了SSE贰指令举办优化,实地度量申明在打转,HSL转换,灰化等特效时,功效能够加强肆-拾倍(CPU为T2330
一.陆GHz)。图片加载帮助三种形式:从文件;从财富;从dc。须求申明的是从财富加载时请将财富类型命名字为IMAGE。
示范代码如下:

新葡萄娱乐 5

让UI开发轻松而开心,用SonicUI引擎实现常见UI效果

七.在对话框OnInitDialog起先化函数里,添加以下代码:

源代码下载: http://www.codeproject.com/KB/GDI/SonicUI.aspx

1
2
3
4
ISonicImage * pImg = GetSonicUI()->CreateImage();
pImg->Load("C:\\1.png");
ISonicString * pStr = GetSonicUI()->CreateString();
pStr->Format("/c=%x/你好吗,朋友/p=%d, a='http://hi.csdn.net/zskof'/", #0000ff, pImg->GetObjectId());

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

方法2:

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

三.自绘按钮
自绘按钮大概是UI编写中最普遍也是重复度最高的行事,平日是继承自CButton然后ownerdraw出来。笔者的实现是不行使窗体的纯自绘。其实超链接也足以明白为按钮的一种,所以自身自绘按钮的利用办法跟超链接也抚顺小异。

1
2
3

SkinSB

画布成立之后,只必要在WM_PAINT中调用画面包车型地铁Draw方法即可,很简短。
假使您想在那些画布上做画,就必要像自绘按钮一样,向画布委托一个您本身的绘图进度,以便在每便重绘时调用。示例代码如下:

截止语:引擎中还有滚动字幕组件,动画组件等常用的UI表现组件,限于篇幅就不壹一介绍了,请大家参考ISonicUI.h中的表明自身试用。设计这一个引
擎时的基本尺度正是便捷,高效,假诺大家在选择进度中有啥样好的建议或须要,也约请联系本身,扶助小编完善这一个引擎。因为引擎完整兑现代码有数万行,而且今后还属于公司资金财产,就暂不宣布完全源码了,但对一些技术达成细节有趣味的爱侣,能够与小编沟通,共同学习提高。
QQ:20346020

ISonicString * pStr = GetSonicUI()->CreateString();
pStr->Format("/c=%x, a='http://hi.csdn.net/zskof', font, font_height=16/点我打开链接", #0000ff);

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 PAINTSTRUCT ps;
    HDC hdc;
   switch (message) 
  {
  case WM_PAINT:
     {
          hdc = BeginPaint(hWnd, &ps);
           pStr->TextOut(hdc, 0, 0, hWnd);
         EndPaint(hWnd, &ps);
       }
      break;
 }
  .
  .
  .
}

 

OK,二个带透明通道的png图片绘制就到位了,是或不是自在惬意。

ISonicPaint * pPaint = GetSonicUI()->CreatePaint();
pPaint->Create(FALSE/*是否需要memDC*/, m_rtString.Width()/*宽*/, m_rtString.Height()/*高*/);

http://www.skinse.com/update.html 

下载源代码

vckBase 页面:http://www.vckbase.com/document/viewdoc/?id=1849