2025-11-27 16:46:48 +09:00

205 lines
4.4 KiB
C++

// OXStaticMenuItem.cpp : implementation file
//
#include "stdafx.h"
#include "OXStaticMenuItem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COXStaticMenuItem
COXStaticMenuItem::COXStaticMenuItem()
{
m_bPressedDown=FALSE;
m_clrActive=RGB(192,0,0);
m_clrNormalText=GetTextColor();
}
COXStaticMenuItem::~COXStaticMenuItem()
{
if(::IsWindow(GetSafeHwnd()))
DestroyWindow();
}
BEGIN_MESSAGE_MAP(COXStaticMenuItem, COXStaticText)
//{{AFX_MSG_MAP(COXStaticMenuItem)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(HWM_MOUSEENTER, OnMouseEnter)
ON_MESSAGE(HWM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COXStaticMenuItem message handlers
static BOOL bIsCreating=FALSE;
int COXStaticMenuItem::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
bIsCreating=TRUE;
if(COXStaticText::OnCreate(lpCreateStruct)==-1)
return -1;
m_MouseSpy.HookWindow(this);
// call this function in oder to get HWM_MOUSEENTER and HWM_MOUSELEAVE messages
m_MouseSpy.InstallSpy();
return 0;
}
void COXStaticMenuItem::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
if(!bIsCreating)
{
m_MouseSpy.HookWindow(this);
// call this function in oder to get HWM_MOUSEENTER and
// HWM_MOUSELEAVE messages
m_MouseSpy.InstallSpy();
}
COXStaticText::PreSubclassWindow();
}
LONG COXStaticMenuItem::OnMouseEnter(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
CWnd* pParentWnd=GetParent();
ASSERT(pParentWnd);
CRect rect;
GetWindowRect(rect);
rect.InflateRect(1,1,0,0);
pParentWnd->ScreenToClient(rect);
MoveWindow(rect);
m_clrNormalText=GetTextColor();
SetTextColor(m_clrActive,TRUE);
NotifyParent(SMIN_ACTIVATED);
return (LONG)0;
}
LONG COXStaticMenuItem::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
CWnd* pParentWnd=GetParent();
ASSERT(pParentWnd);
CRect rect;
GetWindowRect(rect);
if(m_bPressedDown)
{
rect.OffsetRect(-2,-2);
m_bPressedDown=FALSE;
}
rect.DeflateRect(1,1,0,0);
pParentWnd->ScreenToClient(rect);
MoveWindow(rect);
SetTextColor(m_clrNormalText,TRUE);
NotifyParent(SMIN_DEACTIVATED);
return (LONG)0;
}
void COXStaticMenuItem::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd* pParentWnd=GetParent();
ASSERT(pParentWnd);
CRect rect;
GetWindowRect(rect);
rect.OffsetRect(2,2);
pParentWnd->ScreenToClient(rect);
MoveWindow(rect);
m_bPressedDown=TRUE;
COXStaticText::OnLButtonDown(nFlags, point);
}
void COXStaticMenuItem::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bPressedDown)
{
CWnd* pParentWnd=GetParent();
ASSERT(pParentWnd);
CRect rect;
GetWindowRect(rect);
rect.OffsetRect(-2,-2);
pParentWnd->ScreenToClient(rect);
MoveWindow(rect);
m_bPressedDown=FALSE;
NotifyParent(SMIN_CLICKED);
}
COXStaticText::OnLButtonUp(nFlags, point);
}
void COXStaticMenuItem::SetProperties(COLORREF clrText/*=::GetSysColor(COLOR_BTNTEXT)*/,
COLORREF clrBack/*=::GetSysColor(COLOR_BTNFACE)*/,
COLORREF clrActive/*=RGB(192,0,0)*/,
int nFontHeight/*=12*/,
int nFontWeight/*=FW_NORMAL*/,
CString sFontName/*=_T("MS Sans Serif")*/,
BOOL bEmboss/*=TRUE*/,
int nHorzAlignment/*=OX_ALIGNHORZ_LEFT*/,
int nVertAlignment/*=OX_ALIGNVERT_CENTER*/)
{
SetTextColor(clrText);
SetBkColor(clrBack);
m_clrActive=clrActive;
LOGFONT lf;
if(GetLogFont(&lf))
{
lf.lfHeight=nFontHeight;
lf.lfWeight=nFontWeight;
SetLogFont(&lf);
}
SetFontName(sFontName);
SetEmboss(bEmboss);
SetHorzAlignment(nHorzAlignment);
SetVertAlignment(nVertAlignment);
SetCharSet(ANSI_CHARSET,TRUE);
}
void COXStaticMenuItem::NotifyParent(int nEventID)
{
ASSERT(IsWindow(GetSafeHwnd()));
ASSERT(nEventID==SMIN_ACTIVATED || nEventID==SMIN_DEACTIVATED ||
nEventID==SMIN_CLICKED);
CWnd* pParentWnd=GetParent();
ASSERT(pParentWnd!=NULL);
NMHDR nmhdr;
nmhdr.code=nEventID;
nmhdr.hwndFrom=GetSafeHwnd();
nmhdr.idFrom=GetDlgCtrlID();
pParentWnd->SendMessage(WM_NOTIFY,nmhdr.idFrom,(LPARAM)&nmhdr);
}