7420|14

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince下透明按钮问题(附源码) [复制链接]

各位路过的,驻留的,寻找解决方案的大佬们儿,哪位来帮小弟我看看我的代码是哪出问题了。小弟感激不尽!奉送小弟所有可用分做为感谢!

同的代码在MFC下显示是正常的,但在wince下按钮那块就好像被抠空了,直接显示程序启动时的桌面。

最新回复

代码没细看,不过一般都可能是两类问题:1,代码中是不是含有WinCE不支持的函数;2,系统中是不是含有做半透明一般都需要的组件,AlphaBlend API的支持。  详情 回复 发表于 2009-10-12 18:49
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
所有的头文件类CBtnST.h
//
//        Class:                CButtonST
//
//        Compiler:        Visual C++
//        Tested on:        Visual C++ 5.0
//                                Visual C++ 6.0
//
//        Version:        See GetVersionC() or GetVersionI()
//
//        Created:        xx/xxxx/1998
//        Updated:        03/March/2003
//
//        Author:                Davide Calabro'                davide_calabro@yahoo.com
//                                                                        http://www.softechsoftware.it
//
//        Note:                Code for the PreSubclassWindow and OnSetStyle functions
//                                has been taken from the COddButton class
//                                published by Paolo Messina and Jerzy Kaczorowski
//
//        Disclaimer
//        ----------
//        THIS SOFTWARE AND THE ACCOMPANYING FILES ARE DISTRIBUTED "AS IS" AND WITHOUT
//        ANY WARRANTIES WHETHER EXPRESSED OR IMPLIED. NO REPONSIBILITIES FOR POSSIBLE
//        DAMAGES OR EVEN FUNCTIONALITY CAN BE TAKEN. THE USER MUST ASSUME THE ENTIRE
//        RISK OF USING THIS SOFTWARE.
//
//        Terms of use
//        ------------
//        THIS SOFTWARE IS FREE FOR PERSONAL USE OR FREEWARE APPLICATIONS.
//        IF YOU USE THIS SOFTWARE IN COMMERCIAL OR SHAREWARE APPLICATIONS YOU
//        ARE GENTLY ASKED TO DONATE 5$ (FIVE U.S. DOLLARS) TO THE AUTHOR:
//
//                Davide Calabro'
//                P.O. Box 65
//                21019 Somma Lombardo (VA)
//                Italy
//
#ifndef _BTNST_H
#define _BTNST_H

// Uncomment the following 2 lines to enable support for BCMenu class
#define        BTNST_USE_BCMENU

// Uncomment the following line to enable support for sound effects
#define        BTNST_USE_SOUND

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

// Return values
#ifndef        BTNST_OK
#define        BTNST_OK                                                0
#endif
#ifndef        BTNST_INVALIDRESOURCE
#define        BTNST_INVALIDRESOURCE                        1
#endif
#ifndef        BTNST_FAILEDMASK
#define        BTNST_FAILEDMASK                                2
#endif
#ifndef        BTNST_INVALIDINDEX
#define        BTNST_INVALIDINDEX                                3
#endif
#ifndef        BTNST_INVALIDALIGN
#define        BTNST_INVALIDALIGN                                4
#endif
#ifndef        BTNST_BADPARAM
#define        BTNST_BADPARAM                                        5
#endif
#ifndef        BTNST_INVALIDPRESSEDSTYLE
#define        BTNST_INVALIDPRESSEDSTYLE                6
#endif

// Dummy identifier for grayscale icon
#ifndef        BTNST_AUTO_GRAY
#define        BTNST_AUTO_GRAY                                        (HICON)(0xffffffff - 1L)
#endif
// Dummy identifier for 15% darker icon
#ifndef        BTNST_AUTO_DARKER
#define        BTNST_AUTO_DARKER                                (HICON)(0xffffffff - 2L)
#endif

class CButtonST : public CButton
{
public:
    CButtonST();
        ~CButtonST();

    enum        {        ST_ALIGN_HORIZ        = 0,                        // Icon/bitmap on the left, text on the right
                                ST_ALIGN_VERT,                                        // Icon/bitmap on the top, text on the bottom
                                ST_ALIGN_HORIZ_RIGHT,                        // Icon/bitmap on the right, text on the left
                                ST_ALIGN_OVERLAP                                // Icon/bitmap on the same space as text
                        };

