📄 kbutton.cpp
字号:
/*
Copyright (c) 1999, kSet Lab
Author: Konstantin Bukreev
E-mail: konstantin@mail.primorye.ru
Created: 15.10.99 20:36:59
Version: 1.0.0
kButton.cpp : Implementation of _kButton
*/
#include "stdafx.h"
#include "KSetButton.h"
#include "kButton.h"
#include "About.h"
#pragma warning (disable : 4244)
#include "HSVModel.h"
#pragma warning (default : 4244)
/////////////////////////////////////////////////////////////////////////////
// _kButton
STDMETHODIMP _kButton::AboutBox()
{
_About about;
about.DoModal();
return S_OK;
}
STDMETHODIMP _kButton::DoClick(VARIANT_BOOL bAnimate)
{
if (m_Status == stDisabled) return S_FALSE;
if (bAnimate)
{
SendMessage(WM_KEYDOWN, VK_RETURN, 0);
CComQIPtr<_IAnimationClick> pI(GetControllingUnknown());
pI->_StartThread(100);
}
else
{
FireClick();
}
return S_OK;
}
STDMETHODIMP _kButton::InitNew()
{
Free();
if (FAILED(GetAmbientPalette(m_hPal)))
m_hPal = 0;
if (FAILED(GetAmbientBackColor(m_clrBackColor)))
m_clrBackColor = 0x80000000 | COLOR_BTNFACE;
UpdateColors(); //m_clrHighlightColor, m_clrShadowColor;
m_clrBorderColor = 0x80000000 | COLOR_WINDOWTEXT;
COLORREF clr;
HRESULT hr = GetAmbientForeColor(clr);
if (SUCCEEDED(hr))
m_clrTextHoverColor = m_clrTextPushColor = m_clrTextStaticColor = clr;
else
m_clrTextHoverColor = m_clrTextPushColor = m_clrTextStaticColor = 0x80000000 | COLOR_BTNTEXT;
m_sPictureSpacing = 5;
m_bShowStateAsFlat = FALSE;
m_bEnabled = m_bHoverEnabled = true;
m_ShowFocus = kDrawRect;
m_Alignment = kLeft;
m_AppearancePush = m_AppearanceStatic = k3dLow;
m_AppearanceHover = k3dHigh;
m_bstrTextStatic = L"Static";
m_bstrTextPush = L"Push";
m_bstrTextHover = L"Hover";
m_bFocused = false;
m_Status = stStatic;
m_AccelSymbol = 0;
{
static FONTDESC _fontdesc = {sizeof(FONTDESC), L"MS Sans Serif", FONTSIZE(9), FW_NORMAL, ANSI_CHARSET, FALSE, FALSE, FALSE};
CComPtr<IFontDisp> pF;
OleCreateFontIndirect(&_fontdesc, __uuidof(IFont), (void**)&pF);
putref_FontStatic(pF);
putref_FontHover(pF);
putref_FontPush(pF);
}
m_pPictureHover.Release();
m_pPictureStatic.Release();
m_pPicturePush.Release();
m_pPictureDisabled.Release();
return IPersistStreamInitImpl<_kButton>::InitNew();
}
STDMETHODIMP _kButton::DoVerb(LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
{
if (iVerb == 1)
iVerb = OLEIVERB_PROPERTIES;
else if (iVerb == 2)
AboutBox();
return IOleObjectImpl<_kButton>::DoVerb(iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect);
}
STDMETHODIMP _kButton::OnMnemonic(LPMSG pMsg)
{
pMsg;
//if ((pMsg->message == WM_SYSKEYDOWN) && (pMsg->wParam == m_AccelSymbol))
DoClick(VARIANT_TRUE);
return S_OK;
}
STDMETHODIMP _kButton::GetControlInfo( LPCONTROLINFO pCI )
{
static ACCEL accel = {FALT | FVIRTKEY, 0, 1};
if (!m_AccelSymbol)
return S_FALSE;
accel.key = m_AccelSymbol;
if (m_hAccel)
DestroyAcceleratorTable(m_hAccel);
m_hAccel = CreateAcceleratorTable(&accel, 1);
pCI->hAccel = m_hAccel;
pCI->cAccel = 1;
pCI->cb = sizeof (CONTROLINFO);
pCI->dwFlags = 0;
return S_OK;
}
HRESULT _kButton::FireOnChanged (DISPID dispID)
{
if (DISPID_ENABLED == dispID)
{
m_Status = m_bEnabled ? m_Status : stDisabled;
}
else if (DISPID_BACKCOLOR == dispID)
{
BOOL bRunMode = TRUE;
GetAmbientUserMode(bRunMode);
if (!bRunMode)
{
UpdateColors();
}
}
else if (dispidTextStatic == dispID)
{
m_AccelSymbol = GetAccelSymbol(m_bstrTextStatic.m_str, m_bstrTextStatic.Length());
if (m_AccelSymbol)
{
CComQIPtr<IOleControlSite, &IID_IOleControlSite> spSite(m_spClientSite);
if (spSite)
spSite->OnControlInfoChanged();
}
}
return CComControl<_kButton>::FireOnChanged(dispID);
}
LRESULT _kButton::OnSetFocus(UINT, WPARAM, LPARAM, BOOL& bHandled)
{
if (m_Status == stDisabled) return 0;
m_bFocused = true;
if ((m_ShowFocus == kSetHover) || (m_ShowFocus == kBoth))
m_Status = stHover;
if (m_ShowFocus != kNone)
FireViewChange();
bHandled = FALSE;
return 0;
}
LRESULT _kButton::OnKillFocus(UINT, WPARAM, LPARAM, BOOL& bHandled)
{
if (m_Status == stDisabled) return 0;
m_bFocused = false;
if (m_ShowFocus != kNone)
{
if ((m_ShowFocus == kSetHover) || (m_ShowFocus == kBoth))
m_Status = stStatic;
FireViewChange();
}
bHandled = FALSE;
return 0;
}
LRESULT _kButton::OnLButtonDown(UINT, WPARAM, LPARAM, BOOL&)
{
if (m_Status == stDisabled) return 0;
m_Status = stPush;
FireViewChange();
return 0;
}
LRESULT _kButton::OnLButtonUP(UINT, WPARAM, LPARAM, BOOL&)
{
if (m_Status == stDisabled) return 0;
m_Status = stStatic;
FireViewChange();
FireClick();
return 0;
}
LRESULT _kButton::OnKeyDown(UINT, WPARAM wParam, LPARAM, BOOL&)
{
if (m_Status == stDisabled) return 0;
if ((wParam == VK_RETURN) || (wParam == VK_SPACE))
{
if (m_Status != stPush)
{
m_Status = stPush;
FireViewChange();
}
}
return 0;
}
LRESULT _kButton::OnKeyUp(UINT, WPARAM wParam, LPARAM, BOOL&)
{
if (m_Status == stDisabled) return 0;
if ((wParam == VK_RETURN) || (wParam == VK_SPACE))
{
m_Status = stStatic;
FireViewChange();
FireClick();
}
return 0;
}
LRESULT _kButton::OnSize(UINT, WPARAM, LPARAM, BOOL&)
{
if (m_hCacheBitmap)
{
DeleteObject(m_hCacheBitmap);
m_hCacheBitmap = 0;
}
return 0;
}
LRESULT _kButton::OnDestroy(UINT, WPARAM, LPARAM, BOOL&)
{
Free();
return 0;
}
/////////////////////////
//private utilites
void _kButton::UpdateColors()
{
if (m_clrBackColor != (0x80000000 | COLOR_BTNFACE))
{
COLORREF clr;
OleTranslateColor(m_clrBackColor, m_hPal, &clr);
Get3DColors(clr, m_clrShadowColor, m_clrHighlightColor);
}
else
{
m_clrShadowColor = 0x80000000 | COLOR_3DSHADOW;
m_clrHighlightColor = 0x80000000 | COLOR_3DHILIGHT;
}
}
void _kButton::Get3DColors (COLORREF clr, COLORREF& clrShadow, COLORREF& clrHighlight)
{
_HSLModel hsl(clr);
_HSLModel _hs1 = hsl;
BYTE lum = hsl.luminance();
hsl.luminance (lum / 3 * 2);
_hs1.luminance (lum + ((240 - lum) / 2));
clrShadow = hsl.rgb();
clrHighlight = _hs1.rgb();
}
void _kButton::Free()
{
m_pUnkMouseMove.Release();
m_pUnkAnimClick.Release();
if (m_hCacheBitmap)
{
DeleteObject(m_hCacheBitmap);
m_hCacheBitmap = 0;
}
if (m_hAccel)
{
DestroyAcceleratorTable(m_hAccel);
m_hAccel = 0;
}
}
wchar_t _kButton::GetAccelSymbol(wchar_t* txt, int length)
{
int i = 0;
while (i < length)
{
if (txt[i] == L'&')
{
i++;
if (txt[i] != L'&')
return (wchar_t)CharUpper((TCHAR*)txt[i]); //perhaps dangerous !
}
i++;
}
return 0;
}
void _kButton::DetectTrackMouse()
{
m_pfTrackMouseEvent = (PTRF_TrackMouseEvent)GetProcAddress (GetModuleHandle(_T("user32")), _T("TrackMouseEvent"));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -