mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1244 lines
44 KiB
1244 lines
44 KiB
/*************************************************************************/
|
|
/* Copyright (C) 1999 Microsoft Corporation */
|
|
/* File: MSMFSldr.cpp */
|
|
/* Description: Implementation of CMSMFSldr */
|
|
/* Author: David Janecek */
|
|
/*************************************************************************/
|
|
#include "stdafx.h"
|
|
#include "MSMFCnt.h"
|
|
#include "MSMFSldr.h"
|
|
|
|
#define RECTWIDTH(lpRect) ((lpRect)->right - (lpRect)->left)
|
|
#define RECTHEIGHT(lpRect) ((lpRect)->bottom - (lpRect)->top)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMSMFSldr
|
|
|
|
/*************************************************************************/
|
|
/* Function: CMSMFSldr */
|
|
/*************************************************************************/
|
|
CMSMFSldr::CMSMFSldr(){
|
|
|
|
Init();
|
|
for(INT i = 0; i < cgMaxSldrStates; i++){
|
|
|
|
m_pThumbBitmap[i] = new CBitmap;
|
|
m_pBackBitmap[i] = new CBitmap;
|
|
}/* end of for loop */
|
|
|
|
}/* end of function CMSMFSldr */
|
|
|
|
/*************************************************************************/
|
|
/* Function: Init */
|
|
/* Description: Initializes variable states. */
|
|
/*************************************************************************/
|
|
void CMSMFSldr::Init(){
|
|
|
|
m_nEntry = SldrState::Static;
|
|
m_fValue =0.2f;
|
|
m_fMin =0;
|
|
m_fMax = 100;
|
|
m_lXOffset = 5;
|
|
m_lYOffset = 2;
|
|
m_fKeyIncrement = 1.0f;
|
|
m_fKeyDecrement = 1.0f;
|
|
m_lThumbWidth = 8;
|
|
m_clrBackColor = ::GetSysColor(COLOR_BTNFACE);
|
|
|
|
::ZeroMemory(&m_rcThumb, sizeof(RECT));
|
|
}/* end of function Init */
|
|
|
|
/*************************************************************************/
|
|
/* Function: ~CMSMFSldr */
|
|
/* Description: Cleanup the stuff we allocated here rest will be done */
|
|
/* in the button destructor. */
|
|
/*************************************************************************/
|
|
CMSMFSldr::~CMSMFSldr(){
|
|
|
|
ATLTRACE(TEXT("In the SLIDER Object destructor!\n"));
|
|
for(INT i = 0; i < cgMaxSldrStates; i++){
|
|
|
|
delete m_pThumbBitmap[i];
|
|
delete m_pBackBitmap[i];
|
|
m_pBackBitmap[i] = NULL;
|
|
m_pThumbBitmap[i] = NULL;
|
|
}/* end of for loop */
|
|
|
|
Init();
|
|
}/* end of function CMSMFSldr */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnDraw */
|
|
/* Description: Does the basic drawing */
|
|
/* First draws the background the the thumb at the specific position. */
|
|
/*************************************************************************/
|
|
HRESULT CMSMFSldr::OnDraw(ATL_DRAWINFO& di){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
BOOL bRet = TRUE;
|
|
HDC hdc = di.hdcDraw;
|
|
RECT rcClient = *(RECT*)di.prcBounds;
|
|
|
|
HPALETTE hNewPal = m_pBackBitmap[m_nEntry]->GetPal();;
|
|
|
|
if (::IsWindow(m_hWnd)){ // is not windowless
|
|
|
|
CBitmap::SelectRelizePalette(di.hdcDraw, hNewPal);
|
|
}/* end of if statement */
|
|
|
|
|
|
// DRAW THE BACKGROUND
|
|
if (::IsWindow(m_hWnd) && m_blitType != DISABLE) {
|
|
|
|
COLORREF clr;
|
|
::OleTranslateColor (m_clrBackColor, hNewPal, &clr);
|
|
|
|
// fill background of specific color
|
|
HBRUSH hbrBack = ::CreateSolidBrush(clr);
|
|
|
|
if(NULL == hbrBack){
|
|
|
|
hr = E_FAIL;
|
|
return(hr);
|
|
}/* end of if statement */
|
|
|
|
//::FillRect(hdc, &rcClient, hbrBack);
|
|
::FillRect(di.hdcDraw, (LPRECT)di.prcBounds, hbrBack);
|
|
::DeleteObject(hbrBack);
|
|
}/* end of if statement */
|
|
|
|
if (m_pBackBitmap[m_nEntry]){
|
|
|
|
bRet = m_pBackBitmap[m_nEntry]->PaintTransparentDIB(hdc, &rcClient,
|
|
&rcClient);
|
|
}
|
|
else {
|
|
|
|
COLORREF clr;
|
|
::OleTranslateColor (m_clrBackColor, m_pBackBitmap[m_nEntry]->GetPal(), &clr);
|
|
|
|
HBRUSH hbrBack = ::CreateSolidBrush(clr);
|
|
::FillRect(hdc, &rcClient, hbrBack);
|
|
::DeleteObject(hbrBack);
|
|
}/* end of if statement */
|
|
|
|
// DRAW THE THUMB
|
|
#if 0 // just for debugging purposes
|
|
COLORREF clr = RGB(0xff, 0, 0);
|
|
|
|
HBRUSH hbrBack = ::CreateSolidBrush(clr);
|
|
::FillRect(hdc, &m_rcThumb, hbrBack);
|
|
::DeleteObject(hbrBack);
|
|
#endif
|
|
|
|
if (m_pBackBitmap[m_nEntry]){
|
|
|
|
RECT rcThumb = m_rcThumb;
|
|
|
|
if(!m_bWndLess){
|
|
|
|
ATLASSERT(::IsWindow(m_hWnd));
|
|
|
|
::OffsetRect(&rcThumb, -m_rcPos.left, -m_rcPos.top);
|
|
}/* end of if statement */
|
|
|
|
bRet = m_pThumbBitmap[m_nEntry]->PaintTransparentDIB(hdc, &rcThumb,
|
|
&rcThumb);
|
|
} /* end of if statement */
|
|
|
|
hr = GetFocus();
|
|
|
|
// THIS ASSUMES WE ARE REPAINTING THE WHOLE CONTROL
|
|
// WHICH IS WHAT ATL AT THIS INCARNATION DOES
|
|
if(S_OK == hr){
|
|
|
|
::DrawFocusRect(hdc, &rcClient);
|
|
}/* end of if statement */
|
|
|
|
if(!bRet){
|
|
|
|
hr = E_UNEXPECTED;
|
|
}/* end of if statement */
|
|
|
|
return (hr);
|
|
}/* end of function OnDraw */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnSize */
|
|
/* Description: Handles the onsize message if we are self contained. */
|
|
/*************************************************************************/
|
|
LRESULT CMSMFSldr::OnSize(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
|
|
|
|
bHandled = true;
|
|
|
|
RecalculateTumbPos();
|
|
|
|
//ATLASSERT(FALSE); // move the code from SetObjectRects in here
|
|
|
|
return 0;
|
|
}/* end of function OnSize */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnDispChange */
|
|
/* Description: Forwards this message to all the controls. */
|
|
/*************************************************************************/
|
|
LRESULT CMSMFSldr::OnDispChange(UINT uMsg, WPARAM wParam, LPARAM lParam,
|
|
BOOL& bHandled){
|
|
|
|
LONG lRes =0;
|
|
|
|
long cBitsPerPixel = (long) wParam;
|
|
long cxScreen = LOWORD(lParam);
|
|
long cyScreen = HIWORD(lParam);
|
|
|
|
for (int i=0; i<cgMaxSldrStates; i++) {
|
|
if (m_pThumbBitmap[i])
|
|
m_pThumbBitmap[i]->OnDispChange(cBitsPerPixel, cxScreen, cyScreen);
|
|
}
|
|
for (i=0; i<cgMaxSldrStates; i++) {
|
|
if (m_pBackBitmap[i])
|
|
m_pBackBitmap[i]->OnDispChange(cBitsPerPixel, cxScreen, cyScreen);
|
|
}
|
|
|
|
return(lRes);
|
|
}/* end of function OnDispChange */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnSetFocus */
|
|
/* Description: If we are in disabled state SetFocus(false) */
|
|
/*************************************************************************/
|
|
LRESULT CMSMFSldr::OnSetFocus(UINT msg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
|
|
|
|
if (m_nEntry == SldrState::Disabled){
|
|
|
|
if(GetFocus() == S_OK){
|
|
|
|
SetFocus(false);
|
|
}/* end of if statement */
|
|
|
|
FireViewChange();
|
|
return(-1);
|
|
}/* end of if statement */
|
|
|
|
FireViewChange();
|
|
return 0;
|
|
}/* end of function OnSetFocus */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnKillFocus */
|
|
/* Description: If we are in disabled state SetFocus(false) */
|
|
/*************************************************************************/
|
|
LRESULT CMSMFSldr::OnKillFocus(UINT msg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
|
|
|
|
FireViewChange();
|
|
return 0;
|
|
}/* end of function OnKillFocus */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnButtonDown */
|
|
/* Description: Handles when buttons is selected. Captures the mouse */
|
|
/* movents (supported for windowless, via interfaces). */
|
|
/*************************************************************************/
|
|
LRESULT CMSMFSldr::OnButtonDown(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
|
|
|
|
if (m_nEntry == SldrState::Disabled){
|
|
|
|
return 0;
|
|
}/* end of if statement */
|
|
|
|
LONG xPos = GET_X_LPARAM(lParam);
|
|
LONG yPos = GET_Y_LPARAM(lParam);
|
|
|
|
if(PtOnSlider(xPos, yPos)){
|
|
|
|
if(SldrState::Hover != m_nEntry){
|
|
// in hover case we already have captured the mouse, so do not do
|
|
// that again
|
|
SetCapture(true); // capture the mouse messages
|
|
}/* end of if statement */
|
|
|
|
OffsetX(xPos);
|
|
SetThumbPos(xPos);
|
|
SetSliderState(SldrState::Push);
|
|
}/* end of if statement */
|
|
|
|
Fire_OnMouseDown();
|
|
|
|
return 0;
|
|
}/* end of function OnButtonDown */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnButtonUp */
|
|
/* Description: Releases the capture, updates the button visual state, */
|
|
/* and if release on the buttons image fire the event. */
|
|
/*************************************************************************/
|
|
LRESULT CMSMFSldr::OnButtonUp(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
|
|
|
|
LONG lRes = 0;
|
|
|
|
if (m_nEntry == SldrState::Disabled){
|
|
|
|
ForwardWindowMessage(WM_USER_FOCUS, (WPARAM) m_hWnd, 0, lRes);
|
|
ForwardWindowMessage(WM_USER_ENDHELP, (WPARAM) m_hWnd, 0, lRes);
|
|
|
|
return lRes;
|
|
}/* end of if statement */
|
|
|
|
|
|
LONG xPos = GET_X_LPARAM(lParam);
|
|
LONG yPos = GET_Y_LPARAM(lParam);
|
|
|
|
bool bOnButtonImage = PtOnSlider(xPos, yPos);
|
|
bool bFire = (m_nEntry == SldrState::Push);
|
|
|
|
if(bOnButtonImage){
|
|
|
|
SetSliderState(SldrState::Static); //change to static even
|
|
SetCapture(false); // release the capture of the mouse messages
|
|
}
|
|
else {
|
|
|
|
SetSliderState(SldrState::Static);
|
|
// do it only when we do not hower, if we hower, then keep the capture
|
|
SetCapture(false); // release the capture of the mouse messages
|
|
}/* end of if statement */
|
|
|
|
if (bFire){
|
|
|
|
if(bOnButtonImage){
|
|
|
|
OffsetX(xPos);
|
|
SetThumbPos(xPos);
|
|
Fire_OnClick();
|
|
}/* end of if statement */
|
|
}/* end of if statement */
|
|
|
|
Fire_OnMouseUp();
|
|
|
|
ForwardWindowMessage(WM_USER_FOCUS, (WPARAM) m_hWnd, 0, lRes);
|
|
ForwardWindowMessage(WM_USER_ENDHELP, (WPARAM) m_hWnd, 0, lRes);
|
|
|
|
return lRes;
|
|
}/* end of function OnButtonUp */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnMouseMove */
|
|
/* Description: Check if we were captured/pushed the do not do much, */
|
|
/* otherwise do the hit detection and see if we are in static or hower */
|
|
/* state. */
|
|
/*************************************************************************/
|
|
LRESULT CMSMFSldr::OnMouseMove(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
|
|
|
|
if (m_nEntry == SldrState::Disabled)
|
|
return 0;
|
|
|
|
LONG xPos = GET_X_LPARAM(lParam);
|
|
LONG yPos = GET_Y_LPARAM(lParam);
|
|
|
|
bool fPointOnSlider = PtOnSlider(xPos, yPos);
|
|
|
|
if (m_nEntry != SldrState::Push){
|
|
|
|
if(fPointOnSlider){
|
|
if(SldrState::Hover != m_nEntry || S_OK != GetCapture()){
|
|
|
|
SetCapture(true); // capture the mouse messages
|
|
SetSliderState(SldrState::Hover);
|
|
}/* end of if statement */
|
|
}
|
|
else {
|
|
|
|
if(SldrState::Static != m_nEntry){
|
|
|
|
SetCapture(false); // release the capture of the mouse messages
|
|
SetSliderState(SldrState::Static);
|
|
}/* end of if statement */
|
|
}/* end of if statement */
|
|
}
|
|
else {
|
|
if(fPointOnSlider){
|
|
|
|
OffsetX(xPos);
|
|
SetThumbPos(xPos);
|
|
FireViewChange();
|
|
}/* end of if statement */
|
|
}/* end of if statement */
|
|
|
|
return 0;
|
|
}/* end of function OnMouseMove */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnKeyDown */
|
|
/* Description: Depresses the button. */
|
|
/*************************************************************************/
|
|
LRESULT CMSMFSldr::OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam,
|
|
BOOL& bHandled){
|
|
|
|
bHandled = FALSE;
|
|
LONG lRes = 0;
|
|
|
|
switch(wParam){
|
|
|
|
case VK_RETURN:
|
|
case VK_SPACE:
|
|
case VK_LEFT:
|
|
case VK_RIGHT:
|
|
|
|
//SetSliderState(SldrState::Push);
|
|
bHandled = TRUE;
|
|
break;
|
|
}/* end of if statement */
|
|
return(lRes);
|
|
}/* end of function OnKeyDown */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OnKeyUp */
|
|
/* Description: Distrubutes the keyboard messages properly. */
|
|
/*************************************************************************/
|
|
LRESULT CMSMFSldr::OnKeyUp(UINT uMsg, WPARAM wParam, LPARAM lParam,
|
|
BOOL& bHandled){
|
|
|
|
LONG lRes = 0;
|
|
bHandled = FALSE;
|
|
FLOAT m_fTmpValue = m_fValue;
|
|
|
|
bool fFireClick = false;
|
|
|
|
switch(wParam){
|
|
|
|
case VK_RETURN:
|
|
case VK_SPACE:
|
|
fFireClick = true;
|
|
break;
|
|
|
|
case VK_LEFT: m_fValue -= m_fKeyDecrement; FitValue();
|
|
fFireClick = true;
|
|
break;
|
|
|
|
case VK_RIGHT: m_fValue += m_fKeyIncrement; FitValue();
|
|
fFireClick = true;
|
|
break;
|
|
}/* end of switch statement */
|
|
|
|
if(fFireClick){
|
|
|
|
RecalculateTumbPos();
|
|
|
|
Fire_OnClick(); // we clicked on it, it does not meen
|
|
// we did change the value of it
|
|
if(m_fTmpValue != m_fValue){
|
|
|
|
Fire_OnValueChange(m_fValue);
|
|
}/* end of if statement */
|
|
//SetSliderState(SldrState::Static);
|
|
|
|
bHandled = TRUE;
|
|
}/* end of if statement */
|
|
|
|
return(lRes);
|
|
}/* end of function OnKeyUp */
|
|
|
|
/*************************************************************/
|
|
/* Function: FitValue */
|
|
/* Description: Fits the xVal inside the params. */
|
|
/*************************************************************/
|
|
HRESULT CMSMFSldr::FitValue(){
|
|
|
|
if(m_fValue < m_fMin){
|
|
|
|
m_fValue = m_fMin;
|
|
}/* end of if statement */
|
|
|
|
if(m_fValue > m_fMax){
|
|
|
|
m_fValue = m_fMax;
|
|
}/* end of if statement */
|
|
|
|
return(S_OK);
|
|
}/* end of function FitValue */
|
|
|
|
/*************************************************************/
|
|
/* Name: SetObjectRects */
|
|
/* Description: Update thumbnail rect object is being moved */
|
|
/*************************************************************/
|
|
STDMETHODIMP CMSMFSldr::SetObjectRects(LPCRECT prcPos,LPCRECT prcClip){
|
|
// Call the default method first
|
|
IOleInPlaceObjectWindowlessImpl<CMSMFSldr>::SetObjectRects(prcPos, prcClip);
|
|
|
|
RecalculateTumbPos();
|
|
|
|
return UpdateTooltipRect(prcPos);
|
|
}/* end of function SetObjectRects */
|
|
|
|
/*************************************************************************/
|
|
/* Function: PutThumbImage */
|
|
/* Description: Sets the image to thumb. */
|
|
/*************************************************************************/
|
|
HRESULT CMSMFSldr::PutThumbImage(BSTR strFilename, int nEntry){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
m_bstrThumbFilename[nEntry] = strFilename;
|
|
|
|
// figure out if we need to gray out the image
|
|
|
|
bool fGrayOut = false;
|
|
|
|
if(SldrState::Disabled == nEntry){
|
|
|
|
fGrayOut = gcfGrayOut;
|
|
}/* end of if statement */
|
|
|
|
hr = m_pThumbBitmap[nEntry]->PutImage(strFilename, m_hRes, TRUE, m_blitType, NORMAL);
|
|
|
|
if(FAILED(hr)){
|
|
|
|
return(hr);
|
|
}/* end of if statement */
|
|
|
|
if(nEntry == m_nEntry ){
|
|
// we are updating image that is being used, refresh it
|
|
ATLTRACE2(atlTraceWindowing, 20, TEXT("Redrawing the image\n"));
|
|
InvalidateRgn(); // our helper function
|
|
}/* end of if statement */
|
|
|
|
return(hr);
|
|
}/* end of function PutThumbImage */
|
|
|
|
/*************************************************************************/
|
|
/* Function: PutBackImage */
|
|
/* Description: Sets the image to Back. */
|
|
/*************************************************************************/
|
|
HRESULT CMSMFSldr::PutBackImage(BSTR strFilename, int nEntry){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
m_bstrBackFilename[nEntry] = strFilename;
|
|
|
|
bool fGrayOut = false;
|
|
|
|
if(SldrState::Disabled == nEntry){
|
|
|
|
fGrayOut = gcfGrayOut; // TODO some more complex stuff if we get custom disable
|
|
// images
|
|
}/* end of if statement */
|
|
|
|
hr = m_pBackBitmap[nEntry]->PutImage(strFilename, m_hRes, TRUE, m_blitType, NORMAL);
|
|
|
|
if(FAILED(hr)){
|
|
|
|
return(hr);
|
|
}/* end of if statement */
|
|
|
|
if(nEntry == m_nEntry ){
|
|
// we are updating image that is being used, refresh it
|
|
ATLTRACE2(atlTraceWindowing, 20, TEXT("Redrawing the image\n"));
|
|
InvalidateRgn(); // our helper function
|
|
}/* end of if statement */
|
|
|
|
return(hr);
|
|
}/* end of function PutBackImage */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_Value */
|
|
/* Description: Get the current value. */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_Value(float *pVal){
|
|
|
|
*pVal = m_fValue;
|
|
|
|
return S_OK;
|
|
}/* end of function get_Value */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_Value */
|
|
/* Description: Sets the current value */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_Value(float newVal){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if(newVal < m_fMin || newVal > m_fMax){
|
|
|
|
hr = E_INVALIDARG;
|
|
return (hr);
|
|
}/* end of if statement */
|
|
|
|
if(newVal == m_fValue){
|
|
|
|
hr = S_FALSE;
|
|
return(hr);
|
|
}/* end of if statement */
|
|
|
|
m_fValue = newVal;
|
|
|
|
RecalculateTumbPos(); // apply the new position to the tumb rect and invalidate
|
|
|
|
return (hr);
|
|
}/* end of function put_Value */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_Min */
|
|
/* Description: Gets the minimum value on which the rect should expand */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_Min(float *pVal){
|
|
|
|
*pVal = m_fMin;
|
|
return S_OK;
|
|
}/* end of function get_Min */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_Max */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_Min(float newVal){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
m_fMin = newVal;
|
|
hr = RecalculateTumbPos(); // apply the new position to the tumb rect and invalidate
|
|
|
|
//ATLASSERT(SUCCEEDED(hr));
|
|
|
|
return (S_OK);
|
|
}/* end of function put_Min */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_Max */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_Max(float *pVal){
|
|
|
|
*pVal = m_fMax;
|
|
return S_OK;
|
|
}/* end of function get_Max */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_Max */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_Max(float newVal){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
m_fMax = newVal;
|
|
hr = RecalculateTumbPos(); // apply the new position to the tumb rect and invalidate
|
|
|
|
//ATLASSERT(SUCCEEDED(hr));
|
|
|
|
return (S_OK);
|
|
}/* end of function put_Max */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_XOffset */
|
|
/* Descriptoin: The part we do not draw on, end of the rail.. */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_XOffset(LONG *pVal){
|
|
|
|
*pVal = m_lXOffset;
|
|
return S_OK;
|
|
}/* end of function get_XOffset */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_XOffset */
|
|
/* Description: Adjust it, cache our new FLOAT offset and recalculate */
|
|
/* the position. */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_XOffset(LONG newVal){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
m_lXOffset = newVal;
|
|
|
|
hr = RecalculateTumbPos(); // apply the new position to the tumb rect and invalidate
|
|
|
|
//ATLASSERT(SUCCEEDED(hr));
|
|
|
|
return (S_OK);
|
|
}/* end of function put_XOffset */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_Offset */
|
|
/* Descriptoin: The part we do not draw on, end of the rail.. */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_YOffset(LONG *pVal){
|
|
|
|
*pVal = m_lYOffset;
|
|
return S_OK;
|
|
}/* end of function get_YOffset */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_YOffset */
|
|
/* Description: Adjust it, cache our new FLOAT offset and recalculate */
|
|
/* the position. */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_YOffset(LONG newVal){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
m_lYOffset = newVal;
|
|
|
|
m_rcThumb.top = m_rcPos.top - m_lYOffset;
|
|
m_rcThumb.bottom = m_rcPos.bottom - m_lYOffset;
|
|
|
|
FireViewChange();
|
|
|
|
return (hr);
|
|
}/* end of function put_YOffset */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_ThumbWidth */
|
|
/* Descriptoin: Width of the thumb. */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_ThumbWidth(LONG *pVal){
|
|
|
|
*pVal = m_lThumbWidth;
|
|
return S_OK;
|
|
}/* end of function get_YOffset */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_ThumbWidth */
|
|
/* Description: Sets the thumb width. */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_ThumbWidth(LONG newVal){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
m_lThumbWidth = newVal;
|
|
|
|
RecalculateTumbPos();
|
|
|
|
return (S_OK);
|
|
}/* end of function put_YOffset */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_ThumbStatic */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_ThumbStatic(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrThumbFilename[SldrState::Static].Copy();
|
|
return S_OK;
|
|
}/* end of function get_ThumbStatic */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_ThumbStatic */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_ThumbStatic(BSTR strFilename){
|
|
|
|
if (!m_bstrThumbFilename[SldrState::Disabled]){
|
|
|
|
PutThumbImage(strFilename, SldrState::Disabled);
|
|
}/* end of if statement */
|
|
|
|
return (PutThumbImage(strFilename, SldrState::Static));
|
|
}/* end of function put_ThumbStatic */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_ThumbHover */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_ThumbHover(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrThumbFilename[SldrState::Hover].Copy();
|
|
|
|
return S_OK;
|
|
}/* end of function get_ThumbHover */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_ThumbHover */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_ThumbHover(BSTR strFilename){
|
|
|
|
return (PutThumbImage(strFilename, SldrState::Hover));
|
|
}/* end of function put_ThumbHover */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_ThumbPush */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_ThumbPush(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrThumbFilename[SldrState::Push].Copy();
|
|
return S_OK;
|
|
}/* end of function get_ThumbPush */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_ThumbPush */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_ThumbPush(BSTR strFilename){
|
|
|
|
return (PutThumbImage(strFilename, SldrState::Push));
|
|
}/* end of function put_ThumbPush */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_ThumbDisabled */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_ThumbDisabled(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrThumbFilename[SldrState::Disabled].Copy();
|
|
return S_OK;
|
|
}/* end of function get_ThumbDisabled */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_ThumbDisabled */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_ThumbDisabled(BSTR strFilename){
|
|
|
|
return (PutThumbImage(strFilename, SldrState::Disabled));
|
|
}/* end of function put_ThumbDisabled */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_ThumbActive */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_ThumbActive(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrThumbFilename[SldrState::Active].Copy();
|
|
return S_OK;
|
|
}/* end of function get_ThumbActive */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_ThumbActive */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_ThumbActive(BSTR strFilename){
|
|
|
|
return (PutThumbImage(strFilename, SldrState::Active));
|
|
}/* end of function put_ThumbActive */
|
|
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_BackStatic */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_BackStatic(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrBackFilename[SldrState::Static].Copy();
|
|
return S_OK;
|
|
}/* end of function get_BackStatic */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_BackStatic */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_BackStatic(BSTR strFilename){
|
|
|
|
if (!m_bstrBackFilename[SldrState::Disabled]){
|
|
|
|
PutBackImage(strFilename, SldrState::Disabled);
|
|
}/* end of if statement */
|
|
|
|
return (PutBackImage(strFilename, SldrState::Static));
|
|
}/* end of function put_BackStatic */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_BackHover */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_BackHover(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrBackFilename[SldrState::Hover].Copy();
|
|
|
|
return S_OK;
|
|
}/* end of function get_BackHover */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_BackHover */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_BackHover(BSTR strFilename){
|
|
|
|
return (PutBackImage(strFilename, SldrState::Hover));
|
|
}/* end of function put_BackHover */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_BackPush */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_BackPush(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrBackFilename[SldrState::Push].Copy();
|
|
return S_OK;
|
|
}/* end of function get_BackPush */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_BackPush */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_BackPush(BSTR strFilename){
|
|
|
|
return (PutBackImage(strFilename, SldrState::Push));
|
|
}/* end of function put_BackPush */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_BackDisabled */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_BackDisabled(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrBackFilename[SldrState::Disabled].Copy();
|
|
return S_OK;
|
|
}/* end of function get_BackDisabled */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_BackDisabled */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_BackDisabled(BSTR strFilename){
|
|
|
|
return (PutBackImage(strFilename, SldrState::Disabled));
|
|
}/* end of function put_BackDisabled */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_BackActive */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_BackActive(BSTR *pstrFilename){
|
|
|
|
*pstrFilename = m_bstrBackFilename[SldrState::Active].Copy();
|
|
return S_OK;
|
|
}/* end of function get_BackActive */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_BackActive */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_BackActive(BSTR strFilename){
|
|
|
|
return (PutBackImage(strFilename, SldrState::Active));
|
|
}/* end of function put_BackActive */
|
|
|
|
/*************************************************************/
|
|
/* Function: get_SldrState */
|
|
/* Description: Gets current slider state. */
|
|
/*************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_SldrState(long *pVal){
|
|
|
|
*pVal = (long) m_nEntry;
|
|
return S_OK;
|
|
}/* end of function get_SldrState */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_SldrState */
|
|
/* Description: Sets slider state. */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_SldrState(long newVal){
|
|
|
|
HRESULT hr = SetSliderState((SldrState)newVal);
|
|
return (hr);
|
|
}/* end of function put_SldrState */
|
|
|
|
/*************************************************************/
|
|
/* Function: get_Disable */
|
|
/* Description: Returns OLE-BOOL if disabled or enabled. */
|
|
/*************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_Disable(VARIANT_BOOL *pVal){
|
|
|
|
*pVal = SldrState::Disabled == m_nEntry ? VARIANT_TRUE : VARIANT_FALSE;
|
|
return S_OK;
|
|
}/* end of function get_Disable */
|
|
|
|
/*************************************************************/
|
|
/* Function: put_Disable */
|
|
/* Description: Disable or enable the buttons (disabled */
|
|
/* are greyed out and do not except mouse clicks). */
|
|
/*************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_Disable(VARIANT_BOOL newVal){
|
|
|
|
SldrState sldrSt = VARIANT_FALSE == newVal ? SldrState::Static : SldrState::Disabled;
|
|
HRESULT hr = SetSliderState(sldrSt);
|
|
|
|
return (hr);
|
|
}/* end of function put_Disable */
|
|
|
|
/*************************************************************************/
|
|
/* HELPER Functions */
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
/* Function: RecalculateTumbPos */
|
|
/* Description: Centers the rect around x value. */
|
|
/* This one calculate the thumb rectangle x position. */
|
|
/*************************************************************************/
|
|
HRESULT CMSMFSldr::RecalculateTumbPos(){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
// offset the rect depending on the y value
|
|
m_rcThumb.top = m_rcPos.top + m_lYOffset;
|
|
m_rcThumb.bottom = m_rcPos.bottom - m_lYOffset;
|
|
|
|
// just offset x coordibate of the thumb the rect depening on the new xValue
|
|
// calculate the length
|
|
FLOAT flLengthU = m_fMax - m_fMin; // length in units
|
|
FLOAT flLengthR = (FLOAT)RECTWIDTH(&m_rcPos) - 2* m_lXOffset;
|
|
|
|
// calcalate the center of the thumb in RECT coordinates
|
|
FLOAT fPos = (m_fValue - m_fMin) * flLengthR / flLengthU;
|
|
// fPos is at the center of the thumb
|
|
|
|
LONG lThumbWidthHalf = m_lThumbWidth/2;
|
|
|
|
LONG lPos = (INT)fPos + m_lXOffset + m_rcPos.left;
|
|
|
|
if(lPos < (m_rcPos.left + lThumbWidthHalf) || lPos > (m_rcPos.right - lThumbWidthHalf)){
|
|
|
|
// we are of the rectangle
|
|
hr = E_FAIL;
|
|
return(hr);
|
|
}/* end of if statement */
|
|
|
|
LONG lOldPos = m_rcThumb.left + lThumbWidthHalf;
|
|
|
|
if(lOldPos == lPos){
|
|
|
|
// thumb is in the same position as before so lets not bother with it
|
|
hr = S_FALSE;
|
|
return(hr);
|
|
}/* end of if statement */
|
|
|
|
m_rcThumb.left = lPos - lThumbWidthHalf;
|
|
m_rcThumb.right = lPos + lThumbWidthHalf;
|
|
|
|
FireViewChange();
|
|
|
|
return(hr);
|
|
}/* end of function RecalculateTumbPos */
|
|
|
|
/*************************************************************************/
|
|
/* Function: RecalculateValue */
|
|
/* Description: Recalculates the slider value, since the thumb rect has */
|
|
/* changed. */
|
|
/*************************************************************************/
|
|
HRESULT CMSMFSldr::RecalculateValue(){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
// calculate the length
|
|
FLOAT flLengthU = m_fMax - m_fMin; // length in units
|
|
FLOAT flLengthR = (FLOAT)RECTWIDTH(&m_rcPos) - 2* m_lXOffset;
|
|
|
|
LONG lThumbXPos = m_rcThumb.left + m_lThumbWidth/2;
|
|
lThumbXPos -= m_rcPos.left + m_lXOffset; // shift it over to 0 origin at left offset
|
|
|
|
// calcalate the center of the thumb in VALUE coordinates
|
|
FLOAT fPos = m_fMin + (lThumbXPos) * flLengthU / flLengthR;
|
|
// fPos is at the center of the thumb
|
|
|
|
if(fPos < (m_fMin) || fPos > (m_fMax)){
|
|
|
|
// we are of the rectangle
|
|
hr = E_FAIL;
|
|
return(hr);
|
|
}/* end of if statement */
|
|
|
|
m_fValue = fPos;
|
|
|
|
// Fire Event that we have changed our value
|
|
|
|
return(hr);
|
|
}/* end of function RecalculateValue */
|
|
|
|
/*************************************************************************/
|
|
/* Function: SetSliderState */
|
|
/* Description: Sets the button states forces redraw. */
|
|
/*************************************************************************/
|
|
HRESULT CMSMFSldr::SetSliderState(SldrState sldrState){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
bool fRedraw = false;
|
|
|
|
if(sldrState != m_nEntry ){
|
|
|
|
fRedraw = true;
|
|
}/* end of if statement */
|
|
|
|
m_nEntry = sldrState;
|
|
|
|
if(fRedraw){
|
|
|
|
if (m_nEntry == SldrState::Disabled){
|
|
|
|
SetFocus(false); // disable the focus
|
|
SetCapture(false);
|
|
}/* end of if statement */
|
|
|
|
// we are updating image that is being used, refresh it
|
|
ATLTRACE2(atlTraceWindowing, 20, TEXT("Redrawing the image\n"));
|
|
FireViewChange(); // update the display
|
|
//InvalidateRgn(); // our helper function
|
|
}/* end of if statement */
|
|
|
|
return(hr);
|
|
}/* end of function SetSliderState */
|
|
|
|
/*************************************************************************/
|
|
/* Function: PtOnSlider */
|
|
/* Description: Uses helper to do the same. */
|
|
/*************************************************************************/
|
|
bool CMSMFSldr::PtOnSlider(LONG x, LONG y){
|
|
|
|
POINT pos = {x, y};
|
|
return(PtOnSlider(pos));
|
|
}/* end of function PtOnSlider */
|
|
|
|
/*************************************************************************/
|
|
/* Function: PtOnSlider */
|
|
/* Description: Determines if the point is located on the slider. */
|
|
/* TODO: Needs to be modified when we will handle transparent color. */
|
|
/*************************************************************************/
|
|
bool CMSMFSldr::PtOnSlider(POINT pos){
|
|
|
|
RECT rc;
|
|
bool bRet = false;
|
|
|
|
if(m_bWndLess){
|
|
|
|
rc = m_rcPos;
|
|
}
|
|
else {
|
|
|
|
if(!::IsWindow(m_hWnd)){
|
|
|
|
return(bRet);
|
|
}/* end of if statement */
|
|
|
|
::GetClientRect(m_hWnd, &rc);
|
|
}/* end of if statement */
|
|
|
|
bRet = PtInRect(&rc, pos) ? true : false;
|
|
|
|
//TODO: Add also if we are on bitmap itsels possibly
|
|
|
|
#ifdef _DEBUG
|
|
if(bRet)
|
|
ATLTRACE2(atlTraceWindowing, 20, TEXT("Point x = %d y = %d in Rect left = %d top %d right %d bottom %d\n"),
|
|
pos.x, pos.y, m_rcPos.left, m_rcPos.top, m_rcPos.right, m_rcPos.bottom);
|
|
else
|
|
ATLTRACE2(atlTraceWindowing, 20, TEXT("Point x = %d y = %d NOT ON RECT Rect left = %d top %d right %d bottom %d\n"),
|
|
pos.x, pos.y, m_rcPos.left, m_rcPos.top, m_rcPos.right, m_rcPos.bottom);
|
|
#endif
|
|
|
|
return(bRet);
|
|
}/* end of function PtOnSlider */
|
|
|
|
/*************************************************************************/
|
|
/* Function: PtOnThumb */
|
|
/* Description: Uses helper to do the same. */
|
|
/*************************************************************************/
|
|
bool CMSMFSldr::PtOnThumb(LONG x, LONG y){
|
|
|
|
POINT pos = {x, y};
|
|
return(PtOnThumb(pos));
|
|
}/* end of function PtOnThumb */
|
|
|
|
/*************************************************************************/
|
|
/* Function: PtOnThumb */
|
|
/* Description: Determines if the point is located on the slider. */
|
|
/* TODO: Needs to be modified when we will handle transparent color. */
|
|
/*************************************************************************/
|
|
bool CMSMFSldr::PtOnThumb(POINT pos){
|
|
|
|
RECT rc;
|
|
bool bRet = false;
|
|
|
|
if(m_bWndLess){
|
|
|
|
rc = m_rcPos;
|
|
}
|
|
else {
|
|
|
|
if(!::IsWindow(m_hWnd)){
|
|
|
|
return(bRet);
|
|
}/* end of if statement */
|
|
|
|
::GetClientRect(m_hWnd, &rc);
|
|
}/* end of if statement */
|
|
|
|
bRet = PtInRect(&rc, pos) ? true : false;
|
|
|
|
return(bRet);
|
|
}/* end of function PtOnThumb */
|
|
|
|
/*************************************************************************/
|
|
/* Function: OffsetX */
|
|
/* Description: Adjusts the x position for windows case when we are 0,0 */
|
|
/* based. */
|
|
/*************************************************************************/
|
|
HRESULT CMSMFSldr::OffsetX(LONG& xPos){
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_bWndLess){
|
|
|
|
return(hr);
|
|
}/* end of if statement */
|
|
|
|
ATLASSERT(::IsWindow(m_hWnd));
|
|
|
|
xPos = m_rcPos.left + xPos;
|
|
|
|
return(hr);
|
|
}/* end of function OffsetX */
|
|
|
|
/*************************************************************************/
|
|
/* Function: SetThumbPos */
|
|
/* Description: Sets the thumb position. */
|
|
/*************************************************************************/
|
|
HRESULT CMSMFSldr::SetThumbPos(LONG xPos){
|
|
|
|
HRESULT hr = S_FALSE;
|
|
|
|
//MOVE THE THUMB TO THIS X POSITION
|
|
long ThumbWidthHalf = m_lThumbWidth /2;
|
|
|
|
// see if the positions are the same
|
|
if(m_rcThumb.left + ThumbWidthHalf != xPos){
|
|
|
|
// see if we are with offset regions
|
|
if((xPos > (m_rcPos.left + m_lXOffset)) &&
|
|
(xPos < (m_rcPos.right - m_lXOffset))){
|
|
|
|
m_rcThumb.left = xPos - ThumbWidthHalf;
|
|
m_rcThumb.right = xPos + ThumbWidthHalf;
|
|
hr = RecalculateValue();
|
|
|
|
if(SUCCEEDED(hr)){
|
|
|
|
Fire_OnValueChange(m_fValue); // fire to the container that we are chaning the value
|
|
}/* end of if statement */
|
|
}
|
|
else {
|
|
|
|
hr = E_FAIL; // not in the offset any more
|
|
}/* end of if statement*/
|
|
}/* end of if statement */
|
|
|
|
return(hr);
|
|
}/* end of function SetThumbPos */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_ArrowKeyIncrement */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_ArrowKeyIncrement(FLOAT *pVal){
|
|
|
|
*pVal = m_fKeyIncrement;
|
|
return S_OK;
|
|
}/* end of function get_ArrowKeyIncrement */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_ArrowKeyIncrement */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_ArrowKeyIncrement(FLOAT newVal){
|
|
|
|
m_fKeyIncrement = newVal;
|
|
return S_OK;
|
|
}/* end of function put_ArrowKeyIncrement */
|
|
|
|
/*************************************************************************/
|
|
/* Function: get_ArrowKeyDecrement */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::get_ArrowKeyDecrement(float *pVal){
|
|
|
|
*pVal = m_fKeyDecrement;
|
|
return S_OK;
|
|
}/* end of function get_ArrowKeyDecrement */
|
|
|
|
/*************************************************************************/
|
|
/* Function: put_ArrowKeyDecrement */
|
|
/*************************************************************************/
|
|
STDMETHODIMP CMSMFSldr::put_ArrowKeyDecrement(float newVal){
|
|
|
|
m_fKeyDecrement = newVal;
|
|
return S_OK;
|
|
}/* end of function put_ArrowKeyDecrement */
|
|
|
|
/*************************************************************************/
|
|
/* End of file: MSMFSldr.cpp */
|
|
/*************************************************************************/
|