136 lines
3.4 KiB
C++
136 lines
3.4 KiB
C++
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// FILE : TipWin.cpp
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
|
|
#include "stdinc.h"
|
|
#include "tipwin.h"
|
|
|
|
int CTip::nCount = 0;
|
|
|
|
CTip::CTip(HWND hwnd)
|
|
{
|
|
m_hAppWnd = hwnd;
|
|
if(!nCount++)
|
|
{
|
|
WNDCLASS wcls =
|
|
{ 0, CTip::SWProc, 0, 0, hInstance,
|
|
NULL,
|
|
NULL,
|
|
(HBRUSH)(GetSysColorBrush(COLOR_INFOBK)),
|
|
NULL,"ToolTipTT"
|
|
};
|
|
RegisterClass(&wcls);
|
|
}
|
|
m_szString = NULL;
|
|
m_bVisible = FALSE;
|
|
m_hwnd = CreateWindowEx(0, "ToolTipTT", "", WS_BORDER|WS_POPUP ,
|
|
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, hwnd, NULL , hInstance, NULL);
|
|
SetProp(m_hwnd, "CT", this);
|
|
ICONMETRICS im = {sizeof(ICONMETRICS)};
|
|
SystemParametersInfo( SPI_GETICONMETRICS, sizeof(ICONMETRICS), &im, 0);
|
|
m_hfont = CreateFontIndirect(&im.lfFont);
|
|
SendMessage( m_hwnd, WM_SETFONT, (WPARAM)m_hfont, FALSE);
|
|
}
|
|
CTip::~CTip()
|
|
{
|
|
if(m_hwnd) DestroyWindow( m_hwnd );
|
|
if(m_szString) delete[] m_szString;
|
|
DeleteObject( m_hfont );
|
|
}
|
|
|
|
void CTip::Show( char* szText, HWND hParentWnd, POINT* pPos)
|
|
{
|
|
BOOL ERASE = !(m_bVisible && szText && m_szString && !strcmp(szText,m_szString));
|
|
if(ERASE)
|
|
{
|
|
if(m_szString) delete[]m_szString;
|
|
m_szString = NULL;
|
|
if(szText && *szText)
|
|
m_szString = strcpy( new char[lstrlen(szText) +1], szText);
|
|
}
|
|
if(m_szString)
|
|
{
|
|
m_hParentWnd = hParentWnd;
|
|
SIZE size;
|
|
HDC dc = GetDC( m_hwnd );
|
|
HFONT hOldF = SelectObject( dc, m_hfont);
|
|
GetTextExtentPoint32( dc, m_szString, strlen(m_szString), &size);
|
|
SelectObject( dc, hOldF);
|
|
ReleaseDC( m_hwnd, dc );
|
|
if(pPos) MoveWindow(m_hwnd,pPos->x,pPos->y,size.cx+4,size.cy+4,TRUE);
|
|
else
|
|
{
|
|
POINT p;
|
|
GetCursorPos( &p );
|
|
MoveWindow(m_hwnd,p.x+12,p.y+20,size.cx+4,size.cy+4,TRUE);
|
|
}
|
|
SetWindowText( m_hwnd, m_szString);
|
|
InvalidateRect( m_hwnd, NULL, ERASE);
|
|
if(!m_bVisible)
|
|
{
|
|
m_bVisible = TRUE;
|
|
ShowWindow(m_hwnd,SW_SHOWNA);
|
|
}
|
|
}
|
|
else if(m_bVisible)
|
|
{
|
|
ReleaseCapture();
|
|
ShowWindow(m_hwnd,SW_HIDE);
|
|
m_bVisible = FALSE;
|
|
}
|
|
}
|
|
|
|
void CTip::Test( HWND hParentWnd, LPARAM mousepos)
|
|
{
|
|
POINT p = {LOWORD(mousepos), HIWORD(mousepos)};
|
|
RECT r;
|
|
GetClientRect(hParentWnd,&r);
|
|
if(!PtInRect(&r,p) && m_bVisible)
|
|
Show( NULL, hParentWnd);
|
|
}
|
|
|
|
LONG CALLBACK CTip::SWProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
|
|
{
|
|
CTip* ct = (CTip*)GetProp( hwnd, "CT" );
|
|
if(ct) return ct->WProc( hwnd, msg, wp, lp );
|
|
else return DefWindowProc( hwnd, msg, wp, lp );
|
|
}
|
|
|
|
LONG CALLBACK CTip::WProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
|
|
{
|
|
switch(msg)
|
|
{
|
|
case WM_DESTROY: m_hwnd = NULL; return DefWindowProc( hwnd, msg, wp, lp );
|
|
case WM_LBUTTONUP: case WM_RBUTTONUP:
|
|
case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_RBUTTONDOWN:
|
|
if(m_bVisible)
|
|
{
|
|
POINT p = { LOWORD(lp), HIWORD(lp) };
|
|
MapWindowPoints( m_hwnd, m_hParentWnd, &p, 1 );
|
|
SendMessage(m_hParentWnd, msg, wp, p.x |(p.y<<16));
|
|
}
|
|
break;
|
|
case WM_PAINT:
|
|
{
|
|
SetCapture(hwnd);
|
|
RECT r;
|
|
GetClientRect(hwnd, &r);
|
|
r.top = r.left = 1;
|
|
PAINTSTRUCT ps;
|
|
HDC dc = BeginPaint(hwnd, &ps);
|
|
HFONT hOldF = SelectObject( dc, m_hfont);
|
|
SetTextColor( dc, GetSysColor( COLOR_INFOTEXT ));
|
|
SetBkMode( dc, TRANSPARENT );
|
|
DrawText( dc, m_szString, strlen(m_szString), &r, DT_WORDBREAK|DT_EXPANDTABS);
|
|
SelectObject( dc, hOldF);
|
|
EndPaint(hwnd,&ps);
|
|
}
|
|
break;
|
|
default:
|
|
return DefWindowProc( hwnd, msg, wp, lp );
|
|
}
|
|
return 0;
|
|
}
|