norains的专栏

只专注于WINCE开发

用户操作
[即时聊天] [发私信] [加为好友]
norainsID:norains
142878次访问,排名598,好友0人,关注者53人。
代码其实是一种乐趣
norains的文章
原创 189 篇
翻译 0 篇
转载 10 篇
评论 274 篇
norains的公告
联系方式请看置顶文章
最近评论
dfdf:讨厌MFC!我觉得MFC就是太乱了!看似无用的代码不要不行,MD微软啥都给我们做完了,原理性的东西我们却永远没法搞懂了!
ironox:有个地方 我觉得很别扭,不知道怎么办好

比如说 CReg reg(HKEY_CURRENT_USER,TEXT("ControlPanel\Volume"));
ControlPanel\Volume 有可能不存在呀,这个该怎么处理哦?对象虽然创建了,出错了也没提示
szterry:呵呵,果然工作狂技术狂,同感,一样的感觉……不过我才刚毕业一年……搞IT就是玩……
jinlking:这个botton的实现只是在主窗口画了一块区域,对于事件的处理还要放在主窗口的窗口处理函数之中,在对应的消息处理上调用CheckTap来判断是否是此“按钮”,问一下,这种方法与把按钮封装在子窗口中有什么区别,二者使用那个更好?
KUODY:博主真是好人
文章分类
收藏
    相册
    动漫
    文章图片
    程序交流
    xumercury的BLOG
    狗友们的博客
    清蒸石斑鱼
    美女如刀锋
    茁茁的BLOG
    魅力老姐的窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 CButton使用详解收藏

    新一篇: 稀里哗啦的精华文章 | 旧一篇: 镜子和爱情

    //========================================================================
    //TITLE:
    //    CButton使用详解
    //AUTHOR:
    //    norains
    //DATE:
    //    Saturday  16-May-2007
    //Environment:
    //        EVC4.0 + Standard SDK 4.2
    //        EVC4.0 + Standard SDK 5.0
    //========================================================================

            恩,不用怀疑了,这个CButton类也不是微软的通用控件,而是和我之前写的CText及CProgress一样,都是为了方便大面积需要贴图的程序,而模仿微软的特性来写的一个类.

            闲话少说,但确实也没什么可说的,就让我们直接看看例程代码.
            CButton m_Btn;
            
            
    //设置该按钮可用
            m_Btn.SetEnable(TRUE);
            
            
    //设置实例句柄
            m_Btn.SetHinstance(hInst);
            
            
    //设置按钮的位置
            m_Btn.SetPosition(&RC_BTN);
            
            
    //设置普通状态,按下状态,无效状态的图片信息
            m_Btn.SetImgInfoDisable(&IMG_DISABLE);
            m_Btn.SetImgInfoEnable(
    &IMG_ENABLE);
            m_Btn.SetImgInfoPush(
    &IMG_PUSH);
            
            
    //设置透明绘制
            m_Btn.SetTransparent(TRUE);
            
            
    //设置透明色
            m_Btn.SetTransparentColor(TRANSPARENT_COLOR);
            
            
    //绘制背景
            m_Btn.Draw(hdc);
            
            
    //判断是否点击该按钮
            if(m_Btn.CheckTap(&pt) == TRUE)
            
    {
                
    //Do something..
            }

            恩,就这么简单,也没什么很特别的地方,仅仅主要是方便大量采用贴图的程序而已.
           
            CButton类完整源码:
    //////////////////////////////////////////////////////////////////////
    // Button.h: interface for the CButton class.
    //
    //Version: 
    //    1.1.1
    //Data:
    //    2007.03.31   
    //////////////////////////////////////////////////////////////////////

    #ifndef BUTTON_H
    #define BUTTON_H



    #include 
    "CtrlCommon.h"



    //---------------------------------------------------------------------------
    //Enum data

    //For the button draw
    enum ButtonDrawType
    {
        BTN_DRAW_AUTO,
        BTN_DRAW_PUSH,
        BTN_DRAW_ENABLE,
        BTN_DRAW_DISABLE
    }
    ;

    //------------------------------------------------------------------------------
    //Class

    class CButton  
    {
    public:
        
    void SetTransparent(BOOL bTran);
        
    void SetTransparentColor(COLORREF crColor);
        
    void GetPosition(RECT *prcOut);
        BOOL CheckTap(
    const LPPOINT ppt);
        
    void SetPosition(const RECT * pRc);
        
    void SetImgInfoPush(const DISPIMAGEINFO *pImgInfo);
        
    void SetImgInfoDisable(const DISPIMAGEINFO *pImgInfo);
        
    void SetImgInfoEnable(const DISPIMAGEINFO *pImgInfo);
        
    void SetHinstance(HINSTANCE hInst);
        BOOL Draw(HDC hdc, ButtonDrawType btnDraw 
    = BTN_DRAW_AUTO);
        
    void SetEnable(BOOL bEnable);
        BOOL GetEnable();
        CButton();
        
    virtual ~CButton();

    protected:
        BOOL m_bEnable;
        RECT m_rcWndPos;
        DISPIMAGEINFO m_ImgPush;
        DISPIMAGEINFO m_ImgEnable;
        DISPIMAGEINFO m_ImgDisable;
        HANDLE m_hBmpPush;
        HANDLE m_hBmpEnable;
        HANDLE m_hBmpDisable;
        HINSTANCE m_hInst;
        COLORREF m_crTranColor;
        BOOL m_bTran;
    }
    ;

    #endif // #ifndef BUTTON_H





    //////////////////////////////////////////////////////////////
    // Button.cpp: implementation of the CButton class.
    //
    //////////////////////////////////////////////////////////////////////

    #include 
    "stdafx.h"
    #include 
    "Button.h"


    //-------------------------------------------------------------------
    //Macro define
    #define DEFAULT_TRANSPARENT_COLOR    RGB(125,125,125)
    //--------------------------------------------------------------------

    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    CButton::CButton()
    {
        m_bEnable 
    = TRUE;
        memset(
    &m_rcWndPos,0,sizeof(m_rcWndPos));
        memset(
    &m_ImgPush,0,sizeof(m_ImgPush));
        memset(
    &m_ImgEnable,0,sizeof(m_ImgEnable));
        memset(
    &m_ImgDisable,0,sizeof(m_ImgDisable));    
        m_hBmpPush 
    = NULL;
        m_hBmpEnable 
    = NULL;
        m_hBmpDisable 
    = NULL;
        m_hInst 
    = NULL;

        m_crTranColor 
    = DEFAULT_TRANSPARENT_COLOR;
        m_bTran 
    = FALSE;
    }


    CButton::
    ~CButton()
    {
        
    if(m_hBmpPush != NULL)
        
    {
            DeleteObject(m_hBmpPush);
            m_hBmpPush 
    = NULL;
        }


        
    if(m_hBmpEnable != NULL)
        
    {
            DeleteObject(m_hBmpEnable);
            m_hBmpEnable 
    = NULL;
        }


        
    if(m_hBmpDisable != NULL)
        
    {
            DeleteObject(m_hBmpDisable);
            m_hBmpDisable 
    = NULL;
        }

    }



    //--------------------------------------------------------------------
    //Description:
    //    The button is enable or not
    //
    //-------------------------------------------------------------------
    BOOL CButton::GetEnable()
    {
        
    return m_bEnable;
    }




    //--------------------------------------------------------------------
    //Description:
    //    Set the button status 
    //
    //-------------------------------------------------------------------
    void CButton::SetEnable(BOOL bEnable)
    {
        m_bEnable 
    = bEnable;
    }



    //--------------------------------------------------------------------
    //Description:
    //    Draw the button
    //
    //-------------------------------------------------------------------
    BOOL CButton::Draw(HDC hdc, ButtonDrawType btnDraw)
    {
        
    if(m_hInst == NULL)
        
    {
            
    return FALSE;
        }


        HANDLE hBmp 
    = NULL;
        PDISPIMAGEINFO pInfo;

        
    if(btnDraw == BTN_DRAW_AUTO)
        
    {
            
    if(m_bEnable == TRUE)
            
    {
                
    if(m_hBmpEnable == NULL)
                
    {
                    m_hBmpEnable 
    = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgEnable.imgID),IMAGE_BITMAP,0,0,0);
                }


                hBmp 
    = m_hBmpEnable;
                pInfo 
    = &m_ImgEnable;
            }

            
    else
            
    {
                
    if(m_hBmpDisable == NULL)
                
    {
                    m_hBmpDisable 
    = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgDisable.imgID),IMAGE_BITMAP,0,0,0);
                }


                hBmp 
    = m_hBmpDisable;
                pInfo 
    = &m_ImgDisable;
            }

        }

        
    else if(btnDraw == BTN_DRAW_ENABLE)
        
    {
            
    if(m_hBmpEnable == NULL)
            
    {
                m_hBmpEnable 
    = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgEnable.imgID),IMAGE_BITMAP,0,0,0);
            }


            hBmp 
    = m_hBmpEnable;
            pInfo 
    = &m_ImgEnable;
        }

        
    else if(btnDraw == BTN_DRAW_DISABLE)
        
    {
            
    if(m_hBmpDisable == NULL)
            
    {
                m_hBmpDisable 
    = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgDisable.imgID),IMAGE_BITMAP,0,0,0);
            }


            hBmp 
    = m_hBmpDisable;
            pInfo 
    = &m_ImgDisable;
        }

        
    else if(btnDraw == BTN_DRAW_PUSH)
        
    {
            
    if(m_hBmpPush == NULL)
            
    {
                m_hBmpPush 
    = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgPush.imgID),IMAGE_BITMAP,0,0,0);
            }


            hBmp 
    = m_hBmpPush;
            pInfo 
    = &m_ImgPush;
        }



        
    //Create a DC that matches the device
        HDC hdcMem = CreateCompatibleDC(hdc);
        
    //Select the bitmap into to the compatible device context
        HGDIOBJ hOldSel = SelectObject(hdcMem,hBmp);
        
    //Copy the bitmap image from the memory DC to the screen DC
        if(m_bTran == FALSE)
        
    {
            StretchBlt(hdc,m_rcWndPos.left,m_rcWndPos.top,(m_rcWndPos.right 
    - m_rcWndPos.left),(m_rcWndPos.bottom - m_rcWndPos.top),
                hdcMem,pInfo
    ->left,pInfo->top,(pInfo->right - pInfo->left),(pInfo->bottom - pInfo->top),SRCCOPY);
        }

        
    else
        
    {
            TransparentBlt(hdc,m_rcWndPos.left,m_rcWndPos.top,(m_rcWndPos.right 
    - m_rcWndPos.left),(m_rcWndPos.bottom - m_rcWndPos.top),
                hdcMem,pInfo
    ->left,pInfo->top,(pInfo->right - pInfo->left),(pInfo->bottom - pInfo->top),m_crTranColor);
        }

        
    //Restore original bitmap selection and destroy the memory DC
        SelectObject(hdcMem,hOldSel);    
        DeleteDC(hdcMem);



        
    return TRUE;
    }



    //--------------------------------------------------------------------
    //Description:
    //    Set the handle of instance
    //
    //-------------------------------------------------------------------
    void CButton::SetHinstance(HINSTANCE hInst)
    {
        m_hInst 
    = hInst;
    }



    //--------------------------------------------------------------------
    //Description:
    //    Set the image of enable
    //
    //-------------------------------------------------------------------
    void CButton::SetImgInfoEnable(const DISPIMAGEINFO *pImgInfo)
    {
        
    if(m_hBmpEnable != NULL)
        
    {
            DeleteObject(m_hBmpEnable);
            m_hBmpEnable 
    = NULL;
        }


        m_ImgEnable 
    = *pImgInfo;
    }

    //--------------------------------------------------------------------
    //Description:
    //    Set the image of disable
    //
    //-------------------------------------------------------------------
    void CButton::SetImgInfoDisable(const DISPIMAGEINFO *pImgInfo)
    {
        
    if(m_hBmpDisable != NULL)
        
    {
            DeleteObject(m_hBmpDisable);
            m_hBmpDisable 
    = NULL;
        }


        m_ImgDisable 
    = *pImgInfo;
    }

    //--------------------------------------------------------------------
    //Description:
    //    Set the image of push
    //
    //-------------------------------------------------------------------
    void CButton::SetImgInfoPush(const DISPIMAGEINFO *pImgInfo)
    {
        
    if(m_hBmpPush != NULL)
        
    {
            DeleteObject(m_hBmpPush);
            m_hBmpPush 
    = NULL;
        }


        m_ImgPush 
    = *pImgInfo;
    }


    //--------------------------------------------------------------------
    //Description:
    //    Set the butt