VC之按钮控件位置大小界面设置
2015-04-05 18:30
323 查看
本文简单介绍下按钮控件的位置大小和界面设置。
首先,新建一个对话框应用程序,并且在界面上添加几个按钮
然后,设置贴图按钮的属性
添加图片资源
将第一个图片加载到程序资源中,第二个图片放在资源文件夹中
接着,添加按钮相关变量
然后处理
运行程序,查看效果
其中,按钮5使用的类CButtonST来源于网络,附件如下
头文件
源文件
源码下载
首先,新建一个对话框应用程序,并且在界面上添加几个按钮
然后,设置贴图按钮的属性
添加图片资源
将第一个图片加载到程序资源中,第二个图片放在资源文件夹中
接着,添加按钮相关变量
CButtonST m_btn5; CBitmapButton m_btn4; CBitmapButton m_btn3;
然后处理
void CButtonUiDlg::SetButtonUI() { //button1 do nothing //button2 set size and position RECT 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 resource m_btn3.LoadBitmaps(IDB_BITMAP1); //button4 set background get from file picture CString 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 class m_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 window class CButtonST : public CButton { // Construction public: CButtonST(); ~CButtonST(); enum {ST_ALIGN_HORIZ, ST_ALIGN_VERT, ST_ALIGN_HORIZ_RIGHT}; // Attributes public: // Operations public: // 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 // Implementation public: 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_MSG afx_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 Context class 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_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CButtonST CButtonST::CButtonST() { m_MouseOnButton = FALSE; m_hIconIn = NULL; m_hIconOut = NULL; m_cxIcon = 0; m_cyIcon = 0; m_hCursor = NULL; // Default type is "flat" button m_bIsFlat = TRUE; // By default draw border in "flat" button m_bDrawBorder = TRUE; // By default icon is aligned horizontally m_nAlign = ST_ALIGN_HORIZ; // By default show the text button m_bShowText = TRUE; // By default, for "flat" button, don't draw the focus rect m_bDrawFlatFocus = FALSE; // By default the button is not the default button m_bIsDefault = FALSE; SetDefaultInactiveBgColor(); SetDefaultInactiveFgColor(); SetDefaultActiveBgColor(); SetDefaultActiveFgColor(); // No tooltip created m_ToolTip.m_hWnd = NULL; // Do not draw as a transparent button m_bDrawTransparent = FALSE; m_pbmpOldBk = NULL; } // End of CButtonST CButtonST::~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 ~CButtonST BEGIN_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_MAP END_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 button hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0); // Set icon when the mouse is OUT the button hIconOut = (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 button m_hIconIn = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0); // Set icon when the mouse is OUT the button m_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0); ICONINFO ii; // Get icon dimension ZeroMemory(&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 SetIcon void 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 button m_hIconIn = hIconIn; // Set icon when the mouse is OUT the button m_hIconOut = (hIconOut == NULL) ? m_hIconIn : hIconOut; ICONINFO ii; // Get icon dimension ZeroMemory(&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 SetIcon BOOL CButtonST::SetBtnCursor(int nCursorId) { HINSTANCE hInstResource; // Destroy any previous cursor if (m_hCursor != NULL) ::DestroyCursor(m_hCursor); m_hCursor = NULL; // If we want a cursor if (nCursorId != -1) { hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId), RT_GROUP_CURSOR); // Load icon resource m_hCursor = (HCURSOR)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nCursorId), IMAGE_CURSOR, 0, 0, 0); // If something wrong then return FALSE if (m_hCursor == NULL) return FALSE; } return TRUE; } // End of SetBtnCursor void CButtonST::SetFlat(BOOL bState) { m_bIsFlat = bState; Invalidate(); } // End of SetFlat BOOL CButtonST::GetFlat() { return m_bIsFlat; } // End of GetFlat void 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 SetAlign int CButtonST::GetAlign() { return m_nAlign; } // End of GetAlign void CButtonST::DrawBorder(BOOL bEnable) { m_bDrawBorder = bEnable; } // End of DrawBorder const char* CButtonST::GetVersionC() { return "2.6"; } // End of GetVersionC const short CButtonST::GetVersionI() { return 26; // Divide by 10 to get actual version } // End of GetVersionI void CButtonST::SetShowText(BOOL bShow) { m_bShowText = bShow; Invalidate(); } // End of SetShowText BOOL CButtonST::GetShowText() { return m_bShowText; } // End of GetShowText void CButtonST::OnMouseMove(UINT nFlags, CPoint point) { CWnd* pWnd; // Finestra attiva CWnd* pParent; // Finestra che contiene il bottone CButton::OnMouseMove(nFlags, point); // If the mouse enter the button with the left button pressed // then do nothing if (nFlags & MK_LBUTTON && m_MouseOnButton == FALSE) return; // If our button is not flat then do nothing if (m_bIsFlat == FALSE) return; pWnd = GetActiveWindow(); pParent = GetOwner(); if ((GetCapture() != this) && ( #ifndef ST_LIKEIE pWnd != NULL && #endif pParent != 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 out if (m_MouseOnButton == TRUE) { m_MouseOnButton = FALSE; Invalidate(); } // If user is NOT pressing left button then release capture! if (!(nFlags & MK_LBUTTON)) ReleaseCapture(); } } } // End of OnMouseMove void 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 OnKillFocus void CButtonST::OnCaptureChanged(CWnd *pWnd) { if (m_MouseOnButton == TRUE) { ReleaseCapture(); Invalidate(); } // Call base message handler CButton::OnCaptureChanged(pWnd); } // End of OnCaptureChanged void 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 DrawItem void 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 horizontally iconRect.left += ((iconRect.Width() - m_cxIcon)/2); } else { // L'icona deve vedersi subito dentro il focus rect captionRect->right = captionRect->Width() - m_cxIcon - 3; captionRect->left = 3; iconRect.left = btnRect.right - m_cxIcon - 3; // Center the icon vertically iconRect.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 DrawTheIcon void CButtonST::PreSubclassWindow() { UINT nBS; nBS = GetButtonStyle(); // Check if this is the default button if (nBS & BS_DEFPUSHBUTTON) m_bIsDefault = TRUE; // Add BS_OWNERDRAW style SetButtonStyle(nBS | BS_OWNERDRAW); CButton::PreSubclassWindow(); } // End of PreSubclassWindow BOOL CButtonST::PreTranslateMessage(MSG* pMsg) { InitToolTip(); m_ToolTip.RelayEvent(pMsg); return CButton::PreTranslateMessage(pMsg); } // End of PreTranslateMessage LRESULT CButtonST::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_LBUTTONDBLCLK) { message = WM_LBUTTONDOWN; } return CButton::DefWindowProc(message, wParam, lParam); } // End of DefWindowProc void CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint) { m_crInactiveBg = ::GetSysColor(COLOR_BTNFACE); if (bRepaint == TRUE) Invalidate(); } // End of SetDefaultInactiveBgColor void CButtonST::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint) { m_crInactiveBg = crNew; if (bRepaint == TRUE) Invalidate(); } // End of SetInactiveBgColor const COLORREF CButtonST::GetInactiveBgColor() { return m_crInactiveBg; } // End of GetInactiveBgColor void CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint) { m_crInactiveFg = ::GetSysColor(COLOR_BTNTEXT); if (bRepaint == TRUE) Invalidate(); } // End of SetDefaultInactiveFgColor void CButtonST::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint) { m_crInactiveFg = crNew; if (bRepaint == TRUE) Invalidate(); } // End of SetInactiveFgColor const COLORREF CButtonST::GetInactiveFgColor() { return m_crInactiveFg; } // End of GetInactiveFgColor void CButtonST::SetDefaultActiveBgColor(BOOL bRepaint) { m_crActiveBg = ::GetSysColor(COLOR_BTNFACE); if (bRepaint == TRUE) Invalidate(); } // End of SetDefaultActiveBgColor void CButtonST::SetActiveBgColor(COLORREF crNew, BOOL bRepaint) { m_crActiveBg = crNew; if (bRepaint == TRUE) Invalidate(); } // End of SetActiveBgColor const COLORREF CButtonST::GetActiveBgColor() { return m_crActiveBg; } // End of GetActiveBgColor void CButtonST::SetDefaultActiveFgColor(BOOL bRepaint) { m_crActiveFg = ::GetSysColor(COLOR_BTNTEXT); if (bRepaint == TRUE) Invalidate(); } // End of SetDefaultActiveFgColor void CButtonST::SetActiveFgColor(COLORREF crNew, BOOL bRepaint) { m_crActiveFg = crNew; if (bRepaint == TRUE) Invalidate(); } // End of SetActiveFgColor const COLORREF CButtonST::GetActiveFgColor() { return m_crActiveFg; } // End of GetActiveFgColor void CButtonST::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint) { m_bDrawFlatFocus = bDrawFlatFocus; // Repaint the button if (bRepaint == TRUE) Invalidate(); } // End of SetFlatFocus BOOL CButtonST::GetFlatFocus() { return m_bDrawFlatFocus; } // End of GetFlatFocus BOOL 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 OnSetCursor void CButtonST::SetTooltipText(CString* spText, BOOL bActivate) { // We cannot accept NULL pointer if (spText == NULL) return; // Initialize ToolTip InitToolTip(); // If there is no tooltip defined then add it if (m_ToolTip.GetToolCount() == 0) { CRect rectBtn; GetClientRect(rectBtn); m_ToolTip.AddTool(this, (LPCTSTR)*spText, rectBtn, 1); } // Set text for tooltip m_ToolTip.UpdateTipText((LPCTSTR)*spText, this, 1); m_ToolTip.Activate(bActivate); } // End of SetTooltipText void CButtonST::SetTooltipText(int nId, BOOL bActivate) { CString sText; // load string resource sText.LoadString(nId); // If string resource is not empty if (sText.IsEmpty() == FALSE) SetTooltipText(&sText, bActivate); } // End of SetTooltipText void CButtonST::ActivateTooltip(BOOL bActivate) { // If there is no tooltip then do nothing if (m_ToolTip.GetToolCount() == 0) return; // Activate tooltip m_ToolTip.Activate(bActivate); } // End of EnableTooltip BOOL CButtonST::GetDefault() { return m_bIsDefault; } // End of GetDefault void 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 button if (bRepaint == TRUE) Invalidate(); } // End of DrawTransparent void CButtonST::InitToolTip() { if (m_ToolTip.m_hWnd == NULL) { // Create ToolTip control m_ToolTip.Create(this); // Create inactive m_ToolTip.Activate(FALSE); } } // End of InitToolTip void 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 PaintBk HBRUSH CButtonST::CtlColor(CDC* pDC, UINT nCtlColor) { return (HBRUSH)::GetStockObject(NULL_BRUSH); } // End of CtlColor void CButtonST::OnSysColorChange() { CButton::OnSysColorChange(); m_dcBk.DeleteDC(); m_bmpBk.DeleteObject(); } // End of OnSysColorChange #undef ST_USE_MEMDC #undef ST_LIKEIE
源码下载
相关文章推荐
- easysize的使用方法 (实现控件大小位置随界面变化而有相应的变化,这个变化可以自己设置)
- VC++之随父窗口变化调整控件大小 (没有位置)
- VC.NET界面编程中关于的ToolBar(工具栏)的编程应用(二)2008/07/01 19:22 上回说到给工具栏上添加IE风格的下拉菜单按钮,我们通过设置工具栏按钮的风格已经完成了下拉菜单按钮的添加,现在我们准备为下拉菜单按钮中响应下拉箭头部分的实现
- VC设置控件的字体颜色和背景颜色和字体大小和样式
- android 获取控件大小和设置调整控件的位置XY
- android 获取控件大小和设置调整控件的位置XY
- VC中自动改变控件位置和大小的对话框类(转)
- VC中自动改变控件位置和大小的对话框类[转]
- VC中自动改变控件位置和大小的对话框类
- [转]VC++之随父窗口变化调整控件大小/位置
- MFC窗口最大化&移动窗口位置&获取控件句柄,设置控件大小
- VC中自动改变控件位置和大小的对话框类
- VC改变控件或对话框的大小和位置方法
- VC++界面处理中怎样设置默认按钮
- VC中自动改变控件位置和大小的对话框类
- VC中自动改变控件位置和大小的对话框类
- 《VC中自动改变控件位置和大小的对话框类》详细使用方法
- 写一个方法进行各种属性的更新,而不要每个界面设置改变都改变一个属性。就是点击应用或确定按钮时调用这个更新属性的方法,遍历所有(控制对象属性的)界面控件的状态(值),进行属性修改和刷新。
- 金山界面库—控件字体样式的设置(大小,颜色)
- android 获取控件大小和设置调整控件的位置XY