65.9K
CodeProject is changing. Read more.
Home

Using Skins Without MFC

starIconstarIconstarIconstarIconstarIcon

5.00/5 (11 votes)

Jul 18, 2001

GPL3

2 min read

viewsIcon

237929

downloadIcon

11980

A Simple Skinning Library

Sample Image - SkinStyle.jpg

Introduction

SkinStyle is a picture based skin system written in Visual C++/Win32 and loosely based on Cuneyt Elibol's MFC/SkinSys. The major difference is SkinStyle is written without any MFC. Much of the functionality found in SkinSys is not found in this version of SkinStyle.

Contents

  • SkinStyle Source
  • A Simple Example

Download Directories

Once you download and extract the files, you'll see several new folders. Here is what each are used for.

  • Root : The SkinStyle Code
  • SkinTest : An Example Project And Skin

Example

Create a class that inherits from SkinDialog

class KSkinTest : public SkinDialog
{
public:
	// here we are overriding the OnKeyDown member of SkinDialog
	// so the app will exit on ESC
	virtual void OnKeyDown(WPARAM wParam, LPARAM lParam)
	{
		if ( wParam == VK_ESCAPE )
			::PostMessage(m_hWnd, WM_CLOSE, 0, 0);
	}
	// we also override the OnButtonPressed member of SkinDialog
	// to catch the user pushing one of the buttons
	virtual BOOL OnButtonPressed(char *ButtonName);

};

Now lets look at how to handle buttons being pressed...

//
// This member function is called with the name of the button being pressed
//
BOOL KSkinTest::OnButtonPressed(char *ButtonName)
{
	if(strcmp(ButtonName, "BUTTON_EXIT") == 0)
		::PostMessage(m_hWnd, WM_CLOSE, 0, 0);

	else if(strcmp(ButtonName, "BUTTON_MINIMIZE") == 0)
		::ShowWindow(m_hWnd, SW_MINIMIZE);

	else if(strcmp(ButtonName, "YOUR_DEFINED_BUTTON") == 0)
	{
		//
		// Do Something...
		//
	}
	return FALSE;
}

Once you have defined your new dialog class it can be used in WinMain like this

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmd, int nShow)
{
	KSkinTest win;

	HWND hParent;

	// GetFile is a user defined function that returns a file with the full path...

	char *SkinFile = GetFile(NULL);

	if(SkinFile[0] == 0) 
	{
		GlobalFree(SkinFile);
		return 0;
	}

	// here we create the dialog
	hParent = win.CreateEx("SkinTest", 	// Text in caption
				CW_USEDEFAULT, 	// x coord
				CW_USEDEFAULT, 	// y coord
				hInst, 		// HINSTANCE
				SkinFile);	// full path of skin file

	GlobalFree(SkinFile);
	
	win.SetSticky(true);	// make the dialog sticky

	win.ShowWindow(nShow);	// Show the new dialog
	win.UpdateWindow();	// Update it

	return win.MessageLoop();	// Enter the message loop
}

Skin file format

A Skin file consists of three parts (more to come later)

  • [SCREEN] : This section contains the image files to display
    • Mask : This specifies the mask image for the dialog
    • Main : This specifies the main image for the dialog
    • Down : This specifies the image displayed when a widget is pressed
    • Over : This specifies the image displayed when the mouse is over a sensitive widget
    • Disabled : This specifies the image displayed when the dialog is inactive

  • [BUTTONINFO] : This section contains a numbered list of buttons to display
    • #=BUTTON_NAME,x,y,width,height,TOOL_TIP,FALSE

  • [TEXTINFO] : This section contains a numbered list of labels to display
    • #=TEXT_NAME,FONT,BOLD(TRUE/FALSE),ITALIC(TRUE/FALSE),SIZE,COLOR(long),x,y,width,height,TOOL_TIP

For example:

[SCREEN]
Mask=Mask.bmp
Main=Main.bmp
Down=Selected.bmp
Over=Selected.bmp
Disabled=Main.bmp

[BUTTONINFO]
1=BUTTON_MINIMIZE,4,1,7,8,Minimize,FALSE
2=BUTTON_BABEL,12,425,43,19,Babel Preferences,FALSE
3=BUTTON_EXIT,196,1,7,8,Exit,FALSE
4=BUTTON_STATUS,119,425,25,19,User Status,FALSE

[TEXTINFO]
1=TEXT_STATUS,Courier New,FALSE,TRUE,-8,3496550,136,424,64,6,Offline,User Status

Problems/Bugs

At this stage I am unable to reload skins at run time? This is apparent in the sample app.

Additional Notes

This is by no means a finished product! This is my first attempt at writing a terribly complicated Win32 application library. I wanted something similar to SkinSys in functionality but without the overhead of MFC. There will be bugs and errors! I hope that you find this code useful. If you have any improvements/suggestions, comments/flames, or questions please e-mail me or post here.