|
|
/*************************************************************************/ /* Copyright (C) 1999 Microsoft Corporation */ /* File: MSMFText.cpp */ /* Description: Implementation of CMSMFText control object */ /* Author: phillu */ /* Date: 10/06/99 */ /*************************************************************************/ #include "stdafx.h"
#include "MSMFCnt.h"
#include "MSMFText.h"
#include "CBitmap.h"
/////////////////////////////////////////////////////////////////////////////
// CMSMFText
/*************************************************************************/ /* Function: CMSMFText::CMSMFText() */ /* Description: Initialize the properties and states. */ /*************************************************************************/ CMSMFText::CMSMFText() { m_fDirty = true;
//properties
m_clrBackColor = ::GetSysColor(COLOR_BTNFACE); m_uiState = TextState::Static; m_uiFontSize = 10; m_fDisabled = false; m_clrColorActive = 0x00ff0000; // blue
m_clrColorStatic = 0x00000000; // black
m_clrColorHover = 0x00ff0000; // blue
m_clrColorPush = 0x00ffffff; // white
m_clrColorDisable = 0x00808080; // grey
m_bstrTextValue = L""; m_bstrFontFace = L"Arial"; m_bstrAlignment = L"Center"; m_bstrFontStyle = L"Normal"; m_uiEdgeStyle = 0; // no edge
#if 0 // used for getting the windowed case working DJ
m_bWindowOnly = TRUE; #endif
m_fTransparent = false; }
/*************************************************************************/ /* Function: CMSMFText::SetTextProperties */ /* Description: Set the properties for the CText object. */ /*************************************************************************/ HRESULT CMSMFText::SetTextProperties() { HRESULT hr = S_OK;
m_cText.SetFontFace(m_bstrFontFace); m_cText.SetFontSize(m_uiFontSize); m_cText.SetFontStyle(m_bstrFontStyle); m_cText.SetTextAlignment(m_bstrAlignment); m_cText.SetFixedSizeFont(true);
// set the font color based on the current state
OLE_COLOR clrColorCurrent = m_clrColorStatic; switch(m_uiState) { case(TextState::Static): clrColorCurrent = m_clrColorStatic; break; case(TextState::Hover): clrColorCurrent = m_clrColorHover; break; case(TextState::Active): clrColorCurrent = m_clrColorActive; break; case(TextState::Push): clrColorCurrent = m_clrColorPush; break; case(TextState::Disabled): clrColorCurrent = m_clrColorDisable; break; }
// translate OLE_COLOR to COLORREF
COLORREF crCurrentState;
hr = OleTranslateColor(clrColorCurrent, CBitmap::GetSuperPal(), &crCurrentState);
if (FAILED(hr)) { crCurrentState = GetSysColor(COLOR_WINDOWTEXT); } m_cText.SetTextColor(crCurrentState);
m_fDirty = false;
return hr; }
/*************************************************************************/ /* Function: OnDraw */ /* Description: Draw text in the specified rectangle. */ /*************************************************************************/ HRESULT CMSMFText::OnDraw(ATL_DRAWINFO& di) { USES_CONVERSION; HRESULT hr = S_OK; RECT& rc = *(RECT*)di.prcBounds;
HPALETTE hNewPal = CBitmap::GetSuperPal();
if (::IsWindow(m_hWnd)){ // is not windowless
CBitmap::SelectRelizePalette(di.hdcDraw, hNewPal); }/* end of if statement */
// draw background
if (!m_fTransparent) { COLORREF clr; ::OleTranslateColor (m_clrBackColor, hNewPal, &clr); HBRUSH hbrBack = ::CreateSolidBrush(clr);
if(NULL == hbrBack){ hr = E_FAIL; return(hr); }/* end of if statement */
::FillRect(di.hdcDraw, &rc, hbrBack); ::DeleteObject(hbrBack); }
if (m_fDirty) { SetTextProperties(); }
hr = m_cText.Write(di.hdcDraw, rc, m_bstrTextValue);
// draw edge
if (m_uiEdgeStyle != 0) { ::DrawEdge(di.hdcDraw, &rc, m_uiEdgeStyle, BF_RECT); }
// draw focus rectagle
HRESULT hr2 = GetFocus();
if(S_OK == hr2) { ::DrawFocusRect(di.hdcDraw, (LPRECT)di.prcBounds); }
return hr; }/* end of function OnDraw */
/*************************************************************************/ /* Function: get_FontSize */ /* Description: return the FontSize property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_FontSize(long *pVal) { if (!pVal) { return E_POINTER; }
*pVal = m_uiFontSize;
return S_OK; }
/*************************************************************************/ /* Function: put_FontSize */ /* Description: set the FontSize property, in pt. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_FontSize(long lSize) { if ((UINT)lSize != m_uiFontSize) { m_uiFontSize = (UINT)lSize; m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_Text */ /* Description: return the Text that is displayed in the control. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_Text(BSTR *pText) { if (!pText) { return E_POINTER; }
*pText = m_bstrTextValue.Copy();
return S_OK; }
/*************************************************************************/ /* Function: put_Text */ /* Description: set the text to be displayed in the control. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_Text(BSTR wsText) { if (_wcsicmp(m_bstrTextValue, wsText) != 0) { m_bstrTextValue = wsText; FireViewChange(); }
return S_OK; }
/*************************************************************************/ /* Function: get_FontFace */ /* Description: return the FontFace property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_FontFace(BSTR *pFontFace) { if (!pFontFace) { return E_POINTER; }
*pFontFace = m_bstrFontFace.Copy(); return S_OK; }
/*************************************************************************/ /* Function: put_FontFace */ /* Description: set the FontFace property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_FontFace(BSTR wsFontFace) { if (_wcsicmp(m_bstrFontFace, wsFontFace) != 0) { m_bstrFontFace = wsFontFace; m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_FontStyle */ /* Description: return the FontSize property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_FontStyle(BSTR *pFontStyle) { if (!pFontStyle) { return E_POINTER; }
*pFontStyle = m_bstrFontStyle.Copy(); return S_OK; }
/*************************************************************************/ /* Function: put_FontStyle */ /* Description: set the FontStyle property. The style string should */ /* contain either "Normal", or concatenation of one or more strings of: */ /* "Bold", "Italic", "Underline", "Strikeout". Default is "Normal". */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_FontStyle(BSTR wsFontStyle) { if (_wcsicmp(m_bstrFontStyle, wsFontStyle) != 0) { m_bstrFontStyle = wsFontStyle; m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_TextAlignment */ /* Description: return the TextAlignment (horizontal) property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_TextAlignment(BSTR *pAlignment) { if (!pAlignment) { return E_POINTER; }
*pAlignment = m_bstrAlignment.Copy();
return S_OK; }
/*************************************************************************/ /* Function: put_TextAlignment */ /* Description: set the TextAlignment property. It controls the */ /* horizontal text alignment. Must be one of "Left", "Center", or */ /* "Right". Default is "Center". */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_TextAlignment(BSTR wsAlignment) { if (_wcsicmp(m_bstrAlignment, wsAlignment) != 0) { m_bstrAlignment = wsAlignment; m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_ColorPush */ /* Description: return the ColorPush property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_ColorPush(OLE_COLOR *pColor) { if (!pColor) { return E_POINTER; }
*pColor = m_clrColorPush;
return S_OK; }
/*************************************************************************/ /* Function: put_ColorPush */ /* Description: set the ColorPush property. This is the color of text */ /* in the Push state. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_ColorPush(OLE_COLOR clrColor) { m_clrColorPush = clrColor;
if (m_uiState == TextState::Push) { m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_ColorHover */ /* Description: return the ColorHover property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_ColorHover(OLE_COLOR *pColor) { if (!pColor) { return E_POINTER; }
*pColor = m_clrColorHover;
return S_OK; }
/*************************************************************************/ /* Function: put_ColorHover */ /* Description: set the ColorHover property. This is the color of text */ /* in the Hover state. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_ColorHover(OLE_COLOR clrColor) { m_clrColorHover = clrColor;
if (m_uiState == TextState::Hover) { m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_ColorStatic */ /* Description: return the ColorStatic property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_ColorStatic(OLE_COLOR *pColor) { if (!pColor) { return E_POINTER; }
*pColor = m_clrColorStatic;
return S_OK; }
/*************************************************************************/ /* Function: put_ColorPush */ /* Description: set the ColorPush property. This is the color of text */ /* in the Static (normal) state. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_ColorStatic(OLE_COLOR clrColor) { m_clrColorStatic = clrColor;
if (m_uiState == TextState::Static) { m_fDirty = true; } return S_OK; }
/*************************************************************************/ /* Function: get_ColorDisable */ /* Description: return the ColorDisable property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_ColorDisable(OLE_COLOR *pColor) { if (!pColor) { return E_POINTER; }
*pColor = m_clrColorDisable;
return S_OK; }
/*************************************************************************/ /* Function: put_ColorDisable */ /* Description: set the ColorDisable property. This is the color of text */ /* in the Disabled state. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_ColorDisable(OLE_COLOR clrColor) { m_clrColorDisable = clrColor;
if (m_uiState == TextState::Disabled) { m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_ColorActive */ /* Description: return the ColorActive property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_ColorActive(OLE_COLOR *pColor) { if (!pColor) { return E_POINTER; }
*pColor = m_clrColorActive;
return S_OK; }
/*************************************************************************/ /* Function: put_ColorActive */ /* Description: set the ColorActive property. This is the color of text */ /* in the Active state. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_ColorActive(OLE_COLOR clrColor) { m_clrColorActive = clrColor;
if (m_uiState == TextState::Active) { m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_TextState */ /* Description: return the TextState property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_TextState(long *pState) { if (!pState) { return E_POINTER; }
*pState = m_uiState; return S_OK; }
/*************************************************************************/ /* Function: put_TextState */ /* Description: set the TextState property. It should be one of: */ /* Static = 0, Hover = 1, Push = 2, Disabled = 3, Active = 4. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_TextState(long lState) { if (lState < 0 || lState > 4) { return E_INVALIDARG; }
if ((UINT)lState != m_uiState) { m_uiState = (UINT)lState; m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_Disable */ /* Description: return the Disable property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_Disable(VARIANT_BOOL *pVal) { if (!pVal) { return E_POINTER; }
*pVal = m_fDisabled?VARIANT_TRUE:VARIANT_FALSE;
return S_OK; }
/*************************************************************************/ /* Function: put_Disable */ /* Description: set the Disable property. */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_Disable(VARIANT_BOOL newVal) { bool fDisabled;
if (newVal == VARIANT_TRUE) { fDisabled = true; m_uiState = TextState::Disabled; } else { fDisabled = false; m_uiState = TextState::Static; }
if (fDisabled != m_fDisabled) { m_fDisabled = fDisabled; m_fDirty = true; }
return S_OK; }
/*************************************************************************/ /* Function: get_EdgeStyle */ /* Description: return the EdgeStyle. */ /*************************************************************************/ STDMETHODIMP CMSMFText::get_EdgeStyle(BSTR *pStyle) { if (!pStyle) { return E_POINTER; }
switch (m_uiEdgeStyle) { case 0: // no edge
*pStyle = SysAllocString(L"None"); break; case EDGE_SUNKEN: *pStyle = SysAllocString(L"Sunken"); break; case EDGE_RAISED: *pStyle = SysAllocString(L"Raised"); break; default: // we should not reach here
*pStyle = NULL; DebugBreak(); }
return S_OK; }
/*************************************************************************/ /* Function: put_EdgeStyle */ /* Description: set the EdgeStyle property. Must be one of "None", */ /* "Raised", or "Sunken". Default is "None". */ /*************************************************************************/ STDMETHODIMP CMSMFText::put_EdgeStyle(BSTR wsStyle) { UINT uiStyle = 0;
//set the text alignment
if (!_wcsicmp(wsStyle, L"None")) { uiStyle = 0; } else if (!_wcsicmp(wsStyle, L"Sunken")) { uiStyle = EDGE_SUNKEN; } else if (!_wcsicmp(wsStyle, L"Raised")) { uiStyle = EDGE_RAISED; }
if (m_uiEdgeStyle != uiStyle) { m_uiEdgeStyle = uiStyle; FireViewChange(); }
return S_OK; }
/*************************************************************************/ /* Function: OnButtonDown */ /* Description: Handles when buttons is selected. Captures the mouse */ /* movents (supported for windowless, via interfaces). */ /*************************************************************************/ LRESULT CMSMFText::OnButtonDown(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
if (m_uiState == TextState::Disabled){ return 0; }/* end of if statement */
LONG xPos = GET_X_LPARAM(lParam); LONG yPos = GET_Y_LPARAM(lParam);
if(PtOnButton(xPos, yPos)){
// we are really on the buttons bitmap and we pushed it
if(TextState::Hover != m_uiState){ // 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 */
SetButtonState(TextState::Push); }/* end of if statement */
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 CMSMFText::OnButtonUp(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
if (m_uiState == TextState::Disabled){
LONG lRes; ForwardWindowMessage(WM_USER_ENDHELP, (WPARAM) m_hWnd, 0, lRes); return 0; }/* end of if statement */
LONG xPos = GET_X_LPARAM(lParam); LONG yPos = GET_Y_LPARAM(lParam);
bool bOnButtonImage = PtOnButton(xPos, yPos); bool bFire = (m_uiState == TextState::Push); if(bOnButtonImage){
SetButtonState(TextState::Static); //change to static even
SetCapture(false); // release the capture of the mouse messages
} else {
SetButtonState(TextState::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){
Fire_OnClick(); }/* end of if statement */ }/* end of if statement */
LONG lRes; ForwardWindowMessage(WM_USER_ENDHELP, (WPARAM) m_hWnd, 0, lRes); return 0; }/* 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 CMSMFText::OnMouseMove(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
if (m_uiState == TextState::Disabled) return 0;
LONG xPos = GET_X_LPARAM(lParam); LONG yPos = GET_Y_LPARAM(lParam);
if (m_uiState != TextState::Push){ if(PtOnButton(xPos, yPos)){ if(TextState::Hover != m_uiState || S_OK != GetCapture()){
SetCapture(true); // capture the mouse messages
SetButtonState(TextState::Hover); }/* end of if statement */ } else {
if(TextState::Static != m_uiState){
SetCapture(false); // release the capture of the mouse messages
SetButtonState(TextState::Static); }/* end of if statement */ }/* end of if statement */ }/* end of if statement */
return 0; }/* end of function OnMouseMove */
/*************************************************************************/ /* Function: OnSetFocus */ /* Description: If we are in disabled state SetFocus(false) */ /*************************************************************************/ LRESULT CMSMFText::OnSetFocus(UINT msg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
if (m_uiState == TextState::Disabled){
if(GetFocus() == S_OK){
SetFocus(false); }/* end of if statement */
return(-1); }/* end of if statement */
return 0; }/* end of function OnSetFocus */
/*************************************************************************/ /* Function: PtOnButton */ /* Description: Uses helper to do the same. */ /*************************************************************************/ bool CMSMFText::PtOnButton(LONG x, LONG y){
POINT pos = {x, y}; return(PtOnButton(pos)); }/* end of function PtOnButton */
/*************************************************************************/ /* Function: PtOnButton */ /* Description: Determines if the point is located on the button. */ /* TODO: Needs to be modified when we will handle transparent color. */ /*************************************************************************/ bool CMSMFText::PtOnButton(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 PtOnButton */
/*************************************************************************/ /* Function: SetButtonState */ /* Description: Sets the button states forces redraw. */ /*************************************************************************/ HRESULT CMSMFText::SetButtonState(TextState txtState){
HRESULT hr = S_OK;
bool fRedraw = false; if((UINT)txtState != m_uiState ){
fRedraw = true; }/* end of if statement */
m_uiState = txtState; if(fRedraw){
if (m_uiState == TextState::Disabled){ SetFocus(false); // disable the focus
SetCapture(false); }/* end of if statement */
m_fDirty = true; FireViewChange(); // update the display
}/* end of if statement */
return(hr); }/* end of function SetButtonState */
STDMETHODIMP CMSMFText::get_TextWidth(long *pVal) { HRESULT hr = S_OK;
// special case early return
if (m_bstrTextValue.Length() == 0){ *pVal = 0; return S_OK; }/* end of if statement */
// get the current window or the window of its parent
HWND hwnd = GetWindow(); HDC hdc = ::GetWindowDC(hwnd);
if(NULL == hdc){
return E_FAIL; }/* end of if statement */
// normalize to pixel coord as required by the container
SetMapMode(hdc, MM_TEXT);
if (m_fDirty) { SetTextProperties(); }
SIZE size; hr = m_cText.GetTextWidth(hdc, m_bstrTextValue, &size); if (S_OK == hr) { *pVal = size.cx; } else { *pVal = 0; }
::ReleaseDC(hwnd, hdc);
return hr; }
STDMETHODIMP CMSMFText::get_TextHeight(long *pVal) { HRESULT hr = S_OK; // get the current window or the window of its parent
HWND hwnd = GetWindow(); HDC hdc = ::GetWindowDC(hwnd);
if(NULL == hdc){
return E_FAIL; }/* end of if statement */
// normalize to pixel coord as required by the container
SetMapMode(hdc, MM_TEXT);
if (m_fDirty) { SetTextProperties(); }
SIZE size; hr = m_cText.GetTextWidth(hdc, m_bstrTextValue, &size); if (S_OK == hr) { *pVal = size.cy; } else { *pVal = 0; }
::ReleaseDC(hwnd, hdc); // do not forget to free DC
return hr; }
STDMETHODIMP CMSMFText::get_TransparentText(VARIANT_BOOL *pVal) { if (!pVal) { return E_POINTER; }
*pVal = m_fTransparent?VARIANT_TRUE:VARIANT_FALSE;
return S_OK; }
STDMETHODIMP CMSMFText::put_TransparentText(VARIANT_BOOL newVal) { bool fTransparent;
if (newVal == VARIANT_FALSE) { fTransparent = false; } else { fTransparent = true; }
if (fTransparent != m_fTransparent) { m_fTransparent = fTransparent; FireViewChange(); }
return S_OK; }
/*************************************************************/ /* Name: SetObjectRects */ /*************************************************************/ STDMETHODIMP CMSMFText::SetObjectRects(LPCRECT prcPos,LPCRECT prcClip){ // Call the default method first
IOleInPlaceObjectWindowlessImpl<CMSMFText>::SetObjectRects(prcPos, prcClip); FireViewChange();
return S_OK; }/* end of function SetObjectRects */
/*************************************************************************/ /* Function: OnSize */ /*************************************************************************/ LRESULT CMSMFText::OnSize(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled){ bHandled = true;
FireViewChange();
return 0; }/* end of function OnSize */
/*************************************************************************/ /* End of file: MSMFText.cpp */ /*************************************************************************/
|