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

📄 button.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       0, BTN_HEIGHT_BMP);
            }
        break;

        case BS_3STATE:
        case BS_AUTO3STATE:
        case BS_AUTOCHECKBOX:
        case BS_CHECKBOX:
            if (dwStyle & BS_PUSHLIKE) {
                myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
                                prcClient->right, prcClient->bottom, 
                                DF_3DBOX_NORMAL | DF_3DBOX_FILL, 
                                GetWindowBkColor ((HWND)pCtrl));
                break;
            }

            if (dwStyle & WS_DISABLED) {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       BTN_WIDTH_BMP * 2, 0);
            }
            else {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       0, 0);
            }
        break;
/*
        case BS_OWNERDRAW:
        break;
*/
        default:
        break;
    }
}

static void btnPaintCheckedButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle,
                RECT* prcClient, RECT* prcText, RECT* prcBitmap)
{
    int bmp_left = prcBitmap->left;
    int bmp_top = prcBitmap->top + (prcBitmap->bottom - BTN_HEIGHT_BMP) / 2;

    switch (dwStyle & BS_TYPEMASK)
    {
        case BS_AUTORADIOBUTTON:
        case BS_RADIOBUTTON:
            if (dwStyle & BS_PUSHLIKE) {
                myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
                                prcClient->right, prcClient->bottom, 
                                DF_3DBOX_PRESSED | DF_3DBOX_FILL, 
                                GetWindowElementColorEx ((HWND)pCtrl, WEC_3DBOX_DARK));
                break;
            }

            if (dwStyle & WS_DISABLED) {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top, 
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       (BTN_WIDTH_BMP << 2), BTN_HEIGHT_BMP);
            }
            else {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top, 
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP);
            }
        break;

        case BS_3STATE:
        case BS_AUTO3STATE:
        case BS_AUTOCHECKBOX:
        case BS_CHECKBOX:
            if (dwStyle & BS_PUSHLIKE) {
                myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
                                prcClient->right, prcClient->bottom, 
                                DF_3DBOX_PRESSED | DF_3DBOX_FILL, 
                                GetWindowElementColorEx ((HWND)pCtrl, WEC_3DBOX_DARK));
                break;
            }

            if (dwStyle & WS_DISABLED) {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top, 
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       BTN_WIDTH_BMP << 2, 0);
            }
            else {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top, 
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       BTN_WIDTH_BMP, 0);
            }
        break;
/*
        case BS_DEFPUSHBUTTON:
        case BS_PUSHBUTTON:
        case BS_OWNERDRAW:
        break;
*/
        default:
        break;
   }
}

static void btnPaintInterminateButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle,
                RECT* prcClient, RECT* prcText, RECT* prcBitmap)
{
    int bmp_left = prcBitmap->left;
    int bmp_top = prcBitmap->top + (prcBitmap->bottom - BTN_HEIGHT_BMP) / 2;

    switch (dwStyle & BS_TYPEMASK)
    {
        case BS_3STATE:
        case BS_AUTO3STATE:
            if (dwStyle & BS_PUSHLIKE) {
                break;
            }

            FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
                                   BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                   0, 0,
                                   BUTTON_BMP,
                                   BTN_WIDTH_BMP << 1, 0);
        break;

/*
        case BS_AUTORADIOBUTTON:
        case BS_RADIOBUTTON:
        case BS_AUTOCHECKBOX:
        case BS_CHECKBOX:
        case BS_DEFPUSHBUTTON:
        case BS_PUSHBUTTON:
        case BS_OWNERDRAW:
        break;
*/
        default:
        break;
    }
}

static void btnPaintPushedButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle,
                RECT* prcClient, RECT* prcText, RECT* prcBitmap)
{
    int bmp_left = prcBitmap->left;
    int bmp_top = prcBitmap->top + (prcBitmap->bottom - BTN_HEIGHT_BMP) / 2;

    switch (dwStyle & BS_TYPEMASK)
    {
        case BS_DEFPUSHBUTTON:
        case BS_PUSHBUTTON:
            myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
                                prcClient->right, prcClient->bottom, 
                                DF_3DBOX_PRESSED | DF_3DBOX_FILL, 
                                GetWindowBkColor ((HWND)pCtrl));
            OffsetRect (prcText, 1, 1);
        break;

        case BS_AUTORADIOBUTTON:
        case BS_RADIOBUTTON:
            if (dwStyle & BS_PUSHLIKE) {
                myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
                                prcClient->right, prcClient->bottom, 
                                DF_3DBOX_PRESSED | DF_3DBOX_FILL, 
                                GetWindowElementColorEx ((HWND)pCtrl, WEC_3DBOX_DARK));
                OffsetRect (prcText, 1, 1);
                break;
            }

            if (BUTTON_STATUS(pCtrl) & BST_CHECKED) {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top, 
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       BTN_WIDTH_BMP * 3, BTN_HEIGHT_BMP);
            }
            else {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top, 
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       BTN_WIDTH_BMP << 1, BTN_HEIGHT_BMP);
            }
        break;

        case BS_3STATE:
        case BS_AUTO3STATE:
        case BS_AUTOCHECKBOX:
        case BS_CHECKBOX:
            if (dwStyle & BS_PUSHLIKE) {
                myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
                                prcClient->right, prcClient->bottom, 
                                DF_3DBOX_PRESSED | DF_3DBOX_FILL, 
                                GetWindowElementColorEx ((HWND)pCtrl, WEC_3DBOX_DARK));
                OffsetRect (prcText, 1, 1); 
                break;
            }

            if (BUTTON_STATUS (pCtrl) & BST_CHECKED) {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top, 
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       BTN_WIDTH_BMP * 3, 0);
            }
            else {
                FillBoxWithBitmapPart (hdc, bmp_left, bmp_top, 
                                       BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
                                       0, 0,
                                       BUTTON_BMP,
                                       BTN_WIDTH_BMP << 1, 0);
            }
        break;
/*
        case BS_OWNERDRAW:
        break;
*/
        default:
        break;
   }
}

static void btnPaintFocusButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle,
                RECT* prcClient, RECT* prcText, RECT* prcBitmap)
{
    RECT rcBounds;

    SetPenColor (hdc, PIXEL_darkgray);
    switch (dwStyle & BS_TYPEMASK)
    {
        case BS_DEFPUSHBUTTON:
        case BS_PUSHBUTTON:
            FocusRect (hdc, prcClient->left + BTN_WIDTH_BORDER, 
                            prcClient->top  + BTN_WIDTH_BORDER,
                            prcClient->right - BTN_WIDTH_BORDER,
                            prcClient->bottom - BTN_WIDTH_BORDER);
            break;

        case BS_3STATE:
        case BS_AUTO3STATE:
        case BS_AUTOCHECKBOX:
        case BS_CHECKBOX:
        case BS_AUTORADIOBUTTON:
        case BS_RADIOBUTTON:
            if (dwStyle & BS_PUSHLIKE) {
                FocusRect (hdc, prcClient->left + BTN_WIDTH_BORDER, 
                                prcClient->top  + BTN_WIDTH_BORDER,
                                prcClient->right - BTN_WIDTH_BORDER,
                                prcClient->bottom - BTN_WIDTH_BORDER);
                break;
            }

            btnGetTextBoundsRect (pCtrl, hdc, dwStyle, prcText, &rcBounds);
            FocusRect (hdc, rcBounds.left - 1,
                            rcBounds.top - 1,
                            rcBounds.right + 1,
                            rcBounds.bottom + 1);
            
        break;
/*
        case BS_OWNERDRAW:
        break;
*/
        default:
        break;
   }
}

static int btnUncheckOthers (PCONTROL pCtrl)
{
    PCONTROL pGroupLeader = pCtrl;
    PCONTROL pOthers;
    DWORD    type = pCtrl->dwStyle & BS_TYPEMASK;
    
    while (pGroupLeader) {
        if (pGroupLeader->dwStyle & WS_GROUP)
            break;

        pGroupLeader = pGroupLeader->prev;
    }

    pOthers = pGroupLeader;
    while (pOthers) {
        if ((pOthers->dwStyle & BS_TYPEMASK) != type)
            break;

        if ((pOthers != pCtrl) && (BUTTON_STATUS (pOthers) | BST_CHECKED)) {
            BUTTON_STATUS (pOthers) &= ~BST_CHECKED;
            InvalidateRect ((HWND)pOthers, NULL, TRUE);
        }

        pOthers = pOthers->next;
    }

    return pCtrl->id;
}

