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文件,添加以下代碼:
2
3
4
5
6
#ifdef _DEBUG
#pragma comment(lib,"SonicUIUd_Dll") //調試時用Debug動態庫
#endif
#pragma comment(lib,"SonicUIU") //發布時用Release靜態庫(目錄下還需其他支持庫)
using namespace sonic_ui;
2
3
4
ISonicWndEffect* g_pEffect; //窗口的效果引擎
ISonicString* g_pText[2]; //以關鍵字格式化字符串
void OnClose(ISonicString * pStr, LPVOID); //委托關閉
2
3
g_pText[0] = NULL;
g_pText[1] = NULL;
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
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;
}
2
3
4
{
::DestroyWindow(g_pEffect->GetSafeHwnd());
}
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
{
//動畫移動
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);
}
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
{
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();
}
}
SonicUI對異形窗體,自繪按鈕等的支持。
1.首先準備素材文件,一張PNG背景圖和一張PNG按鈕圖片,導入到上面工程的資源里面,VS2008會自動分辨為“PNG”資源類型名。
再加入一張動態GIF頭像,加入到新建“IMAGE”資源類型,ID號為GIF_USERHEAD。再從“資源視圖”打開IDD_ABOUTBOX對話框,刪除默認控件,添加兩個EDIT控件,設置其屬性Border為False、Multiline為True、Want Return為True。
2.在對話框的實現文件,類CAboutDlg里面添加以下代碼:
2
3
4
5
6
7
ISonicString* g_pButton; //自繪按鈕
ISonicImage* g_pImgButton; //自繪按鈕圖片
ISonicImage* g_pImgBG; //背景圖片
ISonicImage* g_pImgUserHead; //頭像圖片
ISonicAnimation* g_pUserHead; //頭像圖片動畫
void OnClose(ISonicString* pStr, LPVOID); //委托關閉事件
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
{
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();
}
下載地址: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