        enum        {        BTNST_COLOR_BK_IN        = 0,                // Background color when mouse is INside
                                BTNST_COLOR_FG_IN,                                // Text color when mouse is INside
                                BTNST_COLOR_BK_OUT,                                // Background color when mouse is OUTside
                                BTNST_COLOR_FG_OUT,                                // Text color when mouse is OUTside
                                BTNST_COLOR_BK_FOCUS,                        // Background color when the button is focused
                                BTNST_COLOR_FG_FOCUS,                        // Text color when the button is focused

                                BTNST_MAX_COLORS
                        };

    enum        {        BTNST_PRESSED_LEFTRIGHT = 0,        // Pressed style from left to right (as usual)
                                BTNST_PRESSED_TOPBOTTOM                        // Pressed style from top to bottom
                        };

        // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CButtonST)
        public:
        virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
//        virtual BOOL PreTranslateMessage(MSG* pMsg);
        protected:
        virtual void PreSubclassWindow();
        //}}AFX_VIRTUAL

public:
        DWORD SetDefaultColors(BOOL bRepaint = TRUE);
        void  DrawTransparent(BOOL bRepaint = FALSE);
        DWORD SetBk(CDC* pDC);

        DWORD SetBitmaps(int nBitmapIn, COLORREF crTransColorIn, int nBitmapOut = NULL, COLORREF crTransColorOut = 0);
        DWORD SetBitmaps(HBITMAP hBitmapIn, COLORREF crTransColorIn, HBITMAP hBitmapOut = NULL, COLORREF crTransColorOut = 0);

        BOOL        m_bShowDisabledBitmap;
        POINT        m_ptImageOrg;

protected:
    //{{AFX_MSG(CButtonST)
        afx_msg void OnKillFocus(CWnd* pNewWnd);
        afx_msg void OnMouseMove(UINT nFlags, CPoint point);
        afx_msg void OnSysColorChange();
        afx_msg BOOL OnClicked();
        //}}AFX_MSG

        afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
        HBITMAP CreateDarkerBitmap(HBITMAP hBitmap, DWORD dwWidth, DWORD dwHeight, COLORREF crTrans);
        COLORREF DarkenColor(COLORREF crColor, double dFactor);
        virtual DWORD OnDrawBorder(CDC* pDC, CRect* pRect);

        BOOL                m_bMouseOnButton;        // Is mouse over the button?
        BOOL                m_bDrawTransparent;        // Draw transparent?
        BOOL                m_bIsPressed;                // Is button pressed?
        BOOL                m_bIsFocused;                // Is button focused?
        BOOL                m_bIsDisabled;                // Is button disabled?
        BOOL                m_bIsDefault;                // Is default button?
        BYTE                m_byAlign;                        // Align mode
        BOOL                m_bDrawBorder;                // Draw border?
        BOOL                m_bDrawFlatFocus;        // Draw focus rectangle for flat button?
        COLORREF        m_crColors[BTNST_MAX_COLORS];        // Colors to be used

private:
        LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);

        void CancelHover();
        void FreeResources(BOOL bCheckForNULL = TRUE);
        void PrepareImageRect(BOOL bHasTitle, RECT* rpItem, CRect* rpTitle, BOOL bIsPressed, DWORD dwWidth, DWORD dwHeight, CRect* rpImage);
        HBITMAP CreateBitmapMask(HBITMAP hSourceBitmap, DWORD dwWidth, DWORD dwHeight, COLORREF crTransColor);
        virtual void DrawTheBitmap(CDC* pDC, BOOL bHasTitle, RECT* rpItem, CRect* rpCaption, BOOL bIsPressed, BOOL bIsDisabled);
        virtual void DrawTheText(CDC* pDC, LPCTSTR lpszText, RECT* rpItem, CRect* rpCaption, BOOL bIsPressed, BOOL bIsDisabled);
        void PaintBk(CDC* pDC);

        CDC                        m_dcBk;
        CBitmap                m_bmpBk;
        CBitmap*        m_pbmpOldBk;

        UINT                m_nTypeStyle;                // Button style

