Click here to Skip to main content
15,896,118 members
Articles / Desktop Programming / Windows Forms

Cool, Semi-transparent and Shaped Dialogs with Standard Controls for Windows 2000 and Above

Rate me:
Please Sign up or sign in to vote.
4.85/5 (95 votes)
28 Sep 2012CPOL3 min read 2.9M   32.8K   350  
This article tries to find a way to show Windows standard controls on layered windows. Provides both Native MFC and WinForms source code.
#ifndef _GDIPLUSH_H_INCLUDED_
#define _GDIPLUSH_H_INCLUDED_

// 
// GDI+ helper file v1.0
// 
// Written by Zoltan Csizmadia (zoltan_csizmadia@yahoo.com)
// 

// GDIPLUS_NO_AUTO_INIT:
// GDI+ won't be initialized at program startup, 
// you have to create GdiPlus::GdiPlusInitialize object to 
// initialize GDI+ ( GDI+ will be uninitialized, when destructor
// is called.
//#define GDIPLUS_NO_AUTO_INIT

// GDIPLUS_USE_GDIPLUS_MEM:
// GdipAlloc and GdipFree is used for memory operations
// In this case _Crt functions cannot be used to detect 
// memory leaks
//#define GDIPLUS_USE_GDIPLUS_MEM

// GDIPLUS_NO_AUTO_NAMESPACE:
// Gdiplus namespace wont' be defined as a used namespace
// In this case you have to use Gdiplus:: prefix
//#define GDIPLUS_NO_AUTO_NAMESPACE

#ifdef _GDIPLUS_H
#error Gdiplus.h is already included. You have to include this file instead.
#endif


// Fix for STL iterator problem
#define iterator _iterator
#define list _list
#define map _map

#define _GDIPLUSBASE_H

namespace Gdiplus
{
    namespace DllExports
    {
        #include "GdiplusMem.h"
    };

    class GdiplusBase
    {
    public:
#ifdef _DEBUG
        static void* __cdecl GdiplusAlloc( size_t nSize, LPCSTR szFileName, int nLine )
        {
#ifdef GDIPLUS_USE_GDIPLUS_MEM
            UNREFERENCED_PARAMETER(szFileName);
            UNREFERENCED_PARAMETER(nLine);
            return DllExports::GdipAlloc(nSize); 
#else
            return ::operator new( nSize, szFileName, nLine );
#endif
        }

        static void GdiplusFree( void* pVoid, LPCSTR szFileName, int nLine )
        {
#ifdef GDIPLUS_USE_GDIPLUS_MEM
            UNREFERENCED_PARAMETER(szFileName);
            UNREFERENCED_PARAMETER(nLine);
            DllExports::GdipFree(pVoid); 
#else
            ::operator delete( pVoid, szFileName, nLine );
#endif
        }
        
        void* (operator new)(size_t nSize) 
        { 
            return GdiplusAlloc( nSize, __FILE__, __LINE__ );
        }
        void* (operator new[])(size_t nSize) 
        { 
            return GdiplusAlloc( nSize, __FILE__, __LINE__ );
        }
        void * (operator new)(size_t nSize, LPCSTR lpszFileName, int nLine) 
        { 
            return GdiplusAlloc( nSize, lpszFileName, nLine );
        }
        void (operator delete)(void* pVoid) 
        { 
            GdiplusFree( pVoid, __FILE__, __LINE__ );
        }
        void (operator delete[])(void* pVoid) 
        { 
            GdiplusFree( pVoid, __FILE__, __LINE__ );
        }
        void operator delete(void* pVoid, LPCSTR lpszFileName, int nLine) 
        { 
            GdiplusFree( pVoid, lpszFileName, nLine);
        }
#else // _DEBUG

        static void* __cdecl GdiplusAlloc( size_t nSize )
        {
#ifdef GDIPLUS_USE_GDIPLUS_MEM
            return DllExports::GdipAlloc(nSize); 
#else
            return ::operator new(nSize);
#endif
        }

        static void GdiplusFree( void* pVoid )
        {
#ifdef GDIPLUS_USE_GDIPLUS_MEM
            DllExports::GdipFree(pVoid); 
#else
            ::operator delete( pVoid );
#endif
        }

        void* (operator new)(size_t nSize) 
        { 
            return GdiplusAlloc( nSize );
        }
        void* (operator new[])(size_t nSize) 
        { 
            return GdiplusAlloc( nSize );
        }
        void (operator delete)(void* pVoid) 
        { 
            GdiplusFree( pVoid );
        }
        void (operator delete[])(void* pVoid) 
        { 
            GdiplusFree( pVoid );
        }
#endif
    };
};

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#include <Gdiplus.h> 

#ifdef _DEBUG
#undef new
#endif



namespace Gdiplus
{
    class GdiPlusInitialize
    {
    public:
        GdiPlusInitialize()
        {
            GdiplusStartupInput Startup;
            GdiplusStartup( &m_Token, &Startup, NULL );
        }

        ~GdiPlusInitialize()
        {
            GdiplusShutdown( m_Token );
        }

    protected:
        ULONG_PTR m_Token;
#ifndef GDIPLUS_NO_AUTO_INIT
        static GdiPlusInitialize m_Initialize;
#endif
    };
#ifndef GDIPLUS_NO_AUTO_INIT
    GdiPlusInitialize GdiPlusInitialize::m_Initialize;
#endif
}

#ifndef GDIPLUS_NO_AUTO_NAMESPACE
using namespace Gdiplus;
#endif

// STL problem
#undef iterator
#undef list
#undef map

#endif

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

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


Written By
Team Leader
China China
Jerry is from China. He was captivated by computer programming since 13 years old when first time played with Q-Basic.



  • Windows / Linux & C++
  • iOS & Obj-C
  • .Net & C#
  • Flex/Flash & ActionScript
  • HTML / CSS / Javascript
  • Gaming Server programming / video, audio processing / image & graphics


Contact: vcer(at)qq.com
Chinese Blog: http://blog.csdn.net/wangjia184

Comments and Discussions