Click here to Skip to main content
Click here to Skip to main content

To Create A COOL Desktop Lyrics Demo (A Gift To All People On CP)

, 1 Jan 2010
Rate this:
Please Sign up or sign in to vote.
Many popular MP3 players have cool desktop lyrics, this demo uses a simple method to realize it. Happy new year!
GDIAPP

gdiplus2.jpg

Introduction

The code demonstrates how to use GDI plus create an application with VC6. Many popular MP3 players have desktop lyrics. It's really cool, I like it very much. So I decided tp try to realize it. But I found it's really hard. Here,I should thank all the CodeProject contributors first because I learned much from GDI+ section. After I refreshed the GDI+ functions, I wrote the code. Hope it will help you. This is a gift I send to the members on CodeProject. Happy new year! Download the demo right now and have fun!

Explanation of the Code

Now, let's have a look at the code. How was this demo created. The demo was based on a dialog, not a class. But, I will not talk more about the basic steps of generation of dialog. I suppose you know about the usage of MFC. To look for more, read other articles or MSDN online.

Step 1

We use GDI plus functions, so the first thing is include the header and lib files.

#define UNICODE
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "gdiplus.h"   		////Modify your path
using namespace Gdiplus;   		//Using the namespace of GDI+
#pragma comment(lib, "gdiplus.lib") 	//Modify your lib path

I add the snippets into the dialog's header. Of course, #include "gdiplus.h" you can also modify your own path of your computer. Be sure the path is correct, or the VC can't find it.

Step 2

We use the class wizard to add several messages deal functions. WM_CREATE WM_TIMER WM_CONTENTMENU WM_DESTROY WM_LBUTTONDOWN... for more, download the resources.

We'll use GDI+, so GdiplusStartup() must be invoked before we use its functions. Before the application exits, we need to invoke another function GdiplusShutdown().

//The snippets put into header file
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;

//Following code put into construction method
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

//Invoke function to clear
void CGDIAPPDlg::OnDestroy() 
{
 CDialog::OnDestroy();
 GdiplusShutdown(gdiplusToken);
 // TODO: Add your message handler code here
}

Okay! We have finished doing the first job.

Step 3

Initializations for the dialog. We want to invoke the UpdateLayeredWindow() in the "user32.dll", so we should get the address of the function.

int CGDIAPPDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
 if (CDialog::OnCreate(lpCreateStruct) == -1)
  return -1;
 
    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
 
 return 0;
}

Step 4

Okay! Now we begin to think how to draw on desktop. The method is:

  1. Create a compatible bitmap.
  2. Draw on the bitmap.
  3. Draw bitmap on the device content.
  4. Invoke the UpdateLayeredWindows().

I write a method to do all the jobs like others do (others' snippets). The following is the code. Let's have a look into the details:

BOOL CGDIAPPDlg::UpdateDisplay(int Transparent)
{
 HDC hdcTemp=GetDC()->m_hDC;
 m_hdcMemory=CreateCompatibleDC(hdcTemp);   //Create the compatibleDC
 HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,755,350); //Create the compatible bitmap
 SelectObject(m_hdcMemory,hBitMap);//Select bitmap into device content
 if(Transparent<0||Transparent>100) Transparent=100;

 m_Blend.SourceConstantAlpha=int(Transparent*2.55);//1~255
 HDC hdcScreen=::GetDC (m_hWnd);
 RECT rct;
 GetWindowRect(&rct);
 POINT ptWinPos={rct.left,rct.top};

 Graphics graph(m_hdcMemory);

 Graphics graphics(m_hdcMemory);

 graphics.SetSmoothingMode(SmoothingModeAntiAlias);
 graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);

 FontFamily fontFamily(L"Arial Black");
 StringFormat strformat;

