wince自绘按钮

来源:互联网 发布:cdma网络 编辑:程序博客网 时间:2024/06/05 08:29

//TITLE:
// 

   自绘按钮的实现
//AUTHOR:
//    norains
//DATE:
//    Saturday  12-January-2008
//Environment:
//    VS2005 + SDK-WINCE5.0-MIPSII  
//    EVC + SDK-WINCE5.0-MIPSII 
//========================================================================

    自绘按钮的实现并不难,只不过如果是在非MFC类库中实现,却是显得有点麻烦,或是说,更需要一点小技巧.
   
   文章打算在CMainWnd窗口类中实现一个自绘按钮,为了方便讲解以及突出重点,CMainWnd直接派生于CWndBase类.关于CWndBase类的信息,可以在此找到:http://blog.csdn.net/norains/archive/2008/01/12/2040109.aspx
   
    首先我们先要创建一个按钮,我将它命名为m_hBnExit:

    m_hBnExit = CreateWindowEx(WS_EX_TOPMOST,
                                TEXT("BUTTON"),
                                TEXT(""),
                                BS_PUSHBUTTON |  WS_VISIBLE | WS_CHILD | BS_OWNERDRAW ,
                                POS_EXIT.left,
                                POS_EXIT.top,
                                POS_EXIT.right - POS_EXIT.left,
                                POS_EXIT.bottom - POS_EXIT.top,
                                m_hWnd,
                                (HMENU)IDC_BTN_EXIT,
                                m_hInst,
                                NULL);


  这里有点需要注意,因为我们需要重新绘制按钮,所以BS_OWNERDRAW风格一定需要设置.一旦设置该风格,CMainWnd窗口的消息处理函数就能接收到按钮的WM_DRAWITEM消息:

        LRESULT CMainWnd::WndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
        {
          ...
          
            switch(wMsg)
            {
                case WM_DRAWITEM:
                if(((LPDRAWITEMSTRUCT)lParam)->CtlID == IDC_BTN_EXIT)
                {
                    //TODO something;
                }
                
                ...
                
            }
        
            ...
        }


  接下来需要做的就很简单了,我们只需要在接收到WM_DRAWITEM消息时,判断是否为退出按键的ID号(在本文例子中为IDC_BTN_EXIT),如果是的话就重新绘制.为此,我们定义一个OnDrawItemBtnExit()函数,用来绘制该按钮:

        void CMainWnd::OnDrawItemBtnExit(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
        {
            LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;    
        
          //读取按钮的图片
            HANDLE hBmp = LoadImage(m_hInst,MAKEINTRESOURCE(IDB_EXIT),IMAGE_BITMAP,0,0,0);
            if(hBmp == NULL)
            {
                return ;
            }    
        
            //Draw the button
            HDC hdcBmp = CreateCompatibleDC(lpdis->hDC);
            HGDIOBJ hOldSel = SelectObject(hdcBmp,hBmp);
        
            if((lpdis->itemState & ODS_SELECTED ) && !(lpdis->itemState & ODS_DISABLED))
            {
             //按下状态
                TransparentBlt(lpdis->hDC,
                                lpdis->rcItem.left,
                                lpdis->rcItem.top,
                                lpdis->rcItem.right - lpdis->rcItem.left,
                                lpdis->rcItem.bottom - lpdis->rcItem.top,
                                hdcBmp,
                                IMG_EXIT_PUSH.left,
                                IMG_EXIT_PUSH.top,
                                IMG_EXIT_PUSH.right - IMG_EXIT_PUSH.left,
                                IMG_EXIT_PUSH.bottom - IMG_EXIT_PUSH.top,
                                DEFAULT_TRANSPARENT_COLOR);
            }
            else if(lpdis->itemState & ODS_DISABLED)
            {
             //无效状态
                TransparentBlt(lpdis->hDC,
                                    lpdis->rcItem.left,
                                    lpdis->rcItem.top,
                                    lpdis->rcItem.right - lpdis->rcItem.left,
                                    lpdis->rcItem.bottom - lpdis->rcItem.top,
                                    hdcBmp,
                                    IMG_EXIT_DISABLE.left,
                                    IMG_EXIT_DISABLE.top,
                                    IMG_EXIT_DISABLE.right - IMG_EXIT_DISABLE.left,
                                    IMG_EXIT_DISABLE.bottom - IMG_EXIT_DISABLE.top,
                                    DEFAULT_TRANSPARENT_COLOR);
            }
            else
            {
              //正常状态
                TransparentBlt(lpdis->hDC,
                                lpdis->rcItem.left,
                                lpdis->rcItem.top,
                                lpdis->rcItem.right - lpdis->rcItem.left,
                                lpdis->rcItem.bottom - lpdis->rcItem.top,
                                hdcBmp,
                                IMG_EXIT_ENABLE.left,
                                IMG_EXIT_ENABLE.top,
                                IMG_EXIT_ENABLE.right - IMG_EXIT_ENABLE.left,
                                IMG_EXIT_ENABLE.bottom - IMG_EXIT_ENABLE.top,
                                DEFAULT_TRANSPARENT_COLOR);
            }
        
            if(hdcBmp != NULL && hOldSel != NULL)
            {
                SelectObject(hdcBmp,hOldSel);    
                DeleteDC(hdcBmp);
        
                hdcBmp = NULL;
                hOldSel = NULL;
            }
        
            if(hBmp != NULL)
            {
                DeleteObject(hBmp);
                hBmp = NULL;
            }    
        
        }

 

本文系转载。原文地址:http://www.cnblogs.com/Jade2009/archive/2009/05/12/1454705.html

原创粉丝点击