home *** CD-ROM | disk | FTP | other *** search
- #include <wfc.h>
- #pragma hdrstop
-
- /*
- ** Author: Samuel R. Blackburn
- ** CI$: 76300,326
- ** Internet: sammy@sed.csc.com
- **
- ** You can use it any way you like.
- */
-
- #if defined( _DEBUG )
- #undef THIS_FILE
- static char BASED_CODE THIS_FILE[] = __FILE__;
- #endif
-
- CString CBubble::m_ClassName = "";
-
- CFont CBubble::m_Font;
-
- DWORD CBubble::m_Height = 0;
-
- IMPLEMENT_DYNAMIC( CBubble, CWnd );
-
- CBubble::CBubble()
- {
- m_FontSize = (-8);
- m_Created = FALSE;
- }
-
- CBubble::CBubble( int font_size )
- {
- m_Created = FALSE;
- m_FontSize = font_size;
- }
-
- CBubble::~CBubble()
- {
- }
-
- BOOL CBubble::Create()
- {
- if ( m_ClassName == "" )
- {
- CBrush brush;
-
- TRY
- {
- brush.CreateSolidBrush( LIGHT_YELLOW );
- }
- CATCH( CResourceException, e )
- {
- return( FALSE );
- }
- END_CATCH
-
- m_ClassName = ::AfxRegisterWndClass( CS_BYTEALIGNCLIENT | CS_SAVEBITS | CS_HREDRAW | CS_VREDRAW, 0, (HBRUSH) brush.Detach() );
-
- if ( m_ClassName == "" )
- {
- TRACE( "CBubble, AfxRegisterWndClass() failed\n" );
- return( FALSE );
- }
- }
-
- CRect rectangle;
-
- rectangle.SetRectEmpty();
-
- m_Created = CreateEx( 0,
- m_ClassName,
- "",
- WS_POPUP | WS_BORDER,
- rectangle.left,
- rectangle.top,
- rectangle.right,
- rectangle.bottom,
- NULL,
- (HMENU) NULL );
-
- if ( m_Font.GetSafeHandle() == NULL )
- {
- m_SetFont();
- }
-
- return( m_Created );
- }
-
- BOOL CBubble::DestroyWindow()
- {
- m_Created = FALSE;
- return( CWnd::DestroyWindow() );
- }
-
- DWORD CBubble::GetHeight( void ) const
- {
- return( m_Height );
- }
-
- void CBubble::Hide( void )
- {
- ShowWindow( SW_HIDE );
- }
-
- BOOL CBubble::IsCreated( void ) const
- {
- return( m_Created );
- }
-
- void CBubble::m_SetFont( void )
- {
- CClientDC device_context( this );
-
- TRY
- {
- LOGFONT lf;
-
- ::ZeroMemory( &lf, sizeof( lf ) );
-
- lf.lfHeight = -::MulDiv( m_FontSize, device_context.GetDeviceCaps( LOGPIXELSY ), 72 );
- lf.lfCharSet = DEFAULT_CHARSET;
- lf.lfQuality = DEFAULT_QUALITY;
- lf.lfClipPrecision = CLIP_LH_ANGLES | CLIP_STROKE_PRECIS;
- lf.lfPitchAndFamily = FF_SWISS;
-
- m_Font.CreateFontIndirect( &lf );
- }
- CATCH( CResourceException, e )
- {
- TRACE( "CBubble, font creation failed\n" );
- return;
- }
- END_CATCH
-
- CFont *old_font = device_context.SelectObject( &m_Font );
-
- TEXTMETRIC tm;
- device_context.GetTextMetrics( &tm );
- device_context.SelectObject( old_font );
- m_Height = tm.tmHeight + tm.tmExternalLeading + ( 6 * GetSystemMetrics( SM_CYBORDER ) );
- }
-
- void CBubble::SetFontSize( int font_size )
- {
- m_FontSize = font_size;
- }
-
- void CBubble::Show( CPoint point, const CString& string )
- {
- Hide();
- UpdateWindow();
-
- SetWindowText( string );
-
- CRect bubble;
- GetWindowRect( &bubble );
- CRect screen;
-
- ::GetWindowRect( ::GetDesktopWindow(), &screen );
-
- /*
- ** Let's make sure the window is always visible (on screen)
- */
-
- if ( point.y < 0 )
- {
- point.y = 0;
- }
-
- if ( ( point.y + bubble.Height() ) > screen.bottom )
- {
- point.y = screen.bottom - ( bubble.Height() + 1 );
- }
-
- if ( point.x < 0 )
- {
- point.x = abs( point.x ) - ( bubble.Width() / 2 );
- }
-
- if ( point.x > screen.right )
- {
- point.x = screen.right - ( bubble.Width() + 1 );
- }
-
- SetWindowPos( &wndTop, point.x, point.y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE );
-
- ShowWindow( SW_SHOWNOACTIVATE );
- }
-
- BEGIN_MESSAGE_MAP( CBubble, CWnd )
- ON_WM_PAINT()
- ON_MESSAGE( WM_SETTEXT, OnSetText )
- END_MESSAGE_MAP()
-
- void CBubble::OnPaint()
- {
- CPaintDC device_context( this );
-
- CRect rectangle;
-
- GetClientRect( rectangle );
-
- CFont *old_font = device_context.SelectObject( &m_Font );
- device_context.SetTextAlign( TA_CENTER );
- device_context.SetBkMode( TRANSPARENT );
- device_context.SetTextColor( BLACK );
-
- CString text;
- GetWindowText( text );
- CSize size = device_context.GetTextExtent( text, text.GetLength() );
- device_context.TextOut( rectangle.right / 2, ( rectangle.bottom - size.cy ) / 2, text );
- device_context.SelectObject( old_font );
- }
-
- afx_msg LONG CBubble::OnSetText( UINT, LONG lParam )
- {
- CRect rectangle;
- GetWindowRect( rectangle );
-
- CClientDC device_context( this );
-
- CFont *old_font = device_context.SelectObject( &m_Font );
- CSize size = device_context.GetTextExtent( (LPCSTR) lParam, lstrlen( (LPCSTR) lParam ) );
-
- rectangle.right = rectangle.left + size.cx + ( 6 * GetSystemMetrics( SM_CXBORDER ) );
-
- rectangle.bottom = rectangle.top + m_Height;
- MoveWindow( &rectangle );
- device_context.SelectObject( old_font );
-
- return( CWnd::Default() );
- }
-