static int ButtonCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC         hdc;
    PCONTROL    pCtrl;
    DWORD       dwStyle;
    RECT        rcClient;
    RECT        rcText;
    RECT        rcBitmap;
    PBUTTONDATA pData;

    pCtrl   = Control(hWnd);
    dwStyle = pCtrl->dwStyle;

    switch(uMsg)
    {
        case MSG_CREATE:
            pData = (BUTTONDATA*) calloc (1, sizeof(BUTTONDATA));
            if (pData == NULL) 
                return -1;

            pData->status = 0;
            pData->data = pCtrl->dwAddData;
            pCtrl->dwAddData2 = (DWORD) pData;

            switch (dwStyle & BS_TYPEMASK) {
                case BS_PUSHBUTTON:
                case BS_DEFPUSHBUTTON:
                    SetWindowBkColor (hWnd, GetWindowElementColorEx (hWnd, BKC_BUTTON_DEF));
                    break;

                default:
                    if (dwStyle & BS_CHECKED)
                        pData->status |= BST_CHECKED;
                    break;
            }

        break;
       
        case MSG_DESTROY:
            free ((void*) pCtrl->dwAddData2);
        break;
        
#ifdef _PHONE_WINDOW_STYLE
		case MSG_SIZECHANGING:
		{
			const RECT* rcExpect = (const RECT*)wParam;
			RECT* rcResult = (RECT*)lParam;

			rcResult->left = rcExpect->left;
			rcResult->top = rcExpect->top;
			rcResult->right = rcExpect->right;
			rcResult->bottom = rcExpect->top + bmp_pushbutton->bmHeight;
		    return 0;
		}

        case MSG_SIZECHANGED:
        {
            RECT* rcWin = (RECT*)wParam;
            RECT* rcClient = (RECT*)lParam;
            *rcClient = *rcWin;
            return 1;
        }
#endif

        case BM_GETCHECK:
            switch (dwStyle & BS_TYPEMASK) {
                case BS_AUTOCHECKBOX:
                case BS_AUTORADIOBUTTON:
                case BS_CHECKBOX:
                case BS_RADIOBUTTON:
                    return (BUTTON_STATUS (pCtrl) & BST_CHECKED);
                
                case BS_3STATE:
                case BS_AUTO3STATE:
                    if (BUTTON_STATUS (pCtrl) & BST_INDETERMINATE)
                        return (BST_INDETERMINATE);
                    return (BUTTON_STATUS (pCtrl) & BST_CHECKED);
                
                default:
                    return 0;
            }
        break;
        
        case BM_GETSTATE:
            return (int)(BUTTON_STATUS (pCtrl));

        case BM_GETIMAGE:
        {
            int* image_type = (int*) wParam;

            if (dwStyle & BS_BITMAP) {
                if (image_type) {
                    *image_type = BM_IMAGE_BITMAP;
                }
                return (int)(BUTTON_DATA (pCtrl));
            }
            else if (dwStyle & BS_ICON) {
                if (image_type) {
                    *image_type = BM_IMAGE_ICON;
                }
                return (int)(BUTTON_DATA (pCtrl));
            }
        }
        return 0;
        
        case BM_SETIMAGE:
        {
            int oldImage = (int)BUTTON_DATA (pCtrl);

            if (wParam == BM_IMAGE_BITMAP) {
                pCtrl->dwStyle &= ~BS_ICON;
                pCtrl->dwStyle |= BS_BITMAP;
            }
            else if (wParam == BM_IMAGE_ICON){
                pCtrl->dwStyle &= ~BS_BITMAP;
                pCtrl->dwStyle |= BS_ICON;
            }

            if (lParam) {

⌨️ 快捷键说明

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