#pragma pack(1)
        typedef struct _STRUCT_BITMAPS
        {
                HBITMAP                hBitmap;                // Handle to bitmap
                DWORD                dwWidth;                // Width of bitmap
                DWORD                dwHeight;                // Height of bitmap
                HBITMAP                hMask;                        // Handle to mask bitmap
                COLORREF        crTransparent;        // Transparent color
        } STRUCT_BITMAPS;
#pragma pack()

        STRUCT_BITMAPS        m_csBitmaps[2];

        DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
CBtnST类的详细代码


#include "stdafx.h"
#include "BtnST.h"

#ifdef        BTNST_USE_SOUND
//#pragma comment(lib, "winmm.lib")
//#include
#endif

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CButtonST

// Mask for control's type
#define BS_TYPEMASK SS_TYPEMASK

#ifndef        TTM_SETTITLE
#define TTM_SETTITLEA           (WM_USER + 32)  // wParam = TTI_*, lParam = char* szTitle
#define TTM_SETTITLEW           (WM_USER + 33)  // wParam = TTI_*, lParam = wchar* szTitle
#ifdef        UNICODE
#define TTM_SETTITLE            TTM_SETTITLEW
#else
#define TTM_SETTITLE            TTM_SETTITLEA
#endif
#endif

#ifndef        TTS_BALLOON
#define        TTS_BALLOON                0x40
#endif

CButtonST::CButtonST()
{
        m_bIsPressed                = FALSE;
        m_bIsFocused                = FALSE;
        m_bIsDisabled                = FALSE;
        m_bMouseOnButton        = FALSE;

        FreeResources(FALSE);
  
        // By default draw border in "flat" button
        m_bDrawBorder = TRUE;
  
        // By default icon is aligned horizontally
        m_byAlign = ST_ALIGN_HORIZ;

        // 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;
        // Invalid value, since type still unknown
//        m_nTypeStyle = BS_TYPEMASK;

        // Set default colors
        SetDefaultColors(FALSE);

        // Do not draw as a transparent button
        m_bDrawTransparent = FALSE;
        m_pbmpOldBk = NULL;

        m_bShowDisabledBitmap = TRUE;

        m_ptImageOrg.x = 3;
        m_ptImageOrg.y = 3;

}

CButtonST::~CButtonST()
{
        // Restore old bitmap (if any)
        if (m_dcBk.m_hDC && m_pbmpOldBk)
        {
                m_dcBk.SelectObject(m_pbmpOldBk);
        }

        FreeResources();
}

BEGIN_MESSAGE_MAP(CButtonST, CButton)
    //{{AFX_MSG_MAP(CButtonST)
        ON_WM_KILLFOCUS()
        ON_WM_MOUSEMOVE()
        ON_WM_SYSCOLORCHANGE()
        ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
        ON_WM_CTLCOLOR_REFLECT()
        //}}AFX_MSG_MAP

        //ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()

void CButtonST::FreeResources(BOOL bCheckForNULL)
{
        if (bCheckForNULL)
        {
                // Destroy bitmaps
                if (m_csBitmaps[0].hBitmap)        ::DeleteObject(m_csBitmaps[0].hBitmap);
                if (m_csBitmaps[1].hBitmap)        ::DeleteObject(m_csBitmaps[1].hBitmap);

                // Destroy mask bitmaps
                if (m_csBitmaps[0].hMask)        ::DeleteObject(m_csBitmaps[0].hMask);
                if (m_csBitmaps[1].hMask)        ::DeleteObject(m_csBitmaps[1].hMask);
        }

        ::ZeroMemory(&m_csBitmaps, sizeof(m_csBitmaps));
}

void CButtonST::PreSubclassWindow()
{
        // Switch to owner-draw
        //ModifyStyle(BS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);
        ModifyStyle(NULL, BS_OWNERDRAW, SWP_FRAMECHANGED);


        CButton::PreSubclassWindow();
    TRACE(_T("CButtonST::PreSubclassWindow()\n"));
}

HBRUSH CButtonST::CtlColor(CDC* pDC, UINT nCtlColor)
{
        return (HBRUSH)::GetStockObject(NULL_BRUSH);
}

void CButtonST::OnSysColorChange()
{
        CButton::OnSysColorChange();

        m_dcBk.DeleteDC();
        m_bmpBk.DeleteObject();       
        SetDefaultColors();
}

void CButtonST::OnKillFocus(CWnd * pNewWnd)
{
        CButton::OnKillFocus(pNewWnd);
        CancelHover();
}

void CButtonST::CancelHover()
{
        // Only for flat buttons
        if (m_bMouseOnButton)
        {
                m_bMouseOnButton = FALSE;
                Invalidate();
        }
}

void CButtonST::OnMouseMove(UINT nFlags, CPoint point)
{
        CWnd*                                wndUnderMouse = NULL;
        CWnd*                                wndActive = this;
        //TRACKMOUSEEVENT                csTME;

        CButton::OnMouseMove(nFlags, point);

        ClientToScreen(&point);
        wndUnderMouse = WindowFromPoint(point);

        // If the mouse enter the button with the left button pressed then do nothing
        if (nFlags & MK_LBUTTON && m_bMouseOnButton == FALSE)
                return;

        if (wndUnderMouse && wndUnderMouse->m_hWnd == m_hWnd && wndActive)
        {
                if (!m_bMouseOnButton)
                {
                        m_bMouseOnButton = TRUE;

                        Invalidate();

                        //csTME.cbSize = sizeof(csTME);
                        //csTME.dwFlags = TME_LEAVE;
                        //csTME.hwndTrack = m_hWnd;
                        //::_TrackMouseEvent(&csTME);
                }
        }
        else
        {
                CancelHover();
        }
}

// Handler for WM_MOUSELEAVE
LRESULT CButtonST::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
        CancelHover();
        return 0;
}

BOOL CButtonST::OnClicked()
{
        SetFocus();

        return FALSE;
}

void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
        CDC*        pDC = CDC::FromHandle(lpDIS->hDC);

        m_bIsPressed  = (lpDIS->itemState & ODS_SELECTED);
        m_bIsFocused  = (lpDIS->itemState & ODS_FOCUS);
        m_bIsDisabled = (lpDIS->itemState & ODS_DISABLED);

        CRect itemRect = lpDIS->rcItem;

        pDC->SetBkMode(TRANSPARENT);

        // Prepare draw... paint button background

        // Draw transparent?
        PaintBk(pDC);

        // Draw button border
        OnDrawBorder(pDC, &itemRect);

        // Read the button's title
        CString sTitle;
        GetWindowText(sTitle);

        CRect captionRect = lpDIS->rcItem;

        if (m_csBitmaps[0].hBitmap)
        {
                pDC->SetBkColor(RGB(255,255,255));
                DrawTheBitmap(pDC, !sTitle.IsEmpty(), &lpDIS->rcItem, &captionRect, m_bIsPressed, m_bIsDisabled);
        }

        // Write the button title (if any)
        if (sTitle.IsEmpty() == FALSE)
        {
                DrawTheText(pDC, (LPCTSTR)sTitle, &lpDIS->rcItem, &captionRect, m_bIsPressed, m_bIsDisabled);
        }

        // Draw the focus rect
        if (m_bIsFocused)
        {
                CRect focusRect = itemRect;
                focusRect.DeflateRect(3, 3);
                pDC->DrawFocusRect(&focusRect);
        }
    TRACE(_T("CButtonST::DrawItem()\n"));       
}

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);
}

HBITMAP CButtonST::CreateBitmapMask(HBITMAP hSourceBitmap, DWORD dwWidth, DWORD dwHeight, COLORREF crTransColor)
{
        HBITMAP                hMask                = NULL;
        HDC                        hdcSrc                = NULL;
        HDC                        hdcDest                = NULL;
        HBITMAP                hbmSrcT                = NULL;
        HBITMAP                hbmDestT        = NULL;
        COLORREF        crSaveBk;
        COLORREF        crSaveDestText;

        hMask = ::CreateBitmap(dwWidth, dwHeight, 1, 1, NULL);
        if (hMask == NULL)        return NULL;

        hdcSrc        = ::CreateCompatibleDC(NULL);
        hdcDest        = ::CreateCompatibleDC(NULL);

        hbmSrcT = (HBITMAP)::SelectObject(hdcSrc, hSourceBitmap);
        hbmDestT = (HBITMAP)::SelectObject(hdcDest, hMask);

        crSaveBk = ::SetBkColor(hdcSrc, crTransColor);

        ::BitBlt(hdcDest, 0, 0, dwWidth, dwHeight, hdcSrc, 0, 0, SRCCOPY);

        crSaveDestText = ::SetTextColor(hdcSrc, RGB(255, 255, 255));
        ::SetBkColor(hdcSrc,RGB(0, 0, 0));

        ::BitBlt(hdcSrc, 0, 0, dwWidth, dwHeight, hdcDest, 0, 0, SRCAND);

        SetTextColor(hdcDest, crSaveDestText);

        ::SetBkColor(hdcSrc, crSaveBk);
        ::SelectObject(hdcSrc, hbmSrcT);
        ::SelectObject(hdcDest, hbmDestT);

        ::DeleteDC(hdcSrc);
        ::DeleteDC(hdcDest);

        return hMask;
}

void CButtonST::PrepareImageRect(BOOL bHasTitle, RECT* rpItem, CRect* rpTitle, BOOL bIsPressed, DWORD dwWidth, DWORD dwHeight, CRect* rpImage)
{
        CRect rBtn;

        rpImage->CopyRect(rpItem);

        switch (m_byAlign)
        {
                case ST_ALIGN_HORIZ:
                        if (bHasTitle == FALSE)
                        {
                                // Center image horizontally
                                rpImage->left += ((rpImage->Width() - (long)dwWidth)/2);
                        }
                        else
                        {
                                // Image must be placed just inside the focus rect
                                rpImage->left += m_ptImageOrg.x;  
                                rpTitle->left += dwWidth + m_ptImageOrg.x;
                        }
                        // Center image vertically
                        rpImage->top += ((rpImage->Height() - (long)dwHeight)/2);
                        break;

                case ST_ALIGN_HORIZ_RIGHT:
                        GetClientRect(&rBtn);
                        if (bHasTitle == FALSE)
                        {
                                // Center image horizontally
                                rpImage->left += ((rpImage->Width() - (long)dwWidth)/2);
                        }
                        else
                        {
                                // Image must be placed just inside the focus rect
                                rpTitle->right = rpTitle->Width() - dwWidth - m_ptImageOrg.x;
                                rpTitle->left = m_ptImageOrg.x;
                                rpImage->left = rBtn.right - dwWidth - m_ptImageOrg.x;
                                // Center image vertically
                                rpImage->top += ((rpImage->Height() - (long)dwHeight)/2);
                        }
                        break;
               
                case ST_ALIGN_VERT:
                        // Center image horizontally
                        rpImage->left += ((rpImage->Width() - (long)dwWidth)/2);
                        if (bHasTitle == FALSE)
                        {
                                // Center image vertically
                                rpImage->top += ((rpImage->Height() - (long)dwHeight)/2);           
                        }
                        else
                        {
                                rpImage->top = m_ptImageOrg.y;
                                rpTitle->top += dwHeight;
                        }
                        break;

                case ST_ALIGN_OVERLAP:
                        break;
        }
}

void CButtonST::DrawTheBitmap(CDC* pDC, BOOL bHasTitle, RECT* rpItem, CRect* rpCaption, BOOL bIsPressed, BOOL bIsDisabled)
{
        HDC                        hdcBmpMem        = NULL;
        HBITMAP                hbmOldBmp        = NULL;
        HDC                        hdcMem                = NULL;
        HBITMAP                hbmT                = NULL;

        BYTE                byIndex                = 0;

        byIndex = (m_csBitmaps[1].hBitmap == NULL ? 0 : 1);

        CRect        rImage;
        PrepareImageRect(bHasTitle,
                rpItem,
                rpCaption,
                bIsPressed,
                m_csBitmaps[byIndex].dwWidth,
                m_csBitmaps[byIndex].dwHeight,
                &rImage
        );

        hdcBmpMem = ::CreateCompatibleDC(pDC->m_hDC);

        hbmOldBmp = (HBITMAP)::SelectObject(hdcBmpMem, m_csBitmaps[byIndex].hBitmap);

        hdcMem = ::CreateCompatibleDC(NULL);

        hbmT = (HBITMAP)::SelectObject(hdcMem, m_csBitmaps[byIndex].hMask);

        ::BitBlt(
                pDC->m_hDC,
                rImage.left,
                rImage.top,
                m_csBitmaps[byIndex].dwWidth,
                m_csBitmaps[byIndex].dwHeight,
                hdcMem,
                0,
                0,
                SRCAND
        );

        ::BitBlt(
                pDC->m_hDC,
                rImage.left,
                rImage.top,
                m_csBitmaps[byIndex].dwWidth,
                m_csBitmaps[byIndex].dwHeight,
                hdcBmpMem,
                0,
                0,
                SRCPAINT
        );

        ::SelectObject(hdcMem, hbmT);
        ::DeleteDC(hdcMem);

        ::SelectObject(hdcBmpMem, hbmOldBmp);
        ::DeleteDC(hdcBmpMem);
}
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 

void CButtonST::DrawTheText(CDC* pDC, LPCTSTR lpszText, RECT* rpItem, CRect* rpCaption, BOOL bIsPressed, BOOL bIsDisabled)
{
        // Center text
        CRect centerRect = rpCaption;
        pDC->DrawText(lpszText, -1, rpCaption, DT_WORDBREAK | DT_CENTER | DT_CALCRECT);
        rpCaption->OffsetRect((centerRect.Width() - rpCaption->Width())/2, (centerRect.Height() - rpCaption->Height())/2);

        pDC->SetBkMode(TRANSPARENT);

        if (m_bIsDisabled)
        {
                rpCaption->OffsetRect(1, 1);
                pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
                pDC->DrawText(lpszText, -1, rpCaption, DT_WORDBREAK | DT_CENTER);
                rpCaption->OffsetRect(-1, -1);
                pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
                pDC->DrawText(lpszText, -1, rpCaption, DT_WORDBREAK | DT_CENTER);
        }
        else
        {
                if (m_bMouseOnButton || m_bIsPressed)
                {
                        pDC->SetTextColor(m_crColors[BTNST_COLOR_FG_IN]);
                        pDC->SetBkColor(m_crColors[BTNST_COLOR_BK_IN]);
                }
                else
                {
                        if (m_bIsFocused)
                        {
                                pDC->SetTextColor(m_crColors[BTNST_COLOR_FG_FOCUS]);
                                pDC->SetBkColor(m_crColors[BTNST_COLOR_BK_FOCUS]);
                        }
                        else
                        {
                                pDC->SetTextColor(m_crColors[BTNST_COLOR_FG_OUT]);
                                pDC->SetBkColor(m_crColors[BTNST_COLOR_BK_OUT]);
                        }
                }
                pDC->DrawText(lpszText, -1, rpCaption, DT_WORDBREAK | DT_CENTER);
        }
}

HBITMAP CButtonST::CreateDarkerBitmap(HBITMAP hBitmap, DWORD dwWidth, DWORD dwHeight, COLORREF crTrans)
{
        HBITMAP                hGrayBitmap = NULL;
        HDC                        hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
        HBITMAP                hOldBmp1 = NULL, hOldBmp2 = NULL;

        hMainDC = ::GetDC(NULL);
        if (hMainDC == NULL)        return NULL;
        hMemDC1 = ::CreateCompatibleDC(hMainDC);
        if (hMemDC1 == NULL)
        {
                ::ReleaseDC(NULL, hMainDC);
                return NULL;
        }
        hMemDC2 = ::CreateCompatibleDC(hMainDC);
        if (hMemDC2 == NULL)
        {
                ::DeleteDC(hMemDC1);
                ::ReleaseDC(NULL, hMainDC);
                return NULL;
        }

        hGrayBitmap = ::CreateCompatibleBitmap(hMainDC, dwWidth, dwHeight);
        if (hGrayBitmap)
        {
                hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, hGrayBitmap);
                hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, hBitmap);

                //::BitBlt(hMemDC1, 0, 0, dwWidth, dwHeight, hMemDC2, 0, 0, SRCCOPY);

                DWORD                dwLoopY = 0, dwLoopX = 0;
                COLORREF        crPixel = 0;

                for (dwLoopY = 0; dwLoopY < dwHeight; dwLoopY++)
                {
                        for (dwLoopX = 0; dwLoopX < dwWidth; dwLoopX++)
                        {
                                crPixel = ::GetPixel(hMemDC2, dwLoopX, dwLoopY);

                                if (crPixel != crTrans)
                                        ::SetPixel(hMemDC1, dwLoopX, dwLoopY, DarkenColor(crPixel, 0.25));
                                else
                                        ::SetPixel(hMemDC1, dwLoopX, dwLoopY, crPixel);
                        }
                }

                ::SelectObject(hMemDC1, hOldBmp1);
                ::SelectObject(hMemDC2, hOldBmp2);
        }

        ::DeleteDC(hMemDC1);
        ::DeleteDC(hMemDC2);
        ::ReleaseDC(NULL, hMainDC);

        return hGrayBitmap;
}

