reman3/Rayman_X/cpa/Appli/WinS2B/TipWin.cpp

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;
}