📄 guiminitool.cpp
字号:
//-----------------------------------------------------------------------//
// This is a part of the GuiLib MFC Extention. //
// Autor : Francisco Campos //
// (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved //
// This code is provided "as is", with absolutely no warranty expressed //
// or implied. Any use is at your own risk. //
// You must obtain the author's consent before you can include this code //
// in a software library. //
// If the source code in this file is used in any application //
// then acknowledgement must be made to the author of this program //
// fco_campos@tutopia.com //
// version : 1.1 //
// Modified by : Francisco Campos //
//-----------------------------------------------------------------------//
#include "stdafx.h"
#include "..\header\GuiMiniTool.h"
#include "..\header\GuiDrawLayer.h"
#include "..\header\GuiToolButton.h"
#include "..\header\guiminitool.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGuiMiniTool
CGuiMiniTool::CGuiMiniTool()
{
m_arrButtons.RemoveAll();
nNumItems=0;
m_AlingButton=ALIGN_LEFT;
m_AlinTexto=ALIGN_LEFT;
m_clrface=GuiDrawLayer::GetRGBColorXP();
m_bAutoSize=FALSE;
m_bExisteCombo=FALSE;
m_cfont.CreateFont(-11,0,0,0,400,0,0,0,0,1,2,1,34,"MS Sans Serif");
m_clrCaption=GuiDrawLayer::GetRGBColorShadow();
m_Caption=_T("");
msz=CSize(0,0);
}
CGuiMiniTool::~CGuiMiniTool()
{
m_arrButtons.RemoveAll();
}
BEGIN_MESSAGE_MAP(CGuiMiniTool, CStatic)
//{{AFX_MSG_MAP(CGuiMiniTool)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_SYSCOLORCHANGE()
//}}AFX_MSG_MAP
ON_WM_DESTROY()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGuiMiniTool message handlers
int CGuiMiniTool::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CStatic::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
void CGuiMiniTool::OnSysColorChange( )
{
CStatic::OnSysColorChange( );
}
//********************************************************************************
void CGuiMiniTool::PreSubclassWindow()
{
CStatic::PreSubclassWindow();
}
//********************************************************************************
void CGuiMiniTool::AddButton(int nIndex,UINT Cmd,CMenu* pMenu,CString m_szCaption,CString m_ToolTip)
{
m_arrButtons.SetAtGrow(nNumItems, new CArrButton
(this,m_imgList.ExtractIcon(nIndex),Cmd,&m_cfont,m_szCaption,pMenu,m_ToolTip));
nNumItems++;
RecalLayout();
}
void CGuiMiniTool::AddButtonIcon(UINT uIDIcon,UINT Cmd,CMenu* pMenu,CString m_szCaption,CString m_ToolTip)
{
HICON hIcon=AfxGetApp() ->LoadIcon(uIDIcon);
if(hIcon==NULL) return ;
m_arrButtons.SetAtGrow(nNumItems, new CArrButton
(this,hIcon,Cmd,&m_cfont,m_szCaption,pMenu,m_ToolTip));
nNumItems++;
RecalLayout();
}
//**************************************************************************
HICON CGuiMiniTool::GetImagIcon(int nNum)
{
return m_imgList.ExtractIcon(nNum);
}
//****************************************************************************
BOOL CGuiMiniTool::CreateCombo(CGuiComboBoxExt* pControl,UINT nID,int iSize,
DWORD dwStyle)
{
ASSERT(pControl);
if (!pControl->Create(dwStyle,
CRect(1,1,iSize,250), this, nID))
return FALSE;
pControl->m_IsCallMiniTool=TRUE;
m_arrButtons.SetAtGrow(nNumItems, new CArrButton(pControl));
nNumItems++;
RecalLayout();
return TRUE;
}
//********************************************************************************
void CGuiMiniTool::SetImageList(UINT nBitmapID, int cx, int nGrow, COLORREF crMask)
{
CBitmap cbmp;
BITMAP bmp;
m_imgList.Create(nBitmapID,cx,nGrow,crMask);
cbmp.LoadBitmap(nBitmapID);
cbmp.GetBitmap(&bmp);
m_imgList.Add(&cbmp,crMask);
}
//********************************************************************************
void CGuiMiniTool::AutoSize(BOOL mbAutosize)
{
m_bAutoSize=mbAutosize;
RecalLayout();
}
//********************************************************************************
void CGuiMiniTool::DelButton(int nIndex)
{
nNumItems--;
m_arrButtons.RemoveAt(nIndex,nNumItems);
RecalLayout();
}
//********************************************************************************
int CGuiMiniTool::GetCountButton()
{
return m_arrButtons.GetSize();
}
//********************************************************************************
void CGuiMiniTool::RecalLayout()
{
if (!GetSafeHwnd()) return;
CRect rcClient;
GetClientRect(rcClient);
rcClient.DeflateRect(1,1);
CRect rctemp=rcClient;
int nTipo=0;
if (m_bAutoSize)
CalcAutoSize(rcClient);
if (msz.cx > 0)
{
if (m_AlinTexto==ALIGN_LEFT)
rctemp.left+=msz.cx;
else
rctemp.right-=msz.cx;
}
for (int i=0; i < nNumItems;i++)
{
CArrButton* m_cwnd=(CArrButton*) m_arrButtons [i];
if(m_cwnd->m_btipo== TRUE) //es un boton
{
CSize sztemp=((CArrButton*) m_arrButtons [i])->m_bt.GetSizeButton();
nTipo=sztemp.cx;
}
else
{
CRect rctemp;
m_cwnd->m_pwnd->GetWindowRect(rctemp);
if (m_bAutoSize)
{
nTipo=m_nResultCombo;
rctemp.right=rctemp.left+nTipo;
}
else
nTipo=rctemp.Width();
}
if (m_AlingButton == ALIGN_RIGHT)
rctemp.left=rctemp.right-nTipo;
else
rctemp.right=rctemp.left+nTipo;
if (m_cwnd->m_btipo==TRUE)
m_cwnd->m_bt.MoveWindow(rctemp);
else
m_cwnd->m_pwnd->MoveWindow(rctemp);
if (m_AlingButton == ALIGN_RIGHT)
rctemp.right-=nTipo;
else
rctemp.left+=nTipo;
}
m_rcDrawTexto=rctemp;
Drawtext();
}
//*********************************************************************
void CGuiMiniTool::AlingButtons(Aling Alingsb)
{
m_AlingButton=Alingsb;
}
void CGuiMiniTool::SetCaption(CString mSzCaption,Aling AlinText)
{
CClientDC dc(this);
m_Caption=mSzCaption;
msz=dc.GetTextExtent(m_Caption,m_Caption.GetLength());
m_AlinTexto=AlinText;
Invalidate();
}
void CGuiMiniTool::SetColorCaption(COLORREF clrCaption)
{
m_clrCaption=clrCaption;
}
//*********************************************************************
void CGuiMiniTool::CalcAutoSize(CRect m_rc)
{
m_nResultCombo=0;
m_nResultButtons=0;
int m_numCombo=0;
for (int i=0; i < nNumItems;i++)
{
if (((CArrButton*) m_arrButtons [i])->m_btipo ==TRUE)
{
CArrButton* mt=(CArrButton*) m_arrButtons [i];
CSize sztemp=((CArrButton*) m_arrButtons [i])->m_bt.GetSizeButton();
m_nResultButtons+=sztemp.cx;
}
else
{
m_bExisteCombo=TRUE;
m_numCombo++;
}
}
//calculamos el espacio para los combobox
if (m_bExisteCombo)
{
if (m_nResultButtons+msz.cx > m_rc.Width()) //el espacio no alcanza para los botones
m_nResultCombo=0;
else
{
if ((GetSystemMetrics(SM_CXHTHUMB)+msz.cx) > m_rc.Width()-50)
m_nResultCombo=0;
else
{
m_nResultCombo=m_rc.Width()-(m_nResultButtons+msz.cx);
m_nResultCombo/=m_numCombo;
}
}
}
}
//********************************************************************************
void CGuiMiniTool::SetBorder(Borders Style)
{
m_border=Style;
}
//********************************************************************************
void CGuiMiniTool::OnPaint()
{
CPaintDC dc(this); // device context for painting
CBrush cbr;
CRect m_rectDraw;
GetClientRect(&m_rectDraw);
cbr.CreateSolidBrush(m_clrface);
dc.FillRect(&m_rectDraw,&cbr);
if (m_border == STYLE3D)
dc.Draw3dRect(m_rectDraw,GuiDrawLayer::GetRGBColorBTNHigh(),
GuiDrawLayer::GetRGBColorShadow());
if (m_border == STYLEPRESS)
{
dc.Draw3dRect(m_rectDraw,GuiDrawLayer::GetRGBColorShadow(),
GuiDrawLayer::GetRGBColorBTNHigh());
}
if (m_border == STYLEFRAME)
{
dc.Draw3dRect(m_rectDraw,GuiDrawLayer::GetRGBColorShadow(),
GuiDrawLayer::GetRGBColorShadow());
}
Drawtext();
//el flat ya esta
}
//********************************************************************************
void CGuiMiniTool::SetColor(COLORREF m_clrFace)
{
m_clrface=m_clrFace;
for (int i=0; i < nNumItems;i++)
if (((CArrButton*) m_arrButtons [i])->m_btipo ==TRUE)
((CArrButton*) m_arrButtons [i])->m_bt.SetColor(m_clrface);
else
((CArrButton*) m_arrButtons [i])->m_pwnd->SetColor(m_clrface);
}
//********************************************************************************
void CGuiMiniTool::OnSize(UINT nType, int cx, int cy)
{
CStatic::OnSize(nType, cx, cy);
RecalLayout();
// TODO: Add your message handler code here
}
//********************************************************************************
BOOL CGuiMiniTool::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
}
//********************************************************************************
CArrButton::CArrButton(CGuiMiniTool* pParent,HICON m_hIcon,UINT Cmd,CFont* m_cfont,CString m_szCaption,
CMenu *pMenu,CString m_ToolTip)
{
m_bt.Create(_T(""), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW,
CRect(0,0,0,0), pParent, Cmd);
if (!m_szCaption.IsEmpty())
{
m_bt.SetFont(m_cfont);
m_bt.SetCaption(m_szCaption);
}
// m_bt=m_button;
m_bt.SethIcon(m_hIcon);
m_bt.SetToolTip(m_ToolTip);
m_bt.SetMenu(pMenu);
m_btipo=TRUE;
}
//********************************************************************************
CArrButton::CArrButton(CGuiComboBoxExt* m_pComponent)
{
ASSERT(m_pComponent);
m_pwnd=m_pComponent;
m_btipo=FALSE;
}
//********************************************************************************
BOOL CGuiMiniTool::OnCommand(WPARAM wParam, LPARAM lParam)
{
HWND hwnd = (HWND) lParam;
for (int i=0; i < nNumItems;i++)
{
if (((CArrButton*) m_arrButtons [i])->m_btipo ==TRUE)
if (((CArrButton*) m_arrButtons [i])->m_bt.m_hWnd
== hwnd)
{
int x=((CArrButton*) m_arrButtons [i])->m_bt.GetDlgCtrlID();
CWnd* pParent= GetParent();
pParent->SendMessage (WM_COMMAND,x);
AfxGetMainWnd()->SendMessage(WM_COMMAND,x);
return TRUE;
}
}
return FALSE;
}
CGuiToolButton* CGuiMiniTool::GetButton(UINT uID_Object)//,CGuiToolButton* m_btn)
{
for (int i=0; i < nNumItems;i++)
{
if (((CArrButton*) m_arrButtons [i])->m_btipo ==TRUE)
if (((CArrButton*) m_arrButtons [i])->m_bt.GetDlgCtrlID()==(int signed )uID_Object)
{
CGuiToolButton* m_btn=&((CArrButton*) m_arrButtons [i])->m_bt;
return m_btn;
}
}
return NULL;//m_btn=NULL;
}
void CGuiMiniTool::Drawtext()
{
CClientDC dc(this);
CRect rc;
GetClientRect(rc);
CFont* m_fontOld=dc.SelectObject(&m_cfont);
int nMode = dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(m_clrCaption);
if(m_AlinTexto==ALIGN_LEFT)
{
rc.left+=5;
dc.DrawText(m_Caption,rc,DT_SINGLELINE|DT_LEFT|DT_VCENTER) ;
}
else
{
m_rcDrawTexto.left=(long)(rc.right-msz.cx*1.1);
m_rcDrawTexto.right=m_rcDrawTexto.left+msz.cx;
dc.DrawText(m_Caption,m_rcDrawTexto,DT_SINGLELINE|DT_RIGHT|DT_VCENTER) ;
}
dc.SetBkMode(nMode);
dc.SelectObject(&m_fontOld);
}
//thanks to Ernesto Garcia
void CGuiMiniTool::OnDestroy()
{
for( int i=0; i<nNumItems; i++ )
{
CArrButton *pArr = (CArrButton*)m_arrButtons.GetAt(i);
if( pArr )
delete pArr;
}
CStatic::OnDestroy();
// TODO: Add your message handler code here
}
void CGuiMiniTool::EnableButton(UINT unID, BOOL bEnable)
{
GetButton(unID)->EnableWindow(bEnable);
}
void CGuiMiniTool::SetButtonState(UINT unID, BOOL bPressed)
{
GetButton(unID)->SetState(bPressed);
}
BOOL CGuiMiniTool::GetButtonEnabled(UINT unID)
{
return GetButton(unID)->IsWindowEnabled();
}
BOOL CGuiMiniTool::GetButtonState(UINT unID)
{
return (GetButton(unID)->GetState()&0x0004);
}
void CGuiMiniTool::SetButtonToolTip(UINT unID, LPCTSTR str)
{
GetButton(unID)->SetToolTip(str);
}
void CGuiMiniTool::SetButtonCaption(UINT unID, LPCTSTR str)
{
GetButton(unID)->SetCaption(str);
GetButton(unID)->Invalidate();
GetButton(unID)->UpdateWindow();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -