⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cebtnst.cpp

📁 EVC6下非常好的按钮贴图
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//
// Parameters:
//		[IN]	bRepaint
//				If TRUE the control will be repainted.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//
DWORD CCeButtonST::SetDefaultColors(BOOL bRepaint)
{
    m_crColors[BTNST_COLOR_BK_IN] = ::GetSysColor(COLOR_BTNFACE);
    m_crColors[BTNST_COLOR_FG_IN] = ::GetSysColor(COLOR_BTNTEXT);
    m_crColors[BTNST_COLOR_BK_OUT] = ::GetSysColor(COLOR_BTNFACE);
    m_crColors[BTNST_COLOR_FG_OUT] = ::GetSysColor(COLOR_BTNTEXT);
    m_crColors[BTNST_COLOR_BK_FOCUS] = ::GetSysColor(COLOR_BTNFACE);
    m_crColors[BTNST_COLOR_FG_FOCUS] = ::GetSysColor(COLOR_BTNTEXT);

    if (bRepaint)
        Invalidate();

    return BTNST_OK;
} // End of SetDefaultColors

// This function sets the color to use for a particular state.
//
// Parameters:
//		[IN]	byColorIndex
//				Index of the color to set. Can be one of the following values:
//				BTNST_COLOR_BK_IN		Background color when mouse is over the button
//				BTNST_COLOR_FG_IN		Text color when mouse is over the button
//				BTNST_COLOR_BK_OUT		Background color when mouse is outside the button
//				BTNST_COLOR_FG_OUT		Text color when mouse is outside the button
//				BTNST_COLOR_BK_FOCUS	Background color when the button is focused
//				BTNST_COLOR_FG_FOCUS	Text color when the button is focused
//		[IN]	crColor
//				New color.
//		[IN]	bRepaint
//				If TRUE the control will be repainted.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//		BTNST_INVALIDINDEX
//			Invalid color index.
//
DWORD CCeButtonST::SetColor(BYTE byColorIndex, COLORREF crColor, BOOL bRepaint)
{
    if (byColorIndex >= BTNST_MAX_COLORS)
        return BTNST_INVALIDINDEX;

    // Set new color
    m_crColors[byColorIndex] = crColor;

    if (bRepaint)
        Invalidate();

    return BTNST_OK;
} // End of SetColor

// This functions returns the color used for a particular state.
//
// Parameters:
//		[IN]	byColorIndex
//				Index of the color to get. Can be one of the following values:
//				BTNST_COLOR_BK_IN		Background color when mouse is over the button
//				BTNST_COLOR_FG_IN		Text color when mouse is over the button
//				BTNST_COLOR_BK_OUT		Background color when mouse is outside the button
//				BTNST_COLOR_FG_OUT		Text color when mouse is outside the button
//				BTNST_COLOR_BK_FOCUS	Background color when the button is focused
//				BTNST_COLOR_FG_FOCUS	Text color when the button is focused
//		[OUT]	crpColor
//				A pointer to a COLORREF that will receive the color.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//		BTNST_INVALIDINDEX
//			Invalid color index.
//
DWORD CCeButtonST::GetColor(BYTE byColorIndex, COLORREF *crpColor)
{
    if (byColorIndex >= BTNST_MAX_COLORS)
        return BTNST_INVALIDINDEX;

    // Get color
    *crpColor = m_crColors[byColorIndex];

    return BTNST_OK;
} // End of GetColor

// This function sets the hilight logic for the button.
// Applies only to flat buttons.
//
// Parameters:
//		[IN]	bAlwaysTrack
//				If TRUE the button will be hilighted even if the window that owns it, is
//				not the active window.
//				If FALSE the button will be hilighted only if the window that owns it,
//				is the active window.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//
DWORD CCeButtonST::SetAlwaysTrack(BOOL bAlwaysTrack)
{
    m_bAlwaysTrack = bAlwaysTrack;
    return BTNST_OK;
} // End of SetAlwaysTrack