//Here is the text we want to show on the desktop, we can read it from a file.
//I'll modify it later.
 wchar_t pszbuf[][80]={{L"Hello everyone!"},
 {L"Happy New Year!"},
 {L"I wish you will lead a  happy life!"},
 {L"Love you!"},
 {L"Thanks all the people on CP!"}
 };

//The following code is used to draw the text on dc
 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);

 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));
/*Draw shade ,I study from others. */
   for(int i=1; i<9; i+=1)
    {
        Pen pen(Color(62, 0, 2, 2), 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"ly.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);
   }

 graphics.FillPath(&linGrBrush,&path);
 graphics.FillPath(&linGrBrushW,&path);
 
 SIZE sizeWindow={755,350};
 POINT ptSrc={0,0};
 DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);	//Don't forget to set 
						//the dialog's extent style.
 if((dwExStyle&0x80000)!=0x80000)
  SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);

 BOOL bRet=FALSE;
 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;
}

When the dialog is created, call this method and it does work.

Points of Interest

I learned many new ideas and functions while writing the article. Hope you will also like it! You can use the code in any way, and to create much more stronger applications. Thanks for your support again! Happy new year!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Aric Green
Engineer
China China
Although I was a college studnet now as the same I was also a teacher of C/C++/3DS MAX/website for National Computer Rank Examination.I began to study computer when I was a child 8 year's old.I use BASIC/C/C++/VB/VF/VC/DELPHI/.NET to programming.When in college I was the chairman of Computer Association of our school and I take part in ACM Competition twice in two years.I also was the only person who take part in the National Mathematical Contest in Modeling twice in two years of our school.I like computer programming very much.Hope to be your friend.thx!

Comments and Discussions

 
Question谢谢楼主 Pinmember94009403317-Jul-14 17:10 
Question楼主很强 Pinmemberdlsyaim19-May-14 23:07 
GeneralMy vote of 5 Pinmembergndnet31-Jul-12 13:50 
Questionnice work Pinmemberhellix201218-Aug-11 16:37 
GeneralI am trying to do the same thing using c# PinmemberHanson Cheng16-Mar-11 17:58 
General这个代码看着好面熟哦... Pinmemberjackieron22-Feb-11 22:45 
GeneralRe: 这个代码看着好面熟哦... PinmemberAric Green8-Mar-11 16:41 
QuestionVery Good Article PinmemberTheRoughGuy9-Feb-10 10:16 
AnswerRe: Very Good Article PinmemberAric Green9-Feb-10 17:49 
GeneralRe: Very Good Article PinmemberTheRoughGuy10-Feb-10 3:38 
GeneralRe: Very Good Article PinmemberAric Green10-Feb-10 5:38 
GeneralRe: Very Good Article PinmemberTheRoughGuy10-Feb-10 6:39 
GeneralRe: Very Good Article PinmemberAric Green10-Feb-10 21:20 
GeneralRe: Very Good Article PinmemberHanson Cheng16-Mar-11 17:56 
AnswerRe: Very Good Article Pinmembereyinlijun16-Sep-10 21:52 
GeneralVery good! Pinmemberenzomidi13-Jan-10 23:07 
GeneralRe: Very good! PinmemberAric Green14-Jan-10 17:16 
GeneralRe: Very good! Pinmemberenzomidi15-Jan-10 5:12 
GeneralLittle interest PinmemberPatLeCat6-Jan-10 23:35 
GeneralRe: Little interest PinmemberAric Green7-Jan-10 2:09 
QuestionRe: Little interest PinmemberPatLeCat8-Jan-10 23:14 
GeneralGood PingroupMd. Marufuzzaman1-Jan-10 22:54 
GeneralRe: Good PinmemberAric Green2-Jan-10 3:15 
GeneralRe: Good PingroupMd. Marufuzzaman2-Jan-10 6:15 
Generalhei Pinmemberchenyu22028631-Jan-10 17:11 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web01 | 2.8.140721.1 | Last Updated 1 Jan 2010
Article Copyright 2009 by Aric Green
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid