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