(轉)MFC美化

原文轉至:http://blog.csdn.net/zhangyang1990828/article/details/10489085 html

前些天用MFC開發一個桌面程序,實現功能後客戶說界面太難看,本身仔細看看也着實難看,因此就仔細的研究了下MFC的美化方法,特此分享給你們。 less

★利用SkinMagic美化MFC的界面。 函數

SkinMagic是一個C++的皮膚庫,使用它能夠完美的實現給你的程序換膚。 oop

代碼運行效果圖以下: 學習

之前看到瑞星和金山詞霸有換皮膚功能,非常羨慕,本身也想作個換皮膚的程序,但下手着實有些困難。我也試過像BCGCBar這樣的大型軟件,給個人感受是軟件總是出問題,應用起來也很複雜。後來知道了SkinMagic軟件包,但當時不知怎麼用,發了貼子也沒人回答。多是不多有人用的緣故吧,本站也未更新此軟件包。偶然的一次機會,讓我知道了怎樣來用它, 字體

並且編譯出來的軟件體積很小,因此在這裏向你們介紹一下,但願對你們有些幫助。 動畫

如何使用: 網站

① 新建工程後,將SkinMagic包中的SkinMagicLib.h、SkinMagicLib.lib、DETOURS.lib拷貝到所在文件夾下,點擊Project->Add To Project->Files,包含到工程中。 ui

② 在Resource View中點擊Import 菜單引入幾個Skin二進制文件放在相同的「SKINMAGIC」文件夾下,分別給起一個名字(見源程序)。 this

③ 在stdafx.h中加入#include "SkinMagicLib.h"

④ 在此處添加以下內容

01.if (!ProcessShellCommand(cmdInfo))

02.return FALSE;

03./////////////////////////////////////////////////////////////

04.VERIFY( 1 == InitSkinMagicLib( AfxGetInstanceHandle(), "Demo" ,NULL,NULL ) );//初始化類庫

05.VERIFY( 1 == LoadSkinFromResource( AfxGetInstanceHandle() , "KROMO","SKINMAGIC") );//從資源中加載皮膚

06.

07.VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" ));

08.VERIFY( 1 == SetDialogSkin( "Dialog" ) );

09.((CMainFrame*)m_pMainWnd)->m_bSkinned = TRUE;

10.((CMainFrame*)m_pMainWnd)->m_nIndex = 0;

11.////////////////////////////////////////////////////////

12.m_pMainWnd->ShowWindow(SW_SHOW);

13.m_pMainWnd->UpdateWindow();

⑤ 在MainFrame中加入換皮膚菜單,及相應的函數,在函數中加載皮膚。

1.void CMainFrame::OnDevior()

2.{

3.LoadSkinFromResource( AfxGetInstanceHandle() , "DEVIOR" ,"SKINMAGIC") ;

4.}

到此爲止,完美的換皮膚程序就出來了。

若是想更換皮膚只須要更換LoadSkinFromResource的參數爲當前目錄下的皮膚文件就能夠了。

我這裏有完整的demo已經不少的皮膚文件,須要的能夠點擊這裏下載

★利用flash來美化MFC的界面:

效果圖:

代碼:

[cpp] view plaincopyprint?

  1. BOOL CPlayFlashDlg::OnInitDialog()
  2. {
  3. CDialog::OnInitDialog();
  4. ...
  5. // TODO: Add extra initialization here
  6. RECT rc;
  7. this->GetClientRect(&rc);
  8. m_FlashPlayer.MoveWindow( &rc, true );
  9. TCHAR strCurDrt[500];
  10. int nLen = ::GetCurrentDirectory(500,strCurDrt);
  11. if( strCurDrt[nLen]!='\\' )
  12. {
  13. strCurDrt[nLen++] = '\\';
  14. strCurDrt[nLen] = '\0';
  15. }
  16. CString strFileName = strCurDrt;
  17. strFileName += "startup.swf";
  18. m_FlashPlayer.LoadMovie(0, strFileName);
  19. m_FlashPlayer.Play();
  20. return TRUE; // return TRUE unless you set the focus to a control
  21. }
