MFC用GDI+動感歌詞的製作

來源:互聯網
上載者:User

 

原始碼:http://download.csdn.net/detail/nuptboyzhb/4219669

 

原始碼:

1.      
插入一個對話方塊的資源,刪除預設控制項,並為對話方塊建立一個類,命名為ClyricDlg;

2.      
在對話方塊的標頭檔中添加GDI+相關的標頭檔和動態庫

#define UNICODE

#ifndef ULONG_PTR

#define ULONG_PTR unsigned long*

#endif

#include "GDIPlus\\Includes\\GdiPlus.h"   ////Modify your path

using namespace Gdiplus; 

#pragma comment(lib, "GDIPlus\\Lib\\gdiplus.lib") //Modify your lib path

3.      
新增公有成員變數:

int m_kind;

int cx;

BOOL UpdateDisplay(int Transparent=255);

         HINSTANCE hFuncInst ;

typedef BOOL (WINAPI *MYFUNC)(HWND,HDC,

POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);         

MYFUNC UpdateLayeredWindow;

BLENDFUNCTION m_Blend;

        HDC m_hdcMemory;

4.      
新增私人成員變數:

BOOL m_bBack;

GdiplusStartupInput gdiplusStartupInput;

     ULONG_PTR           gdiplusToken;

5.      
在建構函式中初始化如下成員變數:

m_bBack=false;

m_kind=cx=0;

     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

6.      
為對話方塊添加OnCreate函數,並編輯代碼如下:

hFuncInst = LoadLibrary("User32.DLL");

BOOL bRet=FALSE;

if(hFuncInst)

           UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow");

else

{

           AfxMessageBox("User32.dll ERROR!");

           exit(0);

}

// Initialize GDI+.

m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000

m_Blend.BlendFlags=0; //nothingelseisspecial...

m_Blend.AlphaFormat=1; //...

m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA

7.      
實現其成員函數UpdataDisplay

BOOL CLyricDlg::UpdateDisplay(int Transparent){//獲得DC,建立相容DCHDC hdcTemp=GetDC()->m_hDC;m_hdcMemory=CreateCompatibleDC(hdcTemp);HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,755,350);SelectObject(m_hdcMemory,hBitMap);//設定透明度最大值為100if(Transparent<0||Transparent>100)      Transparent=100;    //將透明度參數,傳遞給BLENDFUNCTION;m_Blend.SourceConstantAlpha=int(Transparent*2.55);//1~255RECT rct;//擷取視窗的螢幕位置GetWindowRect(&rct);//視窗左上方的座標POINT ptWinPos={rct.left,rct.top};    //建立2個相容DC的畫筆,Graphics類在GDI+中定義Graphics graph(m_hdcMemory);Graphics graphics(m_hdcMemory);    //設定平滑模式graphics.SetSmoothingMode(SmoothingModeAntiAlias);graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);    //設定字型,FontFamily也在GDI+中定義FontFamily fontFamily(L"Arial Black");StringFormat strformat;//擷取系統時間CTime time=CTime::GetCurrentTime();CString timestr=time.Format("%H-%M-%M");wchar_t pszbuf[][80]={{L"http://blog.csdn.net/nuptboyzhb"},{L"南京郵電大學鄭海波"},{L"I wish you will lead a  happy life!"},{L"zhb931706659@126.com"},{L"NUPT"}};    //建立一個畫筆的路徑GraphicsPath path;path.AddString(pszbuf[m_kind],wcslen(pszbuf[m_kind]),&fontFamily,           FontStyleRegular,38,Point(10,10),&strformat);    //建立一支畫筆Pen pen(Color(155,215,215,215),3);    //畫筆畫出已經建立的路徑graphics.DrawPath(&pen,&path);/*畫出字型的邊緣部分*/for(int i=1; i<9; i+=1)    {        Pen pen(Color(62, 0, 2, 2),(float)i);        pen.SetLineJoin(LineJoinRound);        graphics.DrawPath(&pen, &path);    } SolidBrush brush(Color(25,228,228,228));Pen pen1(Color(155,223,223,223));Pen pen2(Color(55,223,223,223));  Image image(L"1.png");if(m_bBack)//畫背景和圖片{           graphics.FillRectangle(&brush,3,5,750,90);           graphics.DrawRectangle(&pen1,2,6,751,91);           graphics.DrawRectangle(&pen2,1,5,753,93);           graphics.DrawImage(&image,600,5);}//建立線性漸層畫刷LinearGradientBrush linGrBrush(           Point(0,0),Point(0,90),           Color(255,255,255,255),           Color(255,30,120,195));LinearGradientBrush linGrBrushW(           Point(0,10),Point(0,60),           Color(255,255,255,255),           Color(15,1,1,1));//用線性漸層畫刷填充路徑graphics.FillPath(&linGrBrush,&path);graphics.FillPath(&linGrBrushW,&path);//設定視窗的風格DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);if((dwExStyle&0x80000)!=0x80000)           SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);//更新視窗層SIZE sizeWindow={755,350};POINT ptSrc={0,0};BOOL bRet=FALSE;HDC hdcScreen=::GetDC (m_hWnd);//UpdateLayeredWindow功能是更新一個視窗的位置、大小、形狀、內容和透明度bRet= UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos,           &sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2);graph.ReleaseHDC(m_hdcMemory);::ReleaseDC(m_hWnd,hdcScreen);hdcScreen=NULL;::ReleaseDC(m_hWnd,hdcTemp);hdcTemp=NULL;DeleteObject(hBitMap);DeleteDC(m_hdcMemory);m_hdcMemory=NULL;return bRet;}

 

8.      
添加OnTimer(UINT nIDEvent)訊息響應函數,編輯代碼如下:

cx+=1;

if(cx>20)

{

           m_kind++;

           m_bBack=false;

           UpdateDisplay();

           cx=0; 

}                

if(m_kind>3)

           m_kind=0;

9.      
編輯OnInitDialog()函數

// TODO: Add extra initialization here

UpdateDisplay();

      SetTimer(1,50,NULL);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.