一、簡介
SYGUI是一個基於功能擴展的MFC界面庫,我在以前的文章中介紹了如何使用該界面庫來實現VC界面,在本文中將向大家介紹利用SYGUI4.0所提供的新功能來實現類似Windows Media Player的界面定制功能。這裡所指的界面定制功能是指在不修改程序代碼的情況下允許為程序設計各種具有不同外觀風格的程序界面。例如本文所附的例子程序包含了如下圖所示的三種不同的界面,三種界面可通過界面上的外觀選擇按鈕進行動態切換:
圖一 例子程序運行時的三種界面
當然,通過界面定制還可以為例子程序設計更多的界面。
SYGUI4.0是通過將界面設計和程序功能實現分離的方式來實現界面定制,因此在開發具有界面定制功能的程序時包含以下兩個過程:
1.軟件開發人員為程序添加界面定制功能
2.界面設計人員為程序設計各種界面,其中界面設計人員既可以是程序開發人員也可以是最終用戶。
二、為程序添加界面定制功能
由於SYGUI4.0隱藏了程序實現界面定制功能的幾乎全部細節,因此開發人員為程序添加界面定制功能非常簡單:只需要確定程序輸出的界面對象並創建一個不規則窗體模板文件。
SYGUI4.0中允許輸出的界面對象包括:
1.窗口 可以為任意類型的窗口,如組合框、列表框等
2.SYItem對象 SYGUI庫提供的非窗口類控件,如SYGUI的進度條、滾動條等
3.命令 程序中實現的命令,一般與定制界面窗口中的按鈕相對應
4.菜單資源 可被用於菜單條或按鈕下拉菜單
5.文本對象 可被用於在界面上顯示文本
6.狀態對象 可被作為界面設計時可選的控制變量
下面結合例子的實際代碼來介紹在程序中怎樣輸出各種界面對象:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//MFC生成的其它代碼
......
......
//創建各種界面對象
m_seek.SetID(ID_SLIDER_SEEK);
......
......
m_wndPlayList.Create(WS_CHILD|WS_VISIBLE|LBS_NOINTEGRALHEIGHT,CRect(0,0,0,0),this,0);
m_wndPlayList.SetFont(g_pFontMgr->GetFont(FONT_MENU));
m_wndPlayList.SetBkColor(RGB(0,0,0));
m_wndPlayList.AddString("測試.wam");
//輸出窗口對象
g_pNRWMgr->ExportWnd(1,&m_wndPlayList,_T("WND_PLAYLIST"));
g_pNRWMgr->ExportWnd(2,&m_cbPlayList,_T("COMBOBOX_PLAYLIST"));
//輸出SYITEM對象
g_pNRWMgr->ExportItem(0,&m_seek,_T("SLIDER_SEEK"));
......
......
g_pNRWMgr->ExportItem(23,&m_playIcon,_T("PLAY_ICON"));
//輸出命令
g_pNRWMgr->ExportCommand(ID_PLAY,_T("ID_PLAY"));
......
......
g_pNRWMgr->ExportCommand(ID_THEME,_T("ID_THEME"));
//輸出文本
g_pNRWMgr->ExportText(PLAY_TIME_TEXT,_T("PLAY_TIME_TEXT"));
g_pNRWMgr->ExportText(PLAY_INFO_TEXT,_T("PLAY_INFO_TEXT"));
g_pNRWMgr->ExportText(MEDIA_INFO_TEXT,_T("MEDIA_INFO_TEXT"));
g_pNRWMgr->ExportText(SPEAKER_NAME,_T("SPEAKER_NAME"));
g_pNRWMgr->ExportText(EQPRESET_NAME,_T("EQPRESET_NAME"));
//輸出菜單資源
g_pNRWMgr->ExportMenu(IDR_MAINFRAME,_T("IDR_MAINFRMAE"));
//輸出狀態
g_pNRWMgr->ExportState(PLAY_STATE,_T("PLAY_STATE"),0,255);
//創建不規則窗體模版,在模板文件創建後應刪除或注釋掉下面的語句
//g_pNRWMgr->CreateTemplate(_T("d:\\test.tpl"));
//設置文本和狀態初始值
g_pNRWMgr->SetText(EQPRESET_NAME,_eq_preset_name[m_nEQPreset]);
g_pNRWMgr->SetText(SPEAKER_NAME,_speaker_name[m_nSpeaker]);
g_pNRWMgr->SetText(MEDIA_INFO_TEXT,_T("歌曲:測試 藝術家:未知 唱片集:測試 "));
if (m_wndPlayList.GetCount() > 0)
g_pNRWMgr->SetText(PLAY_INFO_TEXT,_T("准備就緒"));
else
g_pNRWMgr->SetText(PLAY_INFO_TEXT,_T(""));
g_pNRWMgr->SetState(PLAY_STATE,0);
//恢復程序布局
CString strLayout = g_strPath + _T("\\Layout\\WMPlayer.lyt");
g_pThemeMgr->LoadLayout(strLayout);
//加載外觀風格文件
CString strTheme;
g_pThemeMgr->GetLastThemeFile(strTheme);
if (!strTheme.IsEmpty())
g_pThemeMgr->LoadTheme(strTheme);
return 0;
}
上面代碼中
g_pNRWMgr是SYGUI庫初始化時自動創建的全局變量,用於管理不規則窗體
g_pThemeMgr是SYGUI庫初始化時自動創建的全局變量,用於管理外觀風格文件
從上面的代碼中我們可以看到輸出界面對象是非常簡單的,只需要調用相應的界面對象輸出函數就可以了。所有輸出函數的最後一個參數為輸出對象的別名,由開發人員決定,界面設計人員在設計界面時是通過該別名來選取對應的界面對象。
ExportWnd函數輸出窗口對象,其中第一個參數是輸出對象序號,由開發人員分配,但必須保持唯一。第二個參數指向窗口對象。
ExportItem函數輸出窗口對象,其中第一個參數是輸出對象序號,由開發人員分配,但必須保持唯一。第二個參數指向SYItem對象。
ExportCommand函數輸出一個命令,其中第一個參數為命令ID。
ExportMenu函數輸出菜單資源,其中第一個參數為菜單資源ID。
ExportText函數輸出文本對象,其中第一個參數為文本對象ID,由開發人員分配,但必須保持唯一。該函數在輸出文本對象同時也將創建該文本對象,在程序中必須調用函數SetText來設置/修改文本對象所表示的字符串值。
ExportState函數輸出狀態對象,其中第一個參數為狀態對象ID,由開發人員分配,但必須保持唯一。該函數在輸出狀態對象同時也將創建該狀態對象,在程序中必須調用函數SetState來設置/修改狀態對象狀態值,狀態值范圍為:0 - 255。
在所有界面輸出對象確定後,開發人員就可以通過調用CreateTemplate函數來創建不規則窗體模板,例如在程序最後的界面對象輸出語句後加入
g_pNRWMgr->CreateTemplate(_T("d:\\MyTemplate.tpl"));
然後編譯運行程序將生成名為 MyTemplate.tpl 的不規則窗體模板文件,模板文件創建後應當在程序中注釋或刪除上面的模板創建語句。
當開發人員在確定了程序所有輸出界面對象並創建不規則窗體模板文件後就可以專注於程序功能的實現而不必關心程序最終界面的實現了,程序最終的界面是由界面設計人員來確定的。開發人員只需要在程序中調用LoadTheme函數加載界面設計人員提供的各種外觀風格文件就可以使程序具有不同的界面。例如下面的代碼就加載了例子中所帶的Gold界面:
g_pThemeMgr->LoadTheme(_T("Theme\\MediaPlayer_Glod.ss"));
三、界面設計
在不規則窗體模板生成後,界面設計人員就可以為程序設計各種風格的界面了。為了便於理解,首先介紹兩個基本概念:
1.不規則窗體 具有界面定制功能的程序的界面由一個或多個不規則窗體組成。不規則窗體個數由界面設計人員根據實際界面需要來確定。
2.層 每個不規則窗體包含一個或多個層,每個層可以有不同的形狀和位置,上面的層將覆蓋下面的層(相交區域部分),不規則窗體中所有層的形狀合並在一起構成不規則窗體的實際形狀。層具有打開/關閉兩種狀態,不同狀態的層可以有不同的位置但形狀保持不變。在層上可以放置各種界面對象,包括程序輸出的界面對象和SYGUI內置的界面對象(如層控制按鈕、不規則窗體關閉按鈕等)。
界面設計人員應按以下步驟來設計界面:
1.確定界面的不規則窗體個數
2.確定每個不規則窗體的層數和層的形狀及位置
3.將各種界面對象加入到層的合適位置。
4.將設計完成的界面保存到外觀風格文件中。
SYGUI4.0提供了一個可視化(所見即所得)的不規則窗體設計工具來幫助界面設計人員設計界面,該工具被集成在SYGUI外觀風格設計器中。下面結合例子所帶的Gold界面來介紹如何使用外觀風格設計器來定制界面。
首先下載例子源代碼,然後解壓,運行Designer子目錄下的Designer.ex(外觀設計工具)並在該工具中打開Theme子目錄下的MediaPlayer_Gold.ss文件。
在左側不規則窗體面板中的樹形控制中選擇[不規則窗體]節點中的[NRW0]子節點,然後單擊鼠標右鍵,在彈出的菜單中選擇[編輯]將出現不規則窗體設計工具界面,如下圖:
圖二 不規則窗體設計工具界面
從上面的界面中,我們可以看到Gold界面僅包含一個不規則窗體,該窗體包含6個層。
限於篇幅,下面只能簡單介紹一下界面設計過程:
1.導入不規則窗體模板
選擇不規則窗體面板-->不規窗體模板節點,然後單擊鼠標右鍵並在彈出的菜單中選擇[導入模板]將出現文件選擇對話框,在選擇合適的模板文件後點擊[打開]按鈕導入模板。
2.創建不規則窗體
選擇不規則窗體面板-->不規窗體節點,然後單擊鼠標右鍵並在彈出的菜單中選擇[插入]將出現創建不規則窗體對話框,在該對話框中填入合適的參數然後選擇[確定]按鈕。注意:對話框中初始大小的參數也將作為界面設計工作區的大小
3.設計不規則窗體
在不規則窗體面板中選擇需要設計的不規則窗體節點,然後單擊鼠標右鍵並在彈出的菜單中選擇[編輯]將進入不規則窗體設計界面
4.創建層
在工具條中選擇[創建層按鈕]將出現創建層對話框,在該對話框中填入合適的參數並選擇[確定]按鈕創建一個新的層。新創建的層將處於編輯狀態。
5.添加界面對象
在工具條中選擇[添加界面對象]按鈕,然後在按鈕下拉菜單中選擇需要添加的界面對象類型將出現對象的屬性對話框,在對話框中填入合適的參數然後選擇[確定]按鈕完成界面對象的添加。新添加的界面對象總是被加入到當前處於編輯狀態的層中,通過拖動拉伸可將該對象放入到層的合適位置。
四、總結
SYGUI4.0提供的界面定制功能改變了以往的應用程序界面設計模式,使軟件的功能實現過程和界面設計過程徹底分離,從而最大程度的減少了開發人員界面設計的工作量使之能專注於軟件功能的實現,以提高開發效率和代碼質量,同時界面定制功能也可以使軟件開發商非常方便的為不同類型的軟件用戶設計個性化的界面以提高用戶的滿意度和吸引更多的軟件用戶。界面定制功能對於媒體播放器、網絡視頻應用等這類軟件尤為適合。
本文僅簡單介紹了SYGUI4.0的界面定制功能,關於SYGUI界面庫的更多功能介紹可訪問www.sygui.com。
原文地址:http://www.vckbase.com/document/viewdoc/?id=1827