Boost logo

Boost :

From: E. Gladyshev (egladysh_at_[hidden])
Date: 2003-07-25 15:45:25


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" <egladysh_at_[hidden]> 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 <iad929_at_[hidden]> wrote:
> > Do you mean that your librry is directed to MS
> > Windows?
> >
> >
> > Mohammed
> > ----- Original Message -----
> > From: E. Gladyshev <egladysh_at_[hidden]>
> > To: <boost_at_[hidden]>
> > 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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk