博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
智能控件变幻
阅读量:4048 次
发布时间:2019-05-25

本文共 10835 字,大约阅读时间需要 36 分钟。

头文件

#pragma once

#include <GdiPlus.h>
// CCfsButton
class CCfsButton : public CButton
{
DECLARE_DYNAMIC(CCfsButton)
public:
CCfsButton();
virtual ~CCfsButton();
protected:
DECLARE_MESSAGE_MAP()
private:
int m_iCfsBtn;
enum EM_CFSBTN_ALIGNMODE
{
CFSBTN_HORIZ,//水平对齐
CFSBTN_VERT, //垂直对齐
MAX_CFSBTN_ALIGNMODE
};
int m_iTextAlign;
bool m_bTextShow;
bool m_bDrawBorder;
bool m_bMouseOnBtn;
COLORREF m_clrActiveBg;
COLORREF m_clrActiveFg;
COLORREF m_clrInactiveBg;
COLORREF m_clrInactiveFg;
struct SCfsButton
{
//CBitmap* pImage;
//HBITMAP hBitmap;
//Gdiplus::Image* pImage;
Gdiplus::Bitmap* pImage;
int iWidth;
int iHeight;
SCfsButton()
{
pImage = NULL;
iWidth = 0;
iHeight = 0;
}
};
SCfsButton m_btnComf[3];
private:
COLORREF GetDefActiveColor(void) const;
COLORREF GetDefInactiveColor(void) const;
void InitParam(void);
void UninitParam(void);
protected:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void PreSubclassWindow();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnKillFocus(CWnd* pNewWnd);
public:
void SetTextAlign(int iAlign);
void SetTextShow(bool bShow);
void SetDrawBorder(bool bBorder);
int GetTextALign(void) const;
bool GetTextShow(void) const;
bool GetDrawBorder(void) const;
void SetDefActiveBgColor(bool bRepaint = false);
void SetDefInactiveBgColor(bool bRepaint = false);
void SetDefActiveFgColor(bool bRepaint = false);
void SetDefInactiveFgColor(bool bRepaint = false);
void SetActiveBgColor(COLORREF clrSelf, bool bRepaint = false);
void SetInactiveBgColor(COLORREF clrSelf, bool bRepaint = false);
void SetActiveFgColor(COLORREF clrSelf, bool bRepaint = false);
void SetInactiveFgColor(COLORREF clrSelf, bool bRepaint = false);
COLORREF GetDefActiveBgColor(void) const;
COLORREF GetDefInactiveBgColor(void) const;
COLORREF GetDefActiveFgColor(void) const;
COLORREF GetDefInactiveFgColor(void) const;
COLORREF GetActiveBgColor(void) const;
COLORREF GetInactiveBgColor(void) const;
COLORREF GetActiveFgColor(void) const;
COLORREF GetInactiveFgColor(void) const;
bool SetIcon(LPCTSTR lpNormal, LPCTSTR lpOver = NULL, LPCTSTR lpDisable = NULL, CSize szBtn = CSize(0,0));
bool SetPng(LPCTSTR lpNormal, LPCTSTR lpOver = NULL, LPCTSTR lpDisable = NULL, CSize szBtn = CSize(0,0));
};
源文件

// CfsButton.cpp : 实现文件