BOOL CPlayFlashDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	...
	
	// TODO: Add extra initialization here
	
	RECT rc;
	this->GetClientRect(&rc);

	m_FlashPlayer.MoveWindow( &rc, true );

	TCHAR strCurDrt[500];
	int nLen = ::GetCurrentDirectory(500,strCurDrt);
	if( strCurDrt[nLen]!='\\' )
	{
		strCurDrt[nLen++] = '\\';
		strCurDrt[nLen] = '\0';
	}

	CString strFileName = strCurDrt;
	strFileName += "startup.swf";
	m_FlashPlayer.LoadMovie(0, strFileName);
	m_FlashPlayer.Play();

	return TRUE;  // return TRUE  unless you set the focus to a control
}

[cpp] view plaincopyprint?

  1. void CPlayFlashDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
  2. {
  3. // TODO: Add your control notification handler code here
  4. if( 0 == strcmp(command,"bt") )
  5. {
  6. if( 0 == strcmp(args,"enter") )
  7. {
  8. MessageBox("歡迎進入系統!");
  9. }
  10. }
  11. else if( 0 == strcmp(command,"quit") )
  12. {
  13. MessageBox("您選擇了退出!");
  14. CDialog::OnCancel();
  15. }
  16. }
void CPlayFlashDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) 
{
	// TODO: Add your control notification handler code here
	if( 0 == strcmp(command,"bt") )
	{
		if( 0 == strcmp(args,"enter") )
		{
			MessageBox("歡迎進入系統!");
		}
	}
	else if( 0 == strcmp(command,"quit") )
	{
		MessageBox("您選擇了退出!");
		CDialog::OnCancel();
	}
}

0.0這樣加載你的flash就OK了。demo能夠在 這裏下載

一下是一些詳細的介紹:

1、準備工做

第一步:下載並安裝Adobe Flash Player。

