Sorry, forgot to put the base class in.

// base for GDI objects, like bitmaps, imagelists,
pens, etc.
//==========================================================
template< typename T, typename Tr >
class GdiObj
{
public:
        typedef Tr Traits;
        typedef T  Hnd;

        inline GidObj()
        {
                m_hnd = NULL;
        }
        virtual ~GdiObj()
        {
                destroy();
        }

        inline destroy()
        {
                if( !m_hnd ) return;
                Traits::destroy( m_hnd );
                m_hnd = NULL;
        }

        inline void set_hnd( Hnd hnd ) { m_hnd = hnd; }
        inline Hnd  get_hnd() const { return m_hnd; }

        inline operator T() const { return m_hnd; }

public:
        T m_hnd;
};

template < typename Tr = WinGdiTraits >
class Bitmap : public GdiObj< Tr::BitmapHnd, Tr >
{
public:
        _bool create( const Tr::Resource& r )
        {
                m_hnd = Traits::load_bitmap( r );
                if( !m_hnd ) return FALSE;
                return TRUE;
        }

        inline Size size(  )
        {
                return Traits::get_bmpsize( m_hnd );
        }
};

template < typename Tr=WinGdiTraits >
class ImageList : public GdiObj< Tr::ImageListHnd, Tr
>
{
public:
        typedef int iterator;

        _bool create( const Tr::Resource& r, const Color&
transp_color, int imgnum )
        {
                Bitmap<Tr> bmp;
                if( !bmp.create(r) ) return FALSE;
                m_hnd = Traits::create_imglist( bmp, transp_color,
bmp.size()/imgnum );
                if( !m_hnd ) return FALSE;
                return TRUE;
        }

        inline iterator begin () { return 0; }
        inline iterator end   () { return size(); }
        inline int      size  () { return
Traits::get_imglist_size( m_hnd ); }
};