//
#include "stdafx.h"
#include "TestDock.h"
#include "CfsButton.h"
#define SAFE_DELETEP(xx) if(xx){delete xx; xx=NULL;}
#define SAFE_DELETEA(xx) if(xx){delete [] xx; xx=NULL;}
#define SAFE_DELETEOBJECT(xx) if(xx){::DeleteObject(xx);xx=NULL;}
// CCfsButton
IMPLEMENT_DYNAMIC(CCfsButton, CButton)
CCfsButton::CCfsButton()
: m_iCfsBtn(0)
, m_iTextAlign(CFSBTN_HORIZ)
, m_bTextShow(true)
, m_bDrawBorder(false)
, m_bMouseOnBtn(false)
{
SetDefActiveBgColor();
SetDefActiveFgColor();
SetDefInactiveBgColor();
SetDefInactiveFgColor();
}
CCfsButton::~CCfsButton()
{
UninitParam();
}
void CCfsButton::InitParam( void )
{
}
void CCfsButton::UninitParam( void )
{
for (int i=0; i<3; ++i)
{
SAFE_DELETEOBJECT(m_btnComf[i].pImage);
}
}
BEGIN_MESSAGE_MAP(CCfsButton, CButton)
ON_WM_MOUSEMOVE()
ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
// CCfsButton 消息处理程序
void CCfsButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO:  添加您的代码以绘制指定项
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CPen *pOldPen = NULL;
BOOL bIsPressed  = (lpDrawItemStruct->itemState & ODS_SELECTED);
BOOL bIsFocused  = (lpDrawItemStruct->itemState & ODS_FOCUS);
BOOL bIsDisabled = (lpDrawItemStruct->itemState & ODS_DISABLED);
CRect itemRect = lpDrawItemStruct->rcItem;
if (bIsFocused)
{
CBrush br(RGB(0,0,0));  
pDC->FrameRect(&itemRect, &br);
itemRect.DeflateRect(1, 1);
}
COLORREF bgColor;
if ((m_bMouseOnBtn) || (bIsPressed))
{
bgColor = m_clrActiveBg;//GetActiveBgColor();
}
else
{
bgColor = m_clrInactiveBg;//GetInactiveBgColor();
}
CBrush br(bgColor);
pDC->FillRect(&itemRect, &br);
if (bIsPressed)
{
CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
pDC->FrameRect(&itemRect, &brBtnShadow);
}
else
{
CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // White
CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));       // Light gray
CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Dark gray
CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); // Black
pOldPen = pDC->SelectObject(&penBtnHiLight);
pDC->MoveTo(itemRect.left, itemRect.bottom-1);
pDC->LineTo(itemRect.left, itemRect.top);
pDC->LineTo(itemRect.right, itemRect.top);
// Light gray line
pDC->SelectObject(pen3DLight);
pDC->MoveTo(itemRect.left+1, itemRect.bottom-1);
pDC->LineTo(itemRect.left+1, itemRect.top+1);
pDC->LineTo(itemRect.right, itemRect.top+1);
// Disegno i bordi a destra e in basso
// Black line
pDC->SelectObject(pen3DDKShadow);
pDC->MoveTo(itemRect.left, itemRect.bottom-1);
pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
pDC->LineTo(itemRect.right-1, itemRect.top-1);
// Dark gray line
pDC->SelectObject(penBtnShadow);
pDC->MoveTo(itemRect.left+1, itemRect.bottom-2);
pDC->LineTo(itemRect.right-2, itemRect.bottom-2);
pDC->LineTo(itemRect.right-2, itemRect.top);
//
pDC->SelectObject(pOldPen);
}
// Read the button title
CString csTitle;
GetWindowText(csTitle);
// If we don't want the title displayed
if (!m_bTextShow) 
{
csTitle.Empty();
}
CRect captionRect = itemRect;//lpDrawItemStruct->rcItem;
// Draw the iamge
Gdiplus::Graphics grap(pDC->m_hDC);//
int iItem = 0;
iItem = (m_bMouseOnBtn) ? 1 : (bIsDisabled ? 2 : 0);
if (m_btnComf[iItem].pImage)
{
if (bIsPressed)
{
grap.DrawImage(m_btnComf[iItem].pImage, 1, 1, m_btnComf[0].iWidth-1, m_btnComf[0].iHeight-1);
}
else
{
grap.DrawImage(m_btnComf[iItem].pImage, 0, 0, m_btnComf[0].iWidth, m_btnComf[0].iHeight);
}
}
// Write the button title (if any)
if (!csTitle.IsEmpty())
{
if (bIsPressed)
{
captionRect.OffsetRect(1, 1);
}
if ((m_bMouseOnBtn) || (bIsPressed)) 
{
pDC->SetTextColor(m_clrActiveFg);//GetActiveFgColor()
pDC->SetBkColor(m_clrActiveBg);//GetActiveBgColor()
else 
{
pDC->SetTextColor(m_clrInactiveFg);//GetInactiveFgColor()
pDC->SetBkColor(m_clrInactiveBg);//GetInactiveBgColor()
}
// Center text
CRect centerRect = captionRect;
pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(csTitle, -1, captionRect, DT_SINGLELINE|DT_CALCRECT);
captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)csTitle, (DSS_NORMAL), TRUE, 0, (CBrush*)NULL);
if (bIsFocused)
{
CRect focusRect = itemRect;
focusRect.DeflateRect(3, 3);
pDC->DrawFocusRect(&focusRect);
}
}
}
void CCfsButton::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
void CCfsButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CButton::OnMouseMove(nFlags, point);
if (nFlags & MK_LBUTTON && !m_bMouseOnBtn) 
return;
CWnd* pWnd = GetActiveWindow();
CWnd* pParent = GetOwner();
if ((GetCapture() != this) && 
(
#ifndef ST_LIKEIE
pWnd != NULL && 
#endif
pParent != NULL)) 
{
m_bMouseOnBtn = true;
//SetFocus(); // Thanks Ralph!
SetCapture();
Invalidate();
}
else
{
CRect rc;
GetClientRect(&rc);
if (!rc.PtInRect(point))
{
// Redraw only if mouse goes out
if (m_bMouseOnBtn)
{
m_bMouseOnBtn = false;
Invalidate();
}
// If user is NOT pressing left button then release capture!
if (!(nFlags & MK_LBUTTON)) 
ReleaseCapture();
}
}
}
void CCfsButton::OnKillFocus(CWnd* pNewWnd)
{
CButton::OnKillFocus(pNewWnd);
// TODO: 在此处添加消息处理程序代码
if (m_bMouseOnBtn)
{
m_bMouseOnBtn = false;
Invalidate();
}
}
void CCfsButton::SetTextAlign( int iAlign )
{
if (iAlign >= CFSBTN_HORIZ && iAlign < MAX_CFSBTN_ALIGNMODE)
{
m_iTextAlign = iAlign;
Invalidate();
}
}
void CCfsButton::SetTextShow( bool bShow )
{
m_bTextShow = bShow;
}
void CCfsButton::SetDrawBorder( bool bBorder )
{
m_bDrawBorder = bBorder;
}
int CCfsButton::GetTextALign( void ) const
{
return m_iTextAlign;
}
bool CCfsButton::GetTextShow( void ) const
{
return m_bTextShow;
}
bool CCfsButton::GetDrawBorder( void ) const
{
return m_bDrawBorder;
}
void CCfsButton::SetDefActiveBgColor( bool bRepaint /*= false*/ )
{
m_clrActiveBg = ::GetSysColor(COLOR_BTNFACE); 
if (bRepaint) Invalidate();
}
void CCfsButton::SetDefInactiveBgColor( bool bRepaint /*= false*/ )
{
m_clrActiveFg = ::GetSysColor(COLOR_BTNTEXT); 
if (bRepaint) Invalidate();
}
void CCfsButton::SetDefActiveFgColor( bool bRepaint /*= false*/ )
{
m_clrInactiveBg = ::GetSysColor(COLOR_BTNFACE); 
if (bRepaint) Invalidate();
}
void CCfsButton::SetDefInactiveFgColor( bool bRepaint /*= false*/ )
{
m_clrInactiveFg = ::GetSysColor(COLOR_BTNTEXT); 
if (bRepaint) Invalidate();
}
COLORREF CCfsButton::GetDefActiveColor( void ) const
{
return  ::GetSysColor(COLOR_BTNFACE);
}
COLORREF CCfsButton::GetDefInactiveColor( void ) const
{
return ::GetSysColor(COLOR_BTNTEXT);
}
void CCfsButton::SetActiveBgColor( COLORREF clrSelf, bool bRepaint /*= false*/ )
{
m_clrActiveBg = clrSelf;
if (bRepaint)
{
Invalidate();
}
}
void CCfsButton::SetInactiveBgColor( COLORREF clrSelf, bool bRepaint /*= false*/ )
{
m_clrInactiveBg = clrSelf;
if (bRepaint)
{
Invalidate();
}
}
void CCfsButton::SetActiveFgColor( COLORREF clrSelf, bool bRepaint /*= false*/ )
{
m_clrInactiveBg = clrSelf;
if (bRepaint)
{
Invalidate();
}
}
void CCfsButton::SetInactiveFgColor( COLORREF clrSelf, bool bRepaint /*= false*/ )
{
m_clrInactiveFg = clrSelf;
if (bRepaint)
{
Invalidate();
}
}
COLORREF CCfsButton::GetDefActiveBgColor( void ) const
{
return  ::GetSysColor(COLOR_BTNFACE);
}
COLORREF CCfsButton::GetDefInactiveBgColor( void ) const
{
return ::GetSysColor(COLOR_BTNTEXT);
}
COLORREF CCfsButton::GetDefActiveFgColor( void ) const
{
return  ::GetSysColor(COLOR_BTNFACE);
}
COLORREF CCfsButton::GetDefInactiveFgColor( void ) const
{
return ::GetSysColor(COLOR_BTNTEXT);
}
COLORREF CCfsButton::GetActiveBgColor( void ) const
{
return m_clrActiveBg;
}
COLORREF CCfsButton::GetInactiveBgColor( void ) const
{
return m_clrInactiveBg;
}
COLORREF CCfsButton::GetActiveFgColor( void ) const
{
return m_clrActiveFg;
}
COLORREF CCfsButton::GetInactiveFgColor( void ) const
{
return m_clrInactiveFg;
}
bool CCfsButton::SetIcon( LPCTSTR lpNormal, LPCTSTR lpOver /*= NULL*/, LPCTSTR lpDisable /*= NULL*/, CSize szBtn /*= CSize(0,0)*/ )
{
return true;
}
bool CCfsButton::SetPng( LPCTSTR lpNormal, LPCTSTR lpOver /*= NULL*/, LPCTSTR lpDisable /*= NULL*/, CSize szBtn /*= CSize(0,0)*/ )
{
if (lpNormal == NULL)
{
return false;
}
UninitParam();
m_btnComf[0].pImage = new Gdiplus::Bitmap(lpNormal);
if (lpOver)
{
m_btnComf[1].pImage = new Gdiplus::Bitmap(lpOver);
}
if (lpDisable)
{
m_btnComf[2].pImage = new Gdiplus::Bitmap(lpDisable);
}
for (int i=0; i<3; ++i)
{
if (m_btnComf[i].pImage)
{
m_btnComf[i].iWidth = m_btnComf[i].pImage->GetWidth();
m_btnComf[i].iHeight = m_btnComf[i].pImage->GetHeight();
MoveWindow(0, 0, m_btnComf[i].iWidth, m_btnComf[i].iHeight);
}
}
RedrawWindow();
return true;
}

转载地址:http://bpfci.baihongyu.com/

你可能感兴趣的文章
final 的作用
查看>>
在Idea中使用Eclipse编译器
查看>>
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>
微信小程序开发全线记录
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>