COLORREF CButtonST::DarkenColor(COLORREF crColor, double dFactor)
{
        if (dFactor > 0.0 && dFactor <= 1.0)
        {
                BYTE red,green,blue,lightred,lightgreen,lightblue;
                red = GetRValue(crColor);
                green = GetGValue(crColor);
                blue = GetBValue(crColor);
                lightred = (BYTE)(red-(dFactor * red));
                lightgreen = (BYTE)(green-(dFactor * green));
                lightblue = (BYTE)(blue-(dFactor * blue));
                crColor = RGB(lightred,lightgreen,lightblue);
        }

        return crColor;
}

DWORD CButtonST::SetBitmaps(int nBitmapIn, COLORREF crTransColorIn, int nBitmapOut, COLORREF crTransColorOut)
{
        HBITMAP                hBitmapIn                = NULL;
        HBITMAP                hBitmapOut                = NULL;
        HINSTANCE        hInstResource        = NULL;
       
        // Find correct resource handle
        hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nBitmapIn), RT_BITMAP);

        // Load bitmap In
        hBitmapIn = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nBitmapIn), IMAGE_BITMAP, 0, 0, 0);

        // Load bitmap Out
        hBitmapOut = (HBITMAP)BTNST_AUTO_DARKER;

        return SetBitmaps(hBitmapIn, crTransColorIn, hBitmapOut, crTransColorOut);
}

DWORD CButtonST::SetBitmaps(HBITMAP hBitmapIn, COLORREF crTransColorIn, HBITMAP hBitmapOut, COLORREF crTransColorOut)
{
        int                nRetValue = 0;
        BITMAP        csBitmapSize;

        // Free any loaded resource
        FreeResources();

        if (hBitmapIn)
        {
                m_csBitmaps[0].hBitmap = hBitmapIn;
                m_csBitmaps[0].crTransparent = crTransColorIn;
                // Get bitmap size
                nRetValue = ::GetObject(hBitmapIn, sizeof(csBitmapSize), &csBitmapSize);
                if (nRetValue == 0)
                {
                        FreeResources();
                        return BTNST_INVALIDRESOURCE;
                } // if
                m_csBitmaps[0].dwWidth = (DWORD)csBitmapSize.bmWidth;
                m_csBitmaps[0].dwHeight = (DWORD)csBitmapSize.bmHeight;

                // Create grayscale/darker bitmap BEFORE mask (of hBitmapIn)
                m_csBitmaps[1].hBitmap = hBitmapOut;
                hBitmapOut = CreateDarkerBitmap(
                        hBitmapIn,
                        m_csBitmaps[0].dwWidth,
                        m_csBitmaps[0].dwHeight,
                        crTransColorIn
                );
                crTransColorOut = crTransColorIn;

                // Create mask for bitmap In
                m_csBitmaps[0].hMask = CreateBitmapMask(
                        hBitmapIn,
                        m_csBitmaps[0].dwWidth,
                        m_csBitmaps[0].dwHeight,
                        crTransColorIn
                );
                if (m_csBitmaps[0].hMask == NULL)
                {
                        FreeResources();
                        return BTNST_FAILEDMASK;
                }

                if (hBitmapOut)
                {
                        m_csBitmaps[1].hBitmap = hBitmapOut;
                        m_csBitmaps[1].crTransparent = crTransColorOut;
                        // Get bitmap size
                        nRetValue = ::GetObject(hBitmapOut, sizeof(csBitmapSize), &csBitmapSize);
                        if (nRetValue == 0)
                        {
                                FreeResources();
                                return BTNST_INVALIDRESOURCE;
                        } // if
                        m_csBitmaps[1].dwWidth = (DWORD)csBitmapSize.bmWidth;
                        m_csBitmaps[1].dwHeight = (DWORD)csBitmapSize.bmHeight;

                        // Create mask for bitmap Out
                        m_csBitmaps[1].hMask = CreateBitmapMask(
                                hBitmapOut,
                                m_csBitmaps[1].dwWidth,
                                m_csBitmaps[1].dwHeight,
                                crTransColorOut
                        );
                        if (m_csBitmaps[1].hMask == NULL)
                        {
                                FreeResources();
                                return BTNST_FAILEDMASK;
                        }
                }
        }

        Invalidate();

        return BTNST_OK;
}

