VC之按钮控件位置大小界面设置

来源:互联网 发布:java float 相等 编辑:程序博客网 时间:2024/05/17 03:16

本文简单介绍下按钮控件的位置大小和界面设置。


首先,新建一个对话框应用程序,并且在界面上添加几个按钮



然后,设置贴图按钮的属性



添加图片资源

 


将第一个图片加载到程序资源中,第二个图片放在资源文件夹中



接着,添加按钮相关变量

CButtonSTm_btn5;CBitmapButtonm_btn4;CBitmapButtonm_btn3;


然后处理

void CButtonUiDlg::SetButtonUI(){//button1 do nothing//button2 set size and positionRECT clientRect;clientRect.left = 200;clientRect.top = 100;clientRect.right = clientRect.left + 100;clientRect.bottom = clientRect.top + 100;GetDlgItem(IDC_BUTTON2)->MoveWindow(&clientRect);//button3 set background get from resourcem_btn3.LoadBitmaps(IDB_BITMAP1);//button4 set background get from file pictureCString sCurrentPath = "";char Path[270];DWORD len = 0;DWORD i = 0;len = GetCurrentDirectory(270,Path);for(i=0;i<len;i++){sCurrentPath = sCurrentPath + CString(Path[i]);}sCurrentPath = sCurrentPath + "/res";CString sFilePathName = sCurrentPath + "/bg2.bmp";m_btn4.LoadBitmaps(sFilePathName);//button5 set background from classm_btn5.SetBtnCursor();m_btn5.SetIcon(m_hIcon);m_btn5.SetTooltipText(&sFilePathName);}


运行程序,查看效果



其中,按钮5使用的类CButtonST来源于网络,附件如下

头文件

////Class:CButtonST////Compiler:Visual C++//Tested on:Visual C++ 5.0////Version:See GetVersionC() or GetVersionI()////Created:xx/xxxx/1998//Updated:19/September/1999////Author:Davide Calabro'davide_calabro@yahoo.com//#ifndef _BTNST_H#define _BTNST_H#if _MSC_VER >= 1000#pragma once#endif // _MSC_VER >= 1000// CBtnST.h : header file//// Comment this if you don't want that CButtonST hilights itself// also when the window is inactive (like happens in Internet Explorer)//#define ST_LIKEIE// Comment this if you don't want to use CMemDC class//#define ST_USE_MEMDC/////////////////////////////////////////////////////////////////////////////// CButtonST windowclass CButtonST : public CButton{// Constructionpublic:    CButtonST();~CButtonST();    enum {ST_ALIGN_HORIZ, ST_ALIGN_VERT, ST_ALIGN_HORIZ_RIGHT};// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides    //{{AFX_VIRTUAL(CButtonST)public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);virtual BOOL PreTranslateMessage(MSG* pMsg);protected:virtual void PreSubclassWindow();virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);//}}AFX_VIRTUAL// Implementationpublic:void DrawTransparent(BOOL bRepaint = FALSE);BOOL GetDefault();void SetTooltipText(int nId, BOOL bActivate = TRUE);void SetTooltipText(CString* spText, BOOL bActivate = TRUE);void ActivateTooltip(BOOL bEnable = TRUE);BOOL SetBtnCursor(int nCursorId = -1);void SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint = FALSE);BOOL GetFlatFocus();void SetDefaultActiveFgColor(BOOL bRepaint = FALSE);void SetActiveFgColor(COLORREF crNew, BOOL bRepaint = FALSE);const COLORREF GetActiveFgColor();void SetDefaultActiveBgColor(BOOL bRepaint = FALSE);void SetActiveBgColor(COLORREF crNew, BOOL bRepaint = FALSE);const COLORREF GetActiveBgColor();void SetDefaultInactiveFgColor(BOOL bRepaint = FALSE);void SetInactiveFgColor(COLORREF crNew, BOOL bRepaint = FALSE);const COLORREF GetInactiveFgColor();void SetDefaultInactiveBgColor(BOOL bRepaint = FALSE);void SetInactiveBgColor(COLORREF crNew, BOOL bRepaint = FALSE);const COLORREF GetInactiveBgColor();void SetShowText(BOOL bShow = TRUE);BOOL GetShowText();void SetAlign(int nAlign);int GetAlign();void SetFlat(BOOL bState = TRUE);BOOL GetFlat();void DrawBorder(BOOL bEnable = TRUE);void SetIcon(int nIconInId, int nIconOutId = NULL);void SetIcon(HICON hIconIn, HICON hIconOut = NULL);static const short GetVersionI();static const char* GetVersionC();protected:    //{{AFX_MSG(CButtonST)afx_msg void OnCaptureChanged(CWnd *pWnd);afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);afx_msg void OnKillFocus(CWnd* pNewWnd);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnSysColorChange();//}}AFX_MSGafx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);DECLARE_MESSAGE_MAP()private:void DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled);void InitToolTip();void PaintBk(CDC* pDC);int m_nAlign;BOOL m_bShowText;BOOL m_bDrawBorder;BOOL m_bIsFlat;BOOL m_MouseOnButton;BOOL m_bDrawFlatFocus;HCURSOR m_hCursor;CToolTipCtrl m_ToolTip;HICON m_hIconIn;HICON m_hIconOut;BYTE m_cyIcon;BYTE m_cxIcon;CDC m_dcBk;CBitmap m_bmpBk;CBitmap* m_pbmpOldBk;BOOL m_bDrawTransparent;BOOL m_bIsDefault;COLORREF  m_crInactiveBg;    COLORREF  m_crInactiveFg;    COLORREF  m_crActiveBg;    COLORREF  m_crActiveFg;};#ifdef ST_USE_MEMDC//////////////////////////////////////////////////// CMemDC - memory DC//// Author: Keith Rule// Email:  keithr@europa.com// Copyright 1996-1997, Keith Rule//// You may freely use or modify this code provided this// Copyright is included in all derived versions.//// History - 10/3/97 Fixed scrolling bug.//                   Added print support.//           25 feb 98 - fixed minor assertion bug//// This class implements a memory Device Contextclass CMemDC : public CDC{public:    // constructor sets up the memory DC    CMemDC(CDC* pDC) : CDC()    {        ASSERT(pDC != NULL);        m_pDC = pDC;        m_pOldBitmap = NULL;        m_bMemDC = !pDC->IsPrinting();                      if (m_bMemDC)    // Create a Memory DC        {            pDC->GetClipBox(&m_rect);            CreateCompatibleDC(pDC);            m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());            m_pOldBitmap = SelectObject(&m_bitmap);            SetWindowOrg(m_rect.left, m_rect.top);        }        else        // Make a copy of the relevent parts of the current DC for printing        {            m_bPrinting = pDC->m_bPrinting;            m_hDC       = pDC->m_hDC;            m_hAttribDC = pDC->m_hAttribDC;        }    }        // Destructor copies the contents of the mem DC to the original DC    ~CMemDC()    {        if (m_bMemDC)         {                // Copy the offscreen bitmap onto the screen.            m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),                          this, m_rect.left, m_rect.top, SRCCOPY);            //Swap back the original bitmap.            SelectObject(m_pOldBitmap);        } else {            // All we need to do is replace the DC with an illegal value,            // this keeps us from accidently deleting the handles associated with            // the CDC that was passed to the constructor.            m_hDC = m_hAttribDC = NULL;        }    }    // Allow usage as a pointer    CMemDC* operator->() {return this;}            // Allow usage as a pointer    operator CMemDC*() {return this;}private:    CBitmap  m_bitmap;      // Offscreen bitmap    CBitmap* m_pOldBitmap;  // bitmap originally found in CMemDC    CDC*     m_pDC;         // Saves CDC passed in constructor    CRect    m_rect;        // Rectangle of drawing area.    BOOL     m_bMemDC;      // TRUE if CDC really is a Memory DC.};#endif///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Developer Studio will insert additional declarations immediately before the previous line.#endif

源文件

#include "stdafx.h"#include "BtnST.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CButtonSTCButtonST::CButtonST(){m_MouseOnButton = FALSE;m_hIconIn = NULL;m_hIconOut = NULL;m_cxIcon = 0;m_cyIcon = 0;m_hCursor = NULL;  // Default type is "flat" buttonm_bIsFlat = TRUE;   // By default draw border in "flat" button m_bDrawBorder = TRUE;   // By default icon is aligned horizontallym_nAlign = ST_ALIGN_HORIZ;   // By default show the text buttonm_bShowText = TRUE;   // By default, for "flat" button, don't draw the focus rectm_bDrawFlatFocus = FALSE;// By default the button is not the default buttonm_bIsDefault = FALSE;SetDefaultInactiveBgColor();SetDefaultInactiveFgColor();SetDefaultActiveBgColor();SetDefaultActiveFgColor();// No tooltip createdm_ToolTip.m_hWnd = NULL;// Do not draw as a transparent buttonm_bDrawTransparent = FALSE;m_pbmpOldBk = NULL;} // End of CButtonSTCButtonST::~CButtonST(){// Restore old bitmap (if any)if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL){m_dcBk.SelectObject(m_pbmpOldBk);}// Destroy the icons (if any)// Note: the following two lines MUST be here! even if// BoundChecker says they are unnecessary!if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn);if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut);// Destroy the cursor (if any)if (m_hCursor != NULL) ::DestroyCursor(m_hCursor);} // End of ~CButtonSTBEGIN_MESSAGE_MAP(CButtonST, CButton)    //{{AFX_MSG_MAP(CButtonST)ON_WM_CAPTURECHANGED()ON_WM_SETCURSOR()ON_WM_KILLFOCUS()ON_WM_MOUSEMOVE()ON_WM_CTLCOLOR_REFLECT()ON_WM_SYSCOLORCHANGE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()void CButtonST::SetIcon(int nIconInId, int nIconOutId){HICON hIconIn;HICON hIconOut;HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId), RT_GROUP_ICON);// Set icon when the mouse is IN the buttonhIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);  // Set icon when the mouse is OUT the buttonhIconOut = (nIconOutId == NULL) ? NULL : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);SetIcon(hIconIn, hIconOut);/*// Note: the following two lines MUST be here! even if// BoundChecker says they are unnecessary!if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn);if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut);// Set icon when the mouse is IN the buttonm_hIconIn = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);  // Set icon when the mouse is OUT the buttonm_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);  ICONINFO ii;// Get icon dimensionZeroMemory(&ii, sizeof(ICONINFO));::GetIconInfo(m_hIconIn, &ii);m_cxIcon = (BYTE)(ii.xHotspot * 2);m_cyIcon = (BYTE)(ii.yHotspot * 2);    ::DeleteObject(ii.hbmMask);::DeleteObject(ii.hbmColor);RedrawWindow();*/} // End of SetIconvoid CButtonST::SetIcon(HICON hIconIn, HICON hIconOut){// Note: the following two lines MUST be here! even if// BoundChecker says they are unnecessary!if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn);if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut);// Set icon when the mouse is IN the buttonm_hIconIn = hIconIn;// Set icon when the mouse is OUT the buttonm_hIconOut = (hIconOut == NULL) ? m_hIconIn : hIconOut;  ICONINFO ii;// Get icon dimensionZeroMemory(&ii, sizeof(ICONINFO));::GetIconInfo(m_hIconIn, &ii);m_cxIcon = (BYTE)(ii.xHotspot * 2);m_cyIcon = (BYTE)(ii.yHotspot * 2);    ::DeleteObject(ii.hbmMask);::DeleteObject(ii.hbmColor);RedrawWindow();} // End of SetIconBOOL CButtonST::SetBtnCursor(int nCursorId){HINSTANCE hInstResource;// Destroy any previous cursorif (m_hCursor != NULL) ::DestroyCursor(m_hCursor);m_hCursor = NULL;// If we want a cursorif (nCursorId != -1){hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId),RT_GROUP_CURSOR);// Load icon resourcem_hCursor = (HCURSOR)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nCursorId), IMAGE_CURSOR, 0, 0, 0);// If something wrong then return FALSEif (m_hCursor == NULL) return FALSE;}return TRUE;} // End of SetBtnCursorvoid CButtonST::SetFlat(BOOL bState){  m_bIsFlat = bState;  Invalidate();} // End of SetFlatBOOL CButtonST::GetFlat(){  return m_bIsFlat;} // End of GetFlatvoid CButtonST::SetAlign(int nAlign){  switch (nAlign)  {        case ST_ALIGN_HORIZ:         m_nAlign = ST_ALIGN_HORIZ;         break;    case ST_ALIGN_HORIZ_RIGHT:         m_nAlign = ST_ALIGN_HORIZ_RIGHT;         break;    case ST_ALIGN_VERT:         m_nAlign = ST_ALIGN_VERT;         break;  }  Invalidate();} // End of SetAlignint CButtonST::GetAlign(){  return m_nAlign;} // End of GetAlignvoid CButtonST::DrawBorder(BOOL bEnable){  m_bDrawBorder = bEnable;} // End of DrawBorderconst char* CButtonST::GetVersionC(){  return "2.6";} // End of GetVersionCconst short CButtonST::GetVersionI(){  return 26; // Divide by 10 to get actual version} // End of GetVersionIvoid CButtonST::SetShowText(BOOL bShow){  m_bShowText = bShow;  Invalidate();} // End of SetShowTextBOOL CButtonST::GetShowText(){  return m_bShowText;} // End of GetShowTextvoid CButtonST::OnMouseMove(UINT nFlags, CPoint point){CWnd* pWnd;  // Finestra attivaCWnd* pParent; // Finestra che contiene il bottoneCButton::OnMouseMove(nFlags, point);// If the mouse enter the button with the left button pressed// then do nothingif (nFlags & MK_LBUTTON && m_MouseOnButton == FALSE) return;// If our button is not flat then do nothingif (m_bIsFlat == FALSE) return;pWnd = GetActiveWindow();pParent = GetOwner();if ((GetCapture() != this) && (#ifndef ST_LIKEIEpWnd != NULL && #endifpParent != NULL)) {m_MouseOnButton = TRUE;//SetFocus();// Thanks Ralph!SetCapture();Invalidate();}else{/*CRect rc;GetClientRect(&rc);if (!rc.PtInRect(point)){*/POINT p2 = point;ClientToScreen(&p2);CWnd* wndUnderMouse = WindowFromPoint(p2);//if (wndUnderMouse != this)if (wndUnderMouse && wndUnderMouse->m_hWnd != this->m_hWnd){// Redraw only if mouse goes outif (m_MouseOnButton == TRUE){m_MouseOnButton = FALSE;Invalidate();}// If user is NOT pressing left button then release capture!if (!(nFlags & MK_LBUTTON)) ReleaseCapture();}}} // End of OnMouseMovevoid CButtonST::OnKillFocus(CWnd * pNewWnd){  CButton::OnKillFocus(pNewWnd);  // If our button is not flat then do nothing  if (m_bIsFlat == FALSE) return;  if (m_MouseOnButton == TRUE)  {    m_MouseOnButton = FALSE;    Invalidate();  }} // End of OnKillFocusvoid CButtonST::OnCaptureChanged(CWnd *pWnd) {if (m_MouseOnButton == TRUE){ReleaseCapture();Invalidate();}// Call base message handlerCButton::OnCaptureChanged(pWnd);} // End of OnCaptureChangedvoid CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS){#ifdef ST_USE_MEMDC  CDC  *pdrawDC = CDC::FromHandle(lpDIS->hDC);  CMemDC memDC(pdrawDC);  CDC  *pDC = &memDC;#else  CDC* pDC = CDC::FromHandle(lpDIS->hDC);#endif  CPen *pOldPen;  BOOL bIsPressed  = (lpDIS->itemState & ODS_SELECTED);  BOOL bIsFocused  = (lpDIS->itemState & ODS_FOCUS);  BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);  CRect itemRect = lpDIS->rcItem;  pDC->SetBkMode(TRANSPARENT);  if (m_bIsFlat == FALSE)  {    if (bIsFocused || (GetDefault() == TRUE))    {      CBrush br(RGB(0,0,0));        pDC->FrameRect(&itemRect, &br);      itemRect.DeflateRect(1, 1);    }  }  // Prepare draw... paint button's area with background color  COLORREF bgColor;  if ((m_MouseOnButton == TRUE) || (bIsPressed))    bgColor = GetActiveBgColor();  else    bgColor = GetInactiveBgColor();CBrush br(bgColor);// Draw transparent?if (m_bDrawTransparent == TRUE){PaintBk(pDC);}else{pDC->FillRect(&itemRect, &br);}// Disegno lo sfondo del bottone//CBrush br(GetSysColor(COLOR_BTNFACE));  //pDC->FillRect(&itemRect, &br);  // Draw pressed button  if (bIsPressed)  {    if (m_bIsFlat == TRUE)    {      if (m_bDrawBorder == TRUE)      {  pDC->Draw3dRect(itemRect, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT));/*    CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // Bianco        CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Grigio scuro        // Disegno i bordi a sinistra e in alto        // Dark gray line        pOldPen = pDC->SelectObject(&penBtnShadow);        pDC->MoveTo(itemRect.left, itemRect.bottom-1);        pDC->LineTo(itemRect.left, itemRect.top);        pDC->LineTo(itemRect.right, itemRect.top);        // Disegno i bordi a destra e in basso        // White line        pDC->SelectObject(penBtnHiLight);        pDC->MoveTo(itemRect.left, itemRect.bottom-1);        pDC->LineTo(itemRect.right-1, itemRect.bottom-1);        pDC->LineTo(itemRect.right-1, itemRect.top-1);        //        pDC->SelectObject(pOldPen);*/      }    }    else        {      CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));      pDC->FrameRect(&itemRect, &brBtnShadow);    }  }  else // ...else draw non pressed button  {    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    if (m_bIsFlat == TRUE)    {      if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE)      {  pDC->Draw3dRect(itemRect, ::GetSysColor(COLOR_BTNHILIGHT), ::GetSysColor(COLOR_BTNSHADOW));/*      // Disegno i bordi a sinistra e in alto        // White line        pOldPen = pDC->SelectObject(&penBtnHiLight);        pDC->MoveTo(itemRect.left, itemRect.bottom-1);        pDC->LineTo(itemRect.left, itemRect.top);        pDC->LineTo(itemRect.right, itemRect.top);        // Disegno i bordi a destra e in basso        // Dark gray line        pDC->SelectObject(penBtnShadow);        pDC->MoveTo(itemRect.left, itemRect.bottom-1);        pDC->LineTo(itemRect.right-1, itemRect.bottom-1);        pDC->LineTo(itemRect.right-1, itemRect.top-1);        //        pDC->SelectObject(pOldPen);*/      }    }    else    {      // Disegno i bordi a sinistra e in alto      // White line      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's title  CString sTitle;  GetWindowText(sTitle);  // If we don't want the title displayed  if (m_bShowText == FALSE) sTitle.Empty();  CRect captionRect = lpDIS->rcItem;  // Draw the icon  if (m_hIconIn != NULL)  {    DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled);  }  // Write the button title (if any)  if (sTitle.IsEmpty() == FALSE)  {    // Disegno la caption del bottone    // Se il bottone e' premuto muovo la captionRect di conseguenza    if (bIsPressed)      captionRect.OffsetRect(1, 1);        // ONLY FOR DEBUG     // Evidenzia il rettangolo in cui verra' centrata la caption     //CBrush brBtnShadow(RGB(255, 0, 0));    //pDC->FrameRect(&captionRect, &brBtnShadow);#ifdef ST_USE_MEMDC// Get dialog's font    CFont *pCurrentFont = GetFont();     CFont *pOldFont = pDC->SelectObject(pCurrentFont);#endif    if ((m_MouseOnButton == TRUE) || (bIsPressed)) {      pDC->SetTextColor(GetActiveFgColor());      pDC->SetBkColor(GetActiveBgColor());    } else {      pDC->SetTextColor(GetInactiveFgColor());      pDC->SetBkColor(GetInactiveBgColor());    }    // Center text    CRect centerRect = captionRect;    pDC->DrawText(sTitle, -1, captionRect, DT_SINGLELINE|DT_CALCRECT);    captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);/* RFU    captionRect.OffsetRect(0, (centerRect.Height() - captionRect.Height())/2);    captionRect.OffsetRect((centerRect.Width() - captionRect.Width())-4, (centerRect.Height() - captionRect.Height())/2);*/pDC->SetBkMode(TRANSPARENT);    pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)sTitle, (bIsDisabled ? DSS_DISABLED : DSS_NORMAL),                    TRUE, 0, (CBrush*)NULL);#ifdef ST_USE_MEMDC    pDC->SelectObject(pOldFont);#endif  }  if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE))  {    // Draw the focus rect    if (bIsFocused)    {      CRect focusRect = itemRect;      focusRect.DeflateRect(3, 3);      pDC->DrawFocusRect(&focusRect);    }  }} // End of DrawItemvoid CButtonST::DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled){CRect iconRect = rcItem;CRect btnRect;  switch (m_nAlign)  {    case ST_ALIGN_HORIZ:         if (title->IsEmpty())         {           // Center the icon horizontally           iconRect.left += ((iconRect.Width() - m_cxIcon)/2);         }         else         {           // L'icona deve vedersi subito dentro il focus rect           iconRect.left += 3;             captionRect->left += m_cxIcon + 3;         }         // Center the icon vertically         iconRect.top += ((iconRect.Height() - m_cyIcon)/2);         break;case ST_ALIGN_HORIZ_RIGHT:GetClientRect(&btnRect);if (title->IsEmpty()){// Center the icon horizontallyiconRect.left += ((iconRect.Width() - m_cxIcon)/2);}else{// L'icona deve vedersi subito dentro il focus rectcaptionRect->right = captionRect->Width() - m_cxIcon - 3;captionRect->left = 3;iconRect.left = btnRect.right - m_cxIcon - 3;// Center the icon verticallyiconRect.top += ((iconRect.Height() - m_cyIcon)/2);}break;    case ST_ALIGN_VERT:         // Center the icon horizontally         iconRect.left += ((iconRect.Width() - m_cxIcon)/2);         if (title->IsEmpty())         {           // Center the icon vertically           iconRect.top += ((iconRect.Height() - m_cyIcon)/2);                    }         else         {           captionRect->top += m_cyIcon;         }         break;  }      // If button is pressed then press the icon also  if (IsPressed) iconRect.OffsetRect(1, 1);  // Ole'!  pDC->DrawState(iconRect.TopLeft(),iconRect.Size(), (m_MouseOnButton == TRUE || IsPressed) ? m_hIconIn : m_hIconOut, (IsDisabled ? DSS_DISABLED : DSS_NORMAL), (CBrush*)NULL);} // End of DrawTheIconvoid CButtonST::PreSubclassWindow() {UINT nBS;nBS = GetButtonStyle();// Check if this is the default buttonif (nBS & BS_DEFPUSHBUTTON) m_bIsDefault = TRUE;// Add BS_OWNERDRAW styleSetButtonStyle(nBS | BS_OWNERDRAW);CButton::PreSubclassWindow();} // End of PreSubclassWindowBOOL CButtonST::PreTranslateMessage(MSG* pMsg) {InitToolTip();m_ToolTip.RelayEvent(pMsg);return CButton::PreTranslateMessage(pMsg);} // End of PreTranslateMessageLRESULT CButtonST::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) {if (message == WM_LBUTTONDBLCLK){message = WM_LBUTTONDOWN;}return CButton::DefWindowProc(message, wParam, lParam);} // End of DefWindowProcvoid CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint){m_crInactiveBg = ::GetSysColor(COLOR_BTNFACE); if (bRepaint == TRUE) Invalidate();} // End of SetDefaultInactiveBgColorvoid CButtonST::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint){m_crInactiveBg = crNew; if (bRepaint == TRUE) Invalidate();} // End of SetInactiveBgColorconst COLORREF CButtonST::GetInactiveBgColor(){return m_crInactiveBg;} // End of GetInactiveBgColorvoid CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint){m_crInactiveFg = ::GetSysColor(COLOR_BTNTEXT); if (bRepaint == TRUE) Invalidate();} // End of SetDefaultInactiveFgColorvoid CButtonST::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint){m_crInactiveFg = crNew; if (bRepaint == TRUE) Invalidate();} // End of SetInactiveFgColorconst COLORREF CButtonST::GetInactiveFgColor(){return m_crInactiveFg;} // End of GetInactiveFgColorvoid CButtonST::SetDefaultActiveBgColor(BOOL bRepaint){m_crActiveBg = ::GetSysColor(COLOR_BTNFACE); if (bRepaint == TRUE) Invalidate();} // End of SetDefaultActiveBgColorvoid CButtonST::SetActiveBgColor(COLORREF crNew, BOOL bRepaint){m_crActiveBg = crNew; if (bRepaint == TRUE) Invalidate();} // End of SetActiveBgColorconst COLORREF CButtonST::GetActiveBgColor(){return m_crActiveBg;} // End of GetActiveBgColorvoid CButtonST::SetDefaultActiveFgColor(BOOL bRepaint){m_crActiveFg = ::GetSysColor(COLOR_BTNTEXT); if (bRepaint == TRUE) Invalidate();} // End of SetDefaultActiveFgColorvoid CButtonST::SetActiveFgColor(COLORREF crNew, BOOL bRepaint){m_crActiveFg = crNew; if (bRepaint == TRUE) Invalidate();} // End of SetActiveFgColorconst COLORREF CButtonST::GetActiveFgColor(){return m_crActiveFg;} // End of GetActiveFgColorvoid CButtonST::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint){m_bDrawFlatFocus = bDrawFlatFocus;// Repaint the buttonif (bRepaint == TRUE) Invalidate();} // End of SetFlatFocusBOOL CButtonST::GetFlatFocus(){return m_bDrawFlatFocus;} // End of GetFlatFocusBOOL CButtonST::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {// If a cursor was specified then use it!if (m_hCursor != NULL){::SetCursor(m_hCursor);return TRUE;}return CButton::OnSetCursor(pWnd, nHitTest, message);} // End of OnSetCursorvoid CButtonST::SetTooltipText(CString* spText, BOOL bActivate){// We cannot accept NULL pointerif (spText == NULL) return;// Initialize ToolTipInitToolTip();// If there is no tooltip defined then add itif (m_ToolTip.GetToolCount() == 0){CRect rectBtn; GetClientRect(rectBtn);m_ToolTip.AddTool(this, (LPCTSTR)*spText, rectBtn, 1);}// Set text for tooltipm_ToolTip.UpdateTipText((LPCTSTR)*spText, this, 1);m_ToolTip.Activate(bActivate);} // End of SetTooltipTextvoid CButtonST::SetTooltipText(int nId, BOOL bActivate){CString sText;// load string resourcesText.LoadString(nId);// If string resource is not emptyif (sText.IsEmpty() == FALSE) SetTooltipText(&sText, bActivate);} // End of SetTooltipTextvoid CButtonST::ActivateTooltip(BOOL bActivate){// If there is no tooltip then do nothingif (m_ToolTip.GetToolCount() == 0) return;// Activate tooltipm_ToolTip.Activate(bActivate);} // End of EnableTooltipBOOL CButtonST::GetDefault(){return m_bIsDefault;} // End of GetDefaultvoid CButtonST::DrawTransparent(BOOL bRepaint){m_bDrawTransparent = TRUE;// Restore old bitmap (if any)if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL){m_dcBk.SelectObject(m_pbmpOldBk);}m_bmpBk.Detach();m_dcBk.Detach();// Repaint the buttonif (bRepaint == TRUE) Invalidate();} // End of DrawTransparentvoid CButtonST::InitToolTip(){if (m_ToolTip.m_hWnd == NULL){// Create ToolTip controlm_ToolTip.Create(this);// Create inactivem_ToolTip.Activate(FALSE);}} // End of InitToolTipvoid CButtonST::PaintBk(CDC * pDC){CClientDC clDC(GetParent());CRect rect;CRect rect1;GetClientRect(rect);GetWindowRect(rect1);GetParent()->ScreenToClient(rect1);if (m_dcBk.m_hDC == NULL){m_dcBk.CreateCompatibleDC(&clDC);m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);}pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY);} // End of PaintBkHBRUSH CButtonST::CtlColor(CDC* pDC, UINT nCtlColor) {return (HBRUSH)::GetStockObject(NULL_BRUSH); } // End of CtlColorvoid CButtonST::OnSysColorChange() {CButton::OnSysColorChange();m_dcBk.DeleteDC();m_bmpBk.DeleteObject();} // End of OnSysColorChange#undef ST_USE_MEMDC#undef ST_LIKEIE

源码下载


0 0