從官方網站(http://get.adobe.com/cn/flashplayer/)上下載最新的Flash Player(大約爲2.66M),並安裝。對於Windows 32位系統,其默認安裝目錄爲:C:\WINDOWS\system32\Macromed\Flash\;對於64位系統,爲:C:\Windows\SysWOW64\Macromed\Flash。

Flash控件的大版本號用數字表示,如9,10,11等,小版本號用小寫字母表示,如a, b, c, d, e。如我安裝的版本爲:Flash10l.ocx。

第二步:經過regsvr32.exe註冊flash控件 Flash10l.ocx。

從開始菜單中打開運行對話框,並輸入:

regsvr32 C:\Windows\SysWOW64\Macromed\Flash\Flash10l.ocx 註冊該控件(註冊以後就能夠在項目中進行控件添加了),若是註冊成功,有以下提示:

註銷控件的命令行爲

regsvr32 /u C:\Windows\SysWOW64\Macromed\Flash\Flash10l.ocx。

2、新建MFC項目,添加Flash控件

第一步:創建基於對話框的MFC程序。

打開Visual Studio 2010,新建項目,選擇「MFC應用程序」,並將其命名爲MFCFlash。

在接下來的選型設置中,選擇應用程序類型爲「基於對話框」,其餘可按默認設置。項目建成後,程序默認添加了MFCFlash和MFCFlashDlg的頭文件和實現文件,截圖以下:

第二步:添加Shockwave Flash Object類。

VC++ 6.0中,可使用ClassWizard添加ActiveX控件,而VS2005之後的版本沒有。若是要添加ActiveX對應的類,能夠先在解決方案管理器中選中項目後在菜單中點「項目」→「添加類」→「ActiveX控件中的MFC類」,打開「從ActiveX控件添加類嚮導」對話框。選擇從「文件」添加類,找到Flash控件的安裝位置,便可添加Shockwave Flash控件,接口選擇「IShockwaveFlash」,以生成CShockwaveFlash類(類的名稱能夠修改)。插入後,VC會自動把這個類加入工程裏面。

第三步:添加Shockwave Flash Object控件。

在資源視圖裏找到「Dialog」,並選擇其中的IDD_MFCFLASH_DIALOG,在其上點右鍵,選擇「插入ActiveX控件」,從彈出的列表中選擇「Shockwave Flash Object」。

使用BUTTON、EDIT等其它Windows控件同樣,咱們可使用這個類的成員函數來操縱這個對象,來進行Flash動畫的控制以及和本身的程序進行交互等操做了。在Flash控件上點右鍵,而後選擇「添加變量」,設定「變量名」爲:m_FlashPlayer。可再次在Flash控件上點右鍵,而後選擇「屬性」,將其ID改成IDC_SHOCKWAVEFLASH。

第四步:使用成員函數LoadMovie和Play來導入並播放動畫。

在MFCFlashDlg.cpp文件中,找到CMFCFlashDlg::OnInitDialog()函數,在「return TRUE」以前添加代碼:

CString str = _T("E:\\VS\\Flash\\media\\test.swf");

m_FlashPlayer.LoadMovie (0, str);

m_FlashPlayer. Play ();

其中m_FlashPlayer.LoadMovie(0, str)用來將動畫導入程序中,str爲要播放的flash路徑,要用絕對路徑(注意路徑用雙斜槓「\\」隔開); m_FlashPlayer. Play ()開始播放動畫。

相對路徑轉絕對路徑:

wchar_t szPath[MAX_PATH];

memset(szPath, 0, sizeof(CHAR)*MAX_PATH);

GetCurrentDirectory(MAX_PATH, szPath);

StrCat(szPath, _T("\\風扇.swf"));

如今運行程序,就能夠看到flash嵌入到程序裏面了。還有幾個經常使用的函數能夠用來控制動畫的播放,如GotoFrame(long FrameNum)能夠轉到FrameNum偵播放(偵數從0開始),StopPlay()能夠中止播放。。。,還有不少,能夠本身試試。下圖是我作的一個飛行儀表,界面比較醜陋,湊合看吧^_^

3、實現MFC與Flash的通訊

一、Flash經過FSCommand消息調用MFC

第一步:添加消息處理函數。

在Flash控件上點右鍵,而後選擇「添加事件處理程序」,在類列表選擇「CMFCFlashDlg」,消息類型選擇「FSCommand」,則函數處理程序名稱自動爲「FSCommandShockwaveflash」。它的形式大概是這樣子的:

void CMFCFlashDlg::OnFSCommandShockwaveflash(LPCTSTR command, LPCTSTR args) ;函數有兩個參數,就是flash的Action Script中FSCommand語句中的兩個參數。其實並不必定兩個參數都用到,flash腳本中能夠就使用一個參數,這樣這邊的函數就只要對第一個參數進行處理就好了。

第二步:編寫消息處理代碼。

在剛添加的FSCommand消息處理函數中,對兩個參數進行處理。其實就是作字符串比較的操做,根據是什麼字符串來判斷用戶進行了什麼操做。大概就是這樣子的:

void CPlayFlashDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
// TODO: Add your control notification handler code here
if( 0 == strcmp(command,」bt」) )
{
if( 0 == strcmp(args,」enter」) )
{
MessageBox(「歡迎進入系統!」);
}
}
else if( 0 == strcmp(command,」quit」) )
{
MessageBox(「您選擇了退出!」);
CDialog::OnCancel();
}
}

這只是最簡單的處理形式,固然你能夠在flash中發送複雜的字符串,在這邊就要進行更多的處理了。

二、MFC經過CallFunction函數調用Flash

第一步:Flash中ExternalInterface.addCallback用處理。

在FLASH中,要用ExternalInterface.addCallback把能被外部調用的函數註冊一下,例如: ExternalInterface.addCallback("setAlt", setAlt);

function setAlt (para:String = "3150")

{

alt.text = para; //alt爲swf文件中的一個動態文本

}

第二步:MFC中使用CallFunction函數傳入參數。

想讓MFC主動往flash傳內容而且讓flash響應,用控件的CallFunction方法。在MFC中,調用CallFunction方法,傳入一個比較複雜的字符串,描述了要調用的函數的名稱、參數等等,以XML的形式呈現。詳情參考FLASH幫助的「外部 API 的 XML 格式」一文。此處CallFunction傳遞的參數爲XML格式,以下:

CString temp = _T("<invoke name=\"setAlt\" returntype=\"xml\">\

<arguments><string>3500FT</string></arguments>\

</invoke>");

m_FlashPlayer.CallFunction(temp);

注意,<arguments>必須是完整的一行,具體爲何我也不太清楚。再次運行程序,能夠發現ALT的值已經由3280FT變成了3500FT。

shockwave flash object控件的相應類是CShockwaveFlash類,該類的經常使用函數:CShockwaveFlash類 - 花花 - 聚沙成塔

Play() 播放動畫 StopPlay() 中止動畫 IsPlaying():動畫是否正在播放(true,false)

GotoFrame(frame_number)跳轉到某幀(frame_number+1)

TotalFrames() 獲取動畫總幀數 CurrentFrame()回傳當前動畫所在幀數-1

Rewind() 使動畫返回第一幀 SetZoomRect(left,top,right,buttom)放大指定區域

Zoom(percent) 改變更畫大小 Pan(x_position,y_position,unit) 使動畫在x,y方向上平移

PercentLoaded()返回動畫被載入的百分比(0-100)

LoadMovie(level_number,path) 加載動畫

TGotoFrame(movie_clip,frame_number) movie_clip跳轉到指定幀數
TGotoLabel(muvie_clip,label_name) movie_clip跳轉到指定標籤
TCurrentFrame(movie_clip) 回傳movie_clip當前幀-1

TCurrentLabel(movie_clip) 回傳movie_clip當前標籤

TPlay(movie_clip) 播放movie_clip TStopPlay(movie_clip) 中止movie_clip的播放

GetVariable(variable_name) 獲取變量 SetVariable(variable_name,value) 變量賦值

TCallFrame(movie_clip,frame_number) call指定幀上的action

TCallLabel(movie_clip,label) call指定標籤上的action

TGetProperty(movie_clip,property) 獲取movie_clip的指定屬性

TSetProperty(movie_clip,property,number) 設置movie_clip的指定屬性

MFC中CShockwaveFlash控件相關說明

MFC中播放Flash使用的ActiceX控件Shockwave Flash Object,其對應的類爲CShockwaveFlash。下面給出該控件的經常使用屬性和方法說明:

==================================
FLASH播放器控件相關屬性和方法說明.
==================================

++++++++++++++++++++++++
++++++++++屬性++++++++++
++++++++++++++++++++++++
語法:AlignMode As Long
說明:對齊方式(與SAlign屬性聯動).當控件的長寬比例與影片不一致且WMode不爲ExactFit時,影片在控件中顯示的位置可用該屬性調整.
屬性值與相應的對齊方式:
1:左對齊
2:右對齊
4:頂對齊
8:底對齊
注意:也能夠組合各類對齊方式,就是將這四個基本值組合相加.好比同時左對齊和頂對齊,屬性值則設爲5.

語法:BackgroundColor As Long
說明:影片的背景色.默認的影片背景色爲-1.若是影片設置了底色或有圖片看成背景,那麼看不出來該屬性值的改變會有什麼影響 。
注意:顏色值使用RGB格式的顏色值

語法:Base As String
說明:指定用於解決影片中全部相對路徑的聲明的基地址.當影片與其須要的其餘文件不在同一目錄中的時候該屬性特別有用.如不特別指定,Base的值默認爲".",也就是當前影片所在的路徑.
語法:BGColor As String
說明:影片的背景色.與BackgroundColor不一樣的是,BGColor是一個六位的十六進制數,每兩位分別表明紅綠藍顏色值.如:FFEEAA表示R值爲FF,G值爲EE,B值爲AA.

語法:DeviceFont As Boolean
說明:決定是否使用影片內嵌的字體,默認值爲False.將該屬性值設爲True則強制播放器不使用影片中內嵌的字體而使用本地系統字體.
語法:EmbedMovie As Boolean
說明:影片是否被存貯到控件所在的容器中.當你已載入一個影片後將該屬性設爲True,播放影片時就沒必要再去讀取SWF文件了.這樣可使SWF文件鑲進程序中,沒必要再讀取文件.但將該屬性設爲True後,控件的Movie屬性就再也不接受新的值了.要想播放另外一個影片(給Movie屬性賦新值),必須先將該屬性(EmbedMovie)設爲False.

語法:FrameNum As Long
說明:影片當前幀的編號(從0開始計數).設置該屬性值將使影片停在由FrameNum指定的幀處.
注意:不只能夠從中得到當前幀,還能夠設置當前幀,即跳轉到某幀

語法:Loop As Boolean
說明:控制影片是否循環播放.設爲True就是循環播放,設爲False則只播放一次.

語法:Menu As Boolean
說明:是否顯示菜單.設爲True顯示全部菜單,設爲False菜單被屏蔽,但仍有一項"About Macromedia Flash Player...",點擊後會打開Macromedia的網站.若是你實在不喜歡這個菜單,應該在程序中經過攔截鼠標消息的方法來達到目的.

語法:Movie As String
說明:要播放的影片路徑(URL).設置該屬性爲一個SWF文件的URL,當該屬性被設置後,控件將自動載入文件並播放它.

語法:Playing As Boolean
說明:當前播放狀態.若是影片正在播放,該屬性值爲True,不然爲False.

語法:Quality As Long
說明:畫面質量.
Quality的屬性能夠取:
0:至關於Quality2取"Low"
1:至關於Quality2取"High"
2:至關於Quality2取"AutoLow"
3:至關於Quality2取"AutoHigh"

語法:Quality2 As String
說明:畫面質量
Quality的屬性能夠取:
Low:偏重於播放速度而無論顯示效果,並且不啓用消除鋸齒功能.
High:偏重於畫面而無論播放速度,而且老是啓用消除鋸齒功能.若是影片中不包含動畫就平滑處理位圖;若是有動畫,那麼位圖就不被平滑處理.
AutoLow:先着重於播放速度,但只要有可能就改善顯示效果.一開始播放時先禁用消除鋸齒功能.若是播放器檢測處處理器能承受得了,就啓用消除鋸齒功能.
AutoHigh:一開始是播放速度和顯示效果並重,但若有必要就犧牲畫質確保速度.開始播放時就啓用消除鋸齒功能.但若是實際的幀速率比設計時指定的速率慢了,就禁用消除鋸齒功能來提升播放速度.

語法:ReadyState As Long
說明:影片的當前狀態.
ReadyState的值有:
0:正在載入
1:未初始化
2:已載入
3:正在交互
4:完成例子
注意:可使用該屬性來粗略的判斷SWF文件的讀取進度,但若是想獲得更精確的判斷,應該在在SWF文件中使用FScommand()來達到與VB的互動與聯繫,即傳送資料給VB.
語法:SAlign As String
說明:對齊模式.與上文的AlignMode相同,但值的形式不一樣罷了.
可取值:
L:即左對齊
T:即頂對齊
R:即右對齊
B:即底對齊
注意:當使用組合對齊方法是L,T,R,B的前後順序不能變,如:左和底的對齊:SAlign="LB"

語法:Scale As String
說明:控制影片的縮放模式.
Scale的值能夠取:
ShowAll:在控件內顯示所有影片區域,保持影片長寬比例不變,影片的大小決定於控件長或寬中較小的一邊.
NoBorder:在控件內顯示部分影片區域,保持影片長寬比例不變,影片的大小決定於控件長或寬中較大的一邊.
ExactFit:在控件內顯示所有影片區域,不考慮影片的長寬比例,強制將影片的長寬等於控件的長寬.

語法:ScaleMode As Long
說明:縮放模式,與Scale相同,只不過屬性值爲數字而已.
ScaleMode能夠取:
0:至關於Scale取"ShowAll"
1:至關於Scale取"NoBorder"
2:至關於Scale取"ExactFit"

語法:TotalFrames As Long
說明:返回影片中總幀數.該參數要到影片載入完成纔有效,即ReadyState=4

語法:WMode As String
說明:控件的窗口模式(實現矢量圖在VB界面顯示的重要屬性).
WMode能夠取:
Window:WMode屬性的默認值,按Flash播放器典型的方式工做,即在控件的矩形窗口中播放影片,這樣通常都能提供最快的動畫效果.
Opaque:使影片不透明.
Transparent:建立一個透明的影片,若是影片中有透明的片斷時,就能夠看到控件下面的背景.但使用此屬性值,動畫的播放速度可能會慢一些.

++++++++++++++++++++++++
++++++++++方法++++++++++
++++++++++++++++++++++++
Play() // 播放動畫

StopPlay() // 中止動畫

IsPlaying() // 動畫是否正在播放(true,false)

GotoFrame(frame_number) // 跳轉到某幀(frame_number+1)

CurrentFrame() // 回傳當前動畫所在幀數-1

Rewind() // 使動畫返回第一幀

SetZoomRect(left,top,right,buttom) // 放大指定區域

Zoom(percent) // 改變更畫大小

Pan(x_position,y_position,unit) // 使動畫在x,y方向上平移

PercentLoaded() //返回動畫被載入的百分比(0-100)

LoadMovie(level_number,path) // 加載動畫

GetVariable(variable_name) // 獲取變量

SetVariable(variable_name,value) //變量賦值

TotalFrames() // 獲取動畫總幀數

TPlay(movie_clip) // 播放movie_clip

TStopPlay(movie_clip) //中止movie_clip的播放

TGotoFrame(movie_clip,frame_number) // movie_clip跳轉到指定幀數

TGotoLabel(muvie_clip,label_name) // movie_clip跳轉到指定標籤

TCurrentFrame(movie_clip) // 回傳movie_clip當前幀-1

TCurrentLabel(movie_clip) // 回傳movie_clip當前標籤

TCallFrame(movie_clip,frame_number) // call指定幀上的action

TCallLabel(movie_clip,label) // call指定標籤上的action

TGetProperty(movie_clip,property) // 獲取movie_clip的指定屬性

TSetProperty(movie_clip,property,number)// 設置movie_clip的指定屬性

★用Html來美化咱們的MFC

效果圖:


代碼:

[cpp] view plaincopyprint?

  1. CWebBrowser2 m_wndWeb;
  2. CWebBrowser2 m_wndWeb2;
  3. CHAR szPath[MAX_PATH];
  4. memset(szPath, 0, sizeof(CHAR)*MAX_PATH);
  5. GetCurrentDirectory(MAX_PATH, szPath);
  6. StrCat(szPath, _T("\\Custom.html"));
  7. m_wndWeb.Navigate(szPath, NULL, NULL, NULL, NULL);
  8. CHAR szPath2[MAX_PATH];
  9. memset(szPath2, 0, sizeof(CHAR)*MAX_PATH);
  10. GetCurrentDirectory(MAX_PATH, szPath2);
  11. StrCat(szPath2, _T("\\Custom1.html"));
  12. m_wndWeb2.Navigate(szPath2, NULL, NULL, NULL, NULL);
CWebBrowser2	m_wndWeb;
	CWebBrowser2	m_wndWeb2;
	CHAR szPath[MAX_PATH];
	memset(szPath, 0, sizeof(CHAR)*MAX_PATH);
	GetCurrentDirectory(MAX_PATH, szPath);
	StrCat(szPath, _T("\\Custom.html"));
	m_wndWeb.Navigate(szPath, NULL, NULL, NULL, NULL);

	CHAR szPath2[MAX_PATH];
	memset(szPath2, 0, sizeof(CHAR)*MAX_PATH);
	GetCurrentDirectory(MAX_PATH, szPath2);
	StrCat(szPath2, _T("\\Custom1.html"));
	m_wndWeb2.Navigate(szPath2, NULL, NULL, NULL, NULL);
具體的互操做的問題能夠參考下例子,這裏只介紹美化的工做。demo能夠在 這裏下載

★利用其它前輩封裝好的類進行美化。

點擊這裏進行下載
★利用WPF進行美化,這個我沒有用過,可是聽說美化效果很好,之後學習會補充進來的~~

這麼多種方法總有一種適合你,幫你打造你想要的MFC界面。

相關文章
相關標籤/搜索