// This function sets all colors to a default value.
//
// Parameters:
//                [IN]        bRepaint
//                                If TRUE the control will be repainted.
//
// Return value:
//                BTNST_OK
//                        Function executed successfully.
//
DWORD CButtonST::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;
}

// This function enables the transparent mode.
// Note: this operation is not reversible.
// DrawTransparent should be called just after the button is created.
// Do not use trasparent buttons until you really need it (you have a bitmapped
// background) since each transparent button makes a copy in memory of its background.
// This may bring unnecessary memory use and execution overload.
//
// Parameters:
//                [IN]        bRepaint
//                                If TRUE the control will be repainted.
//
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.DeleteObject();
        m_dcBk.DeleteDC();

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

    TRACE(_T("CButtonST::DrawTransparent\n"));
}

DWORD CButtonST::SetBk(CDC* pDC)
{
        if (m_bDrawTransparent && pDC)
        {
                // Restore old bitmap (if any)
                if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL)
                {
                        m_dcBk.SelectObject(m_pbmpOldBk);
                }

                m_bmpBk.DeleteObject();
                m_dcBk.DeleteDC();

                CRect rect;
                CRect rect1;

                GetClientRect(rect);

                GetWindowRect(rect1);
                GetParent()->ScreenToClient(rect1);

                m_dcBk.CreateCompatibleDC(pDC);
                m_bmpBk.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
                m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
                m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, rect1.left, rect1.top, SRCCOPY);

                return BTNST_OK;
        }
    TRACE(_T("CButtonST::SetBk\n"));

        return BTNST_BADPARAM;
}

// This function is called every time the button border needs to be painted.
// This is a virtual function that can be rewritten in CButtonST-derived classes
// to produce a whole range of buttons not available by default.
//
// 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 CButtonST::OnDrawBorder(CDC* pDC, CRect* pRect)
{
        // Draw pressed button
        if (m_bIsPressed)
        {
//                pDC->Draw3dRect(pRect, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT));
        }
        else
        {
                if (m_bMouseOnButton && m_bDrawBorder)
                {
//                        pDC->Draw3dRect(pRect, ::GetSysColor(COLOR_BTNHILIGHT), ::GetSysColor(COLOR_BTNSHADOW));
                }
        }
       
        return BTNST_OK;
}

#undef BS_TYPEMASK
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
网上有这个类的源码,我曾在CE下试过。这个类在CE下和PC下都可用的,楼主添加了OnCtrlColor没有,该函数在向导里可以添加。
楼主需要
1.在OnInitDlg()中获取到你的控件所在部分的背景,具体获取方法网上好像有忘了在那个地方了。
2.然后在OnCtrlColor()中返回你的控件所在部分的背景(并将系统添加的返回画刷去掉)。
以前在网上见过一个很详细的帖子,楼主仔细找一下吧。
祝好运!
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
做个记号
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
有CE下的CeBtnST,可以做到平板,不过没有透明效果,但参考CBtnST后再改改就行了,我就这么搞定的。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

8
 
mark
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

9
 
楼上某个说的对,需要把系统的背景先刷一遍。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

10
 
头晕了~~~~
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
看下来,我已经写好几段代码了- -!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
看晕了!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

13
 
怎么都不用Windows api
 
 
 

回复

97

帖子

0

TA的资源

一粒金砂(中级)

14
 
ce下不支持,老问题了
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

15
 
代码没细看,不过一般都可能是两类问题:1,代码中是不是含有WinCE不支持的函数;2,系统中是不是含有做半透明一般都需要的组件,AlphaBlend API的支持。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表