зеркало из https://github.com/mozilla/gecko-dev.git
173 строки
3.8 KiB
C++
173 строки
3.8 KiB
C++
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||
|
*
|
||
|
* The contents of this file are subject to the Netscape Public License
|
||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||
|
* http://www.mozilla.org/NPL/
|
||
|
*
|
||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||
|
* for the specific language governing rights and limitations under the
|
||
|
* NPL.
|
||
|
*
|
||
|
* The Initial Developer of this code under the NPL is Netscape
|
||
|
* Communications Corporation. Portions created by Netscape are
|
||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||
|
* Reserved.
|
||
|
*/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "tip.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
#define COL_LEFT_MARGIN ((m_cxChar+1)/2)
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CTip
|
||
|
|
||
|
CTip::CTip()
|
||
|
{
|
||
|
m_hFont = NULL;
|
||
|
m_dwStyle = 0;
|
||
|
m_iCSID = CS_LATIN1;
|
||
|
}
|
||
|
|
||
|
CTip::~CTip()
|
||
|
{
|
||
|
DestroyWindow();
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CTip, CWnd)
|
||
|
ON_WM_PAINT()
|
||
|
ON_WM_NCHITTEST()
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CTip message handlers
|
||
|
|
||
|
void CTip::OnPaint()
|
||
|
{
|
||
|
CRect rect;
|
||
|
HFONT OldFont = NULL;
|
||
|
CPaintDC dc(this); // device context for painting
|
||
|
|
||
|
if (m_hFont) {
|
||
|
OldFont = (HFONT) dc.SelectObject(m_hFont);
|
||
|
}
|
||
|
GetClientRect(&rect);
|
||
|
|
||
|
COLORREF crInfoBack, crInfoFore;
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
if ( sysInfo.m_bWin4 ) {
|
||
|
crInfoFore = GetSysColor( COLOR_INFOTEXT );
|
||
|
crInfoBack = GetSysColor( COLOR_INFOBK );
|
||
|
}
|
||
|
else
|
||
|
#endif
|
||
|
{
|
||
|
crInfoBack = RGB(255,255,225);
|
||
|
crInfoFore = RGB( 0, 0, 0);
|
||
|
}
|
||
|
|
||
|
// paint background and text
|
||
|
CBrush brush;
|
||
|
brush.CreateSolidBrush(crInfoBack);
|
||
|
dc.FillRect(&rect, &brush);
|
||
|
dc.SetBkMode(TRANSPARENT);
|
||
|
|
||
|
CSize TextSize = CIntlWin::GetTextExtent(0, dc.m_hDC, csTitle, csTitle.GetLength());
|
||
|
dc.SetTextColor(crInfoFore);
|
||
|
rect.left += COL_LEFT_MARGIN;
|
||
|
CIntlWin::DrawText(m_iCSID, dc.m_hDC, (LPSTR) (LPCSTR) csTitle, -1, &rect, DT_LEFT|DT_NOPREFIX);
|
||
|
|
||
|
if (OldFont) {
|
||
|
dc.SelectObject(OldFont);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CTip::Create()
|
||
|
{
|
||
|
DWORD dwStyleEx = 0;
|
||
|
DWORD dwStyle = WS_POPUP|WS_BORDER;
|
||
|
LPCTSTR lpszClass = AfxRegisterWndClass(CS_SAVEBITS);
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
if ( sysInfo.m_bWin4 ) {
|
||
|
dwStyleEx |= WS_EX_TOOLWINDOW;
|
||
|
}
|
||
|
#endif
|
||
|
if (!CreateEx( dwStyleEx, lpszClass, _T(""), dwStyle,
|
||
|
0, 0, 0, 0, NULL, NULL)) {
|
||
|
TRACE0("COULDN'T CREATE TIP WINDOW\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CTip::Show( HWND owner, int x, int y, int cx, int cy,
|
||
|
LPCSTR text, DWORD dwStyle, HFONT font )
|
||
|
{
|
||
|
m_dwStyle = dwStyle;
|
||
|
m_hFont = font;
|
||
|
|
||
|
RECT rect;
|
||
|
CClientDC dc(this);
|
||
|
HFONT OldFont = NULL;
|
||
|
|
||
|
if (m_hFont) {
|
||
|
OldFont = (HFONT) dc.SelectObject(m_hFont);
|
||
|
}
|
||
|
TEXTMETRIC tm;
|
||
|
dc.GetTextMetrics ( &tm );
|
||
|
m_cxChar = tm.tmAveCharWidth;
|
||
|
|
||
|
::GetWindowRect(owner, &rect);
|
||
|
x += rect.left;
|
||
|
y += rect.top;
|
||
|
cy += 1;
|
||
|
|
||
|
csTitle = text;
|
||
|
|
||
|
// calc window size
|
||
|
SIZE TextSize = CIntlWin::GetTextExtent(m_iCSID, dc.m_hDC, csTitle, csTitle.GetLength());
|
||
|
TextSize.cx += COL_LEFT_MARGIN * 2 + 1;
|
||
|
|
||
|
if ( m_dwStyle & NSTTS_RIGHT ) {
|
||
|
x = x + cx - TextSize.cx;
|
||
|
} else {
|
||
|
x--;
|
||
|
}
|
||
|
|
||
|
// Bump onto screen, if necessary.
|
||
|
int xScreenRight = ::GetSystemMetrics(SM_CXSCREEN);
|
||
|
int yScreenBottom = ::GetSystemMetrics(SM_CYSCREEN);
|
||
|
if (x + TextSize.cx > xScreenRight)
|
||
|
x -= x + TextSize.cx - xScreenRight;
|
||
|
if (y + cy > yScreenBottom)
|
||
|
y -= y + cy - yScreenBottom;
|
||
|
|
||
|
SetWindowText(csTitle);
|
||
|
if ( csTitle.GetLength() && ( (TextSize.cx > cx) || (m_dwStyle & NSTTS_ALWAYSSHOW)) ) {
|
||
|
SetWindowPos(&wndTopMost, x, y, TextSize.cx, cy, SWP_SHOWWINDOW|SWP_NOACTIVATE);
|
||
|
UpdateWindow();
|
||
|
}
|
||
|
if (OldFont) {
|
||
|
dc.SelectObject(OldFont);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CTip::Hide()
|
||
|
{
|
||
|
ShowWindow( SW_HIDE );
|
||
|
}
|
||
|
|
||
|
UINT CTip::OnNcHitTest(CPoint point)
|
||
|
{
|
||
|
return (UINT) HTTRANSPARENT;
|
||
|
}
|