--- "E. Gladyshev" <[EMAIL PROTECTED]> wrote:
> The library itself would be portable, the physical
> layer (Win32 or else) is specified as a data type
> with
> a bunch of static functions. It is similar to data
> type traits in STL.  In other words the physical
> layer
> is a data type that is used as a template parameter.
> If you need to adopt the GUI/GDI template library to
> another system, all you'll need to do is to create a
> data type which defines the predefined traits.
> 
> Here is a simple example of the Bitmap and ImageList
> templates and Win32 traits that demonstrates this
> idea. Note: I have not tried to compile this code
> yet.
> 
> template < typename Tr = WinGdiTraits >
> class Bitmap : public GdiObj< Tr::BitmapHnd, Tr >
> {
> public:
>       _bool create( const Resource& r )
>       {
>               m_hnd = Traits::load_bitmap( r );
>               if( !m_hnd ) return FALSE;
>               return TRUE;
>       }
> 
>       inline Size size(  )
>       {
>               return Traits::get_bmpsize( m_hnd );
>       }
> };
> 
> template < typename Tr=WinGdiTraits >
> class ImageList : public GdiObj< Tr::ImageListHnd,
> Tr
> >
> {
> public:
>       typedef int iterator;
> 
>       _bool create( const Resource& r, const Color&
> transp_color, int imgnum )
>       {
>               Bitmap<Tr> bmp;
>               if( !bmp.create(r) ) return FALSE;
>               m_hnd = Traits::create_imglist( bmp, transp_color,
> bmp.size()/imgnum );
>               if( !m_hnd ) return FALSE;
>               return TRUE;
>       }
> 
>       inline iterator begin () { return 0; }
>       inline iterator end   () { return size(); }
>       inline int      size  () { return
> Traits::get_imglist_size( m_hnd ); }
> };
> 
> 
> 
>       // Win32 traits
>       //=============
> 
> class WinTypes
> {
> public:
>       typedef HWND        WinHnd;
>       typedef HGDIOBJ     GdiHnd;
>       typedef HBITMAP     BitmapHnd;
>       typedef HIMAGELIST  ImageListHnd;
> 
>       typedef SIZE        Size;
>       typedef POINT       Point;
>       typedef RECT        Rect;
> 
>       typedef WinRes      Resource;
> 
>       typedef COLORREF    Color;
> };
> 
> 
> //----
> class WinGdiTraits : public WinTypes
> {
> public:
>       typedef GdiHnd Hnd;
> 
>       static void  destroy  ( Hnd h ) { ::DeleteObject( h
> ); }
>       static void  destroy  ( BitmapHnd h ) {
> ::DeleteObject( (Hnd)h ); }
>       static void  destroy  ( ImageListHnd h ) {
> ::ImageList_Destroy( h ); }
> 
> 
>       //bitmap functions
>       static BitmapHnd load_bitmap( const Resource& r )
>       {
>               return ::LoadBitmap( r.m_hinst, r.m_res }
>       }
>       static Size get_bmpsize( BitmapHnd h )
>       {
>               Size s;
>               BITMAP bmp;
>               assert( h );
>               ::GetObject( h, sizeof(BITMAP), &bmp);
>               s.cx = bmp.bmWidth;
>               s.cy = gmp.bmHeight;
>               return s;
>       }
> 
>       //image list 
>       static ImageListHnd create_imglist( BitmapHnd hb,
> const Color& transp_color, int image_cx )
>       {
>               ImageListHnd h;
>               Size s;
>               get_bmpsize( hb, s ); 
> 
>               h = ImageList_Create( image_cx, s.cy, ILC_MASK |
> ILC_COLOR32, 0, 1);
>               if( !h ) return NULL;
> 
>               // Add the bitmap into the image list
>               ImageList_AddMasked( h, hb,  transp_color );
> 
>               return h;
>       }
> 
>       static int get_imglist_size( ImageListHnd h )
>       {
>               return ImageList_GetImageCount( h );
>       }
> };
> 
> 
> Eugene
> 
> 
> 
> 
> 
> --- iad929 <[EMAIL PROTECTED]> wrote:
> > Do you mean that your librry is directed to  MS
> > Windows?
> > 
> > 
> > Mohammed
> > ----- Original Message -----
> > From: E. Gladyshev <[EMAIL PROTECTED]>
> > To: <[EMAIL PROTECTED]>
> > Sent: Friday, July 25, 2003 9:11 PM
> > Subject: [boost] GUI/GDI template library
> > 
> > 
> > > I was thinking about designing a GUI/GDI
> template
> > > library.
> > >
> > > The main ideas are:
> > > 1. Create a portable template abstraction for
> > standard
> > > GUI/GDI elements and dialog boxes.
> > > 2. Design an "iterator-like" interface.
> > > 3. The most important goal is design a natural
> > > connection between STL containers and GUI
> > elements, so
> > > that STL data can be easily presented in the GUI
> > > environment.
> > >
> > > For example
> > > template < typename IT, typename
> PhysicalGuiLayer
> > >
> > > class ListControl
> > > {
> > > public:
> > > template < typename Filter, typename Format >
> > > void push_back( IT& FirstIt,
> > > IT& EndIt,
> > > Filter& filter,
> > > Format& format )
> > > {
> > > for( IT it = FirstIt; it < EndIt; ++it )
> > > {
> > > if( filter(it) )
> > > {
> > >
> > sicalGuiLayer::list_add_item( 
> > > m_hnd, 
> > > format.get_list_item(it) 
> > > );
> > > }
> > > }
> > > }
> > > };
> > > 
> > > Does something similar exist already?
> > > It seems like a challenging project. If anybody
> is
> > > interested, let me know.  
> > > 
> > > Eugene
> > > 
> > > 
> > > __________________________________
> > > Do you Yahoo!?
> > > Yahoo! SiteBuilder - Free, easy-to-use web site
> > design software
> > > http://sitebuilder.yahoo.com
> > > _______________________________________________
> > > Unsubscribe & other changes:
> > http://lists.boost.org/mailman/listinfo.cgi/boost
> > 
> > 
> > 
> > _______________________________________________
> > Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
> 
> 
> __________________________________
> Do you Yahoo!?
> Yahoo! SiteBuilder - Free, easy-to-use web site
> design software
> http://sitebuilder.yahoo.com
> _______________________________________________
> Unsubscribe & other changes:
http://lists.boost.org/mailman/listinfo.cgi/boost


__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to