gecko-dev/cmd/winfe/tip.cpp

173 строки
3.8 KiB
C++
Executable File

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