⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kbutton.cpp

📁 vc编写的
💻 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 + -