// This function sets the cursor to be used when the mouse is over the button.
//
// Parameters:
//		[IN]	nCursorId
//				ID number of the cursor resource.
//				Pass NULL to remove a previously loaded cursor.
//		[IN]	bRepaint
//				If TRUE the control will be repainted.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//		BTNST_INVALIDRESOURCE
//			Failed loading the specified resource.
//
DWORD CCeButtonST::SetBtnCursor(int nCursorId, BOOL bRepaint)
{
    HINSTANCE hInstResource = NULL;
    // Restore old cursor (if any)
    if (m_hOldCursor)
        ::SetCursor(m_hOldCursor);
    // Destroy the cursor (if any)
    if (m_hCursor)
        ::DestroyCursor(m_hCursor);
    m_hCursor = NULL;
    m_hOldCursor = NULL;

    // Load cursor
    if (nCursorId)
    {
        hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId),
            RT_GROUP_CURSOR);
        // Load cursor resource
        m_hCursor = (HCURSOR)::LoadImage(hInstResource, MAKEINTRESOURCE
            (nCursorId), IMAGE_CURSOR, 0, 0, 0);
        // Repaint the button
        if (bRepaint)
            Invalidate();
        // If something wrong
        if (m_hCursor == NULL)
            return BTNST_INVALIDRESOURCE;
    } // if

    return BTNST_OK;
} // End of SetBtnCursor

// This function sets if the button border must be drawn.
// Applies only to flat buttons.
//
// Parameters:
//		[IN]	bDrawBorder
//				If TRUE the border will be drawn.
//		[IN]	bRepaint
//				If TRUE the button will be repainted.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//
DWORD CCeButtonST::DrawBorder(BOOL bDrawBorder, BOOL bRepaint)
{
    m_bDrawBorder = bDrawBorder;
    // Repaint the button
    if (bRepaint)
        Invalidate();

    return BTNST_OK;
} // End of DrawBorder

// This function sets if the focus rectangle must be drawn for flat buttons.
//
// Parameters:
//		[IN]	bDrawFlatFocus
//				If TRUE the focus rectangle will be drawn also for flat buttons.
//		[IN]	bRepaint
//				If TRUE the control will be repainted.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//
DWORD CCeButtonST::DrawFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
{
    m_bDrawFlatFocus = bDrawFlatFocus;
    // Repaint the button
    if (bRepaint)
        Invalidate();

    return BTNST_OK;
} // End of DrawFlatFocus

// This function returns if the button is the default button.
//
// Return value:
//		TRUE
//			The button is the default button.
//		FALSE
//			The button is not the default button.
//
BOOL CCeButtonST::GetDefault()
{
    return m_bIsDefault;
} // End of GetDefault

// This function sets the URL that will be opened when the button is clicked.
//
// Parameters:
//		[IN]	lpszURL
//				Pointer to a null-terminated string that contains the URL.
//				Pass NULL to remove any previously specified URL.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//
DWORD CCeButtonST::SetURL(LPCTSTR lpszURL)
{
    // Remove any existing URL
    memset(m_szURL, 0, sizeof(m_szURL));

    if (lpszURL)
    {
        // Store the URL
        _tcsncpy(m_szURL, lpszURL, _MAX_PATH);
    } // if

    return BTNST_OK;
} // End of SetURL

BOOL CCeButtonST::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
    HCURSOR hOldCursor;

    // If a cursor was specified then use it!
    if (m_hCursor != NULL)
    {
        hOldCursor = ::SetCursor(m_hCursor);
        // Store old cursor
        if (!m_hOldCursor)
            m_hOldCursor = hOldCursor;
        return TRUE;
    } // if

    return CButton::OnSetCursor(pWnd, nHitTest, message);
} // End of OnSetCursor

// This function associates a menu to the button.
// The menu will be displayed clicking the button.
//
// Parameters:
//		[IN]	nMenu
//				ID number of the menu resource.
//				Pass NULL to remove any menu from the button.
//		[IN]	hParentWnd
//				Handle to the window that owns the menu.
//				This window receives all messages from the menu.
//		[IN]	bRepaint
//				If TRUE the control will be repainted.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//		BTNST_INVALIDRESOURCE
//			Failed loading the specified resource.
//
DWORD CCeButtonST::SetMenu(UINT nMenu, HWND hParentWnd, BOOL bRepaint)
{
    HINSTANCE hInstResource = NULL;

    // Destroy any previous menu
    if (m_hMenu)
    {
        ::DestroyMenu(m_hMenu);
        m_hMenu = NULL;
        m_hParentWndMenu = NULL;
        m_bMenuDisplayed = FALSE;
    } // if

    // Load menu
    if (nMenu)
    {
        // Find correct resource handle
        hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nMenu), RT_MENU);
        // Load menu resource
        m_hMenu = ::LoadMenu(hInstResource, MAKEINTRESOURCE(nMenu));
        m_hParentWndMenu = hParentWnd;
        // If something wrong
        if (m_hMenu == NULL)
            return BTNST_INVALIDRESOURCE;
    } // if

    // Repaint the button
    if (bRepaint)
        Invalidate();

    return BTNST_OK;
} // End of SetMenu

// This function is called every time the button background needs to be painted.
//
// Parameters:
//		[IN]	pDC
//				Pointer to a CDC object that indicates the device context.
//		[IN]	pRect
//				Pointer to a CRect object that indicates the bounds of the
//				area to be painted.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//
DWORD CCeButtonST::OnDrawBackground(CDC *pDC, LPCRECT pRect)
{
    COLORREF crColor;

    if (m_bMouseOnButton || m_bIsPressed)
        crColor = m_crColors[BTNST_COLOR_BK_IN];
    else
    {
        if (m_bIsFocused)
            crColor = m_crColors[BTNST_COLOR_BK_FOCUS];
        else
            crColor = m_crColors[BTNST_COLOR_BK_OUT];
    } // else

    CBrush brBackground(crColor);

    pDC->FillRect(pRect, &brBackground);

    // Charlie add 2008-06-04 begin 
    // Create and select a solid brush for button background
    CBrush brushBK(m_crColors[BTNST_COLOR_BK_IN]);
    CBrush *pOldBrush = pDC->SelectObject(&brushBK);
    
    // Create and select a thick black pen for button border
    CPen penBorder;
    penBorder.CreatePen(PS_SOLID, 1, RGB(150, 150, 150));
    CPen *pOldPen = pDC->SelectObject(&penBorder);

    pDC->RoundRect(pRect, CPoint(8, 8)); 

    // Put back the old objects
    pDC->SelectObject(pOldBrush);
    pDC->SelectObject(pOldPen);
    // Charlie add 2008-06-04 end 

    return BTNST_OK;
} // End of OnDrawBackground

// This function is called every time the button border needs to be painted.
//
// Parameters:
//		[IN]	pDC
//				Pointer to a CDC object that indicates the device context.
//		[IN]	pRect
//				Pointer to a CRect object that indicates the bounds of the
//				area to be painted.
//
// Return value:
//		BTNST_OK
//			Function executed successfully.
//
DWORD CCeButtonST::OnDrawBorder(CDC *pDC, LPCRECT pRect)
{
    if (m_bIsPressed)
        pDC->Draw3dRect(pRect, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor
            (COLOR_BTNHIGHLIGHT));
    else
        if (m_bIsFlat == FALSE || (m_bIsFlat && m_bMouseOnButton))
            pDC->Draw3dRect(pRect, ::GetSysColor(COLOR_BTNHIGHLIGHT), 
                ::GetSysColor(COLOR_BTNSHADOW));

    return BTNST_OK;
} // End of OnDrawBorder

void CALLBACK CCeButtonST::TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD
    dwTime)
{
    POINT csPos;
    RECT csRect;

    ::GetCursorPos(&csPos);
    ::ScreenToClient(hwnd, &csPos);

    ::GetClientRect(hwnd, &csRect);

    if (!::PtInRect(&csRect, csPos))
    {
        ::PostMessage(hwnd, WM_MOUSELEAVE, 0, 0);
    } // if
} // End of TimerProc

#undef BS_TYPEMASK
#undef WM_MOUSELEAVE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -