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

📄 button.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
                 BUTTON_DATA (pCtrl) = (DWORD)lParam;
                 InvalidateRect (hWnd, NULL, TRUE);
            }

            return oldImage;
        }
        break;

        case BM_CLICK:
        {
            DWORD dwState;
            
            switch (pCtrl->dwStyle & BS_TYPEMASK)
            {
                case BS_AUTORADIOBUTTON:
                    if (!(BUTTON_STATUS (pCtrl) & BST_CHECKED))
                        SendMessage (hWnd, BM_SETCHECK, BST_CHECKED, 0);
                break;
                    
                case BS_AUTOCHECKBOX:
                    if (BUTTON_STATUS (pCtrl) & BST_CHECKED)
                        dwState = BST_UNCHECKED;
                    else
                        dwState = BST_CHECKED;
                                
                    SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0);
                break;
                    
                case BS_AUTO3STATE:
                    dwState = (BUTTON_STATUS (pCtrl) & 0x00000003L);
                    dwState = BST_INDETERMINATE - dwState;
                    SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0);
                break;
    
                case BS_PUSHBUTTON:
                case BS_DEFPUSHBUTTON:
                break;
            }
                
            NotifyParent (hWnd, pCtrl->id, BN_CLICKED);
            InvalidateRect (hWnd, NULL, TRUE);
        }
        break;
        
        case MSG_SETTEXT:
        {
            int len = strlen((char*)lParam);
            FreeFixStr (pCtrl->spCaption);
            pCtrl->spCaption = FixStrAlloc (len);
            if (len > 0)
                strcpy (pCtrl->spCaption, (char*)lParam);
            InvalidateRect (hWnd, NULL, TRUE);
            break;
        }

        case BM_SETCHECK:
        {
            DWORD dwOldState = BUTTON_STATUS (pCtrl);

            switch (dwStyle & BS_TYPEMASK) {
                case BS_CHECKBOX:
                case BS_AUTOCHECKBOX:
                    if (wParam & BST_CHECKED)
                        BUTTON_STATUS(pCtrl) |= BST_CHECKED;
                    else
                        BUTTON_STATUS(pCtrl) &= ~BST_CHECKED;
                break;
            
                case BS_AUTORADIOBUTTON:
                case BS_RADIOBUTTON:
                    if ( ((BUTTON_STATUS(pCtrl) & BST_CHECKED) == 0)
                            && (wParam & BST_CHECKED) ) {
                        BUTTON_STATUS(pCtrl) |= BST_CHECKED;
                        
                        btnUncheckOthers (pCtrl);
                    }
                    else if ( (BUTTON_STATUS(pCtrl) & BST_CHECKED)
                            && (!(wParam & BST_CHECKED)) ) {
                        BUTTON_STATUS(pCtrl) &= ~BST_CHECKED;
                    }
                break;
            
                case BS_3STATE:
                case BS_AUTO3STATE:
                    switch (wParam) { 
                        case BST_INDETERMINATE:
                        case BST_CHECKED:
                        case BST_UNCHECKED:
                            BUTTON_STATUS(pCtrl) &= 0xFFFFFFFC;
                            BUTTON_STATUS(pCtrl) += (wParam & 0x00000003);
                    }
                break;
            }
                
            if (dwOldState != BUTTON_STATUS(pCtrl))
                InvalidateRect (hWnd, NULL, TRUE);

            return dwOldState;
        }
        
        case BM_SETSTATE:
        {
            DWORD dwOldState = BUTTON_STATUS(pCtrl) & BST_PUSHED;
            
            if (wParam)
                BUTTON_STATUS(pCtrl) |= BST_PUSHED;
            else
                BUTTON_STATUS(pCtrl) &= ~BST_PUSHED;
            
            if (dwOldState != (BUTTON_STATUS(pCtrl) & BST_PUSHED))
                InvalidateRect (hWnd, NULL, TRUE);

            return dwOldState;
        }
                
        case BM_SETSTYLE:
            pCtrl->dwStyle &= 0xFFFF0000;
            pCtrl->dwStyle |= (DWORD)(wParam & 0x0000FFFF);
            if (LOWORD (lParam))
                InvalidateRect (hWnd, NULL, TRUE);
        break;
        
        case MSG_CHAR:
            if (HIBYTE (wParam) == 0 
                    && ((dwStyle & BS_TYPEMASK) == BS_CHECKBOX
                     || (dwStyle & BS_TYPEMASK) == BS_AUTOCHECKBOX)) {
                DWORD dwOldState = BUTTON_STATUS(pCtrl);
                
                if (LOBYTE(wParam) == '+' || LOBYTE(wParam) == '=')
                    BUTTON_STATUS(pCtrl) |= BST_CHECKED;
                else if (LOBYTE(wParam) == '-')
                    BUTTON_STATUS(pCtrl) &= ~BST_CHECKED;
                    
                if (dwOldState != BUTTON_STATUS(pCtrl))
                    InvalidateRect (hWnd, NULL, TRUE);
            }
        break;
        
        case MSG_ENABLE:
            if (wParam && (dwStyle & WS_DISABLED))
                pCtrl->dwStyle &= ~WS_DISABLED;
            else if (!wParam && !(dwStyle & WS_DISABLED))
                pCtrl->dwStyle |= WS_DISABLED;
            else
                return 0;
            InvalidateRect (hWnd, NULL, TRUE);
        return 0;

        case MSG_GETDLGCODE:
            switch (dwStyle & BS_TYPEMASK) {
                case BS_CHECKBOX:
                case BS_AUTOCHECKBOX:
                return DLGC_WANTCHARS | DLGC_BUTTON;
                
                case BS_RADIOBUTTON:
                case BS_AUTORADIOBUTTON:
                return DLGC_RADIOBUTTON | DLGC_BUTTON;
                
                case BS_DEFPUSHBUTTON:
                return DLGC_DEFPUSHBUTTON;
                
                case BS_PUSHBUTTON:
                return DLGC_PUSHBUTTON;
                
                case BS_3STATE:
                case BS_AUTO3STATE:
                return DLGC_3STATE;

                default:
                return 0;
            }
        break;

        case MSG_NCHITTEST:
        {
            int x, y;
            
            x = (int)wParam;
            y = (int)lParam;
        
            if (PtInRect ((PRECT) &(pCtrl->cl), x, y))
                return HT_CLIENT;
            else  
                return HT_OUT;
        }
        break;
    
        case MSG_KILLFOCUS:
            BUTTON_STATUS(pCtrl) &= (~BST_FOCUS);
            if (GetCapture() == hWnd) {
                ReleaseCapture ();
                BUTTON_STATUS(pCtrl) &= (~BST_PUSHED);
            }

            if (dwStyle & BS_NOTIFY)
                NotifyParent (hWnd, pCtrl->id, BN_KILLFOCUS);

            InvalidateRect (hWnd, NULL, TRUE);
        break;

        case MSG_SETFOCUS:
            BUTTON_STATUS(pCtrl) |= BST_FOCUS;

            if (dwStyle & BS_NOTIFY)
                NotifyParent (hWnd, pCtrl->id, BN_SETFOCUS);

            InvalidateRect (hWnd, NULL, TRUE);
        break;
        
        case MSG_KEYDOWN:
            if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER)
                break;

            if (GetCapture () == hWnd)
                break;
            
            SetCapture (hWnd);

            BUTTON_STATUS(pCtrl) |= BST_PUSHED;
            BUTTON_STATUS(pCtrl) |= BST_FOCUS;

            if (dwStyle & BS_NOTIFY)
                NotifyParent (hWnd, pCtrl->id, BN_PUSHED);

            InvalidateRect (hWnd, NULL, TRUE);
        break;
        
        case MSG_KEYUP:
        {
            DWORD dwState;
            
            if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER)
                break;
                
            if (GetCapture () != hWnd)
                break;

            BUTTON_STATUS(pCtrl) &= ~BST_PUSHED;
            ReleaseCapture ();
            
            InvalidateRect (hWnd, NULL, TRUE);

            switch (pCtrl->dwStyle & BS_TYPEMASK)
            {
                case BS_AUTORADIOBUTTON:
                    if (!(BUTTON_STATUS(pCtrl) & BST_CHECKED))
                        SendMessage (hWnd, BM_SETCHECK, BST_CHECKED, 0);
                break;
                    
                case BS_AUTOCHECKBOX:
                    if (BUTTON_STATUS(pCtrl) & BST_CHECKED)
                        dwState = BST_UNCHECKED;
                    else
                        dwState = BST_CHECKED;
                                
                    SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0);
                break;
                    
                case BS_AUTO3STATE:
                    dwState = (BUTTON_STATUS(pCtrl) & 0x00000003L);
                    dwState = (dwState + 1) % 3;
                    SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0);
                break;
    
                case BS_PUSHBUTTON:
                case BS_DEFPUSHBUTTON:
                break;
            }

            NotifyParent (hWnd, pCtrl->id, BN_CLICKED);
            if (dwStyle & BS_NOTIFY)
                NotifyParent (hWnd, pCtrl->id, BN_UNPUSHED);
        }
        break;
      
        case MSG_LBUTTONDBLCLK:
            if (dwStyle & BS_NOTIFY)
                NotifyParent (hWnd, pCtrl->id, BN_DBLCLK);
        break;
        
        case MSG_LBUTTONDOWN:
            if (GetCapture () == hWnd)
                break;
            
            SetCapture (hWnd);
                
            BUTTON_STATUS(pCtrl) |= BST_PUSHED;
            BUTTON_STATUS(pCtrl) |= BST_FOCUS;

            if (dwStyle & BS_NOTIFY)
                NotifyParent (hWnd, pCtrl->id, BN_PUSHED);

            InvalidateRect (hWnd, NULL, TRUE);
        break;
    
        case MSG_LBUTTONUP:
        {
            int x, y;
            DWORD dwState;

            if (GetCapture() != hWnd)
                break;

            ReleaseCapture ();

            x = LOSWORD(lParam);
            y = HISWORD(lParam);
            ScreenToClient (GetParent (hWnd), &x, &y);
            
            if (PtInRect ((PRECT) &(pCtrl->cl), x, y))
            {
                switch (pCtrl->dwStyle & BS_TYPEMASK)
                {
                    case BS_AUTORADIOBUTTON:
                        if (!(BUTTON_STATUS(pCtrl) & BST_CHECKED))
                            SendMessage (hWnd, BM_SETCHECK, BST_CHECKED, 0);
                    break;
                    
                    case BS_AUTOCHECKBOX:
                        if (BUTTON_STATUS(pCtrl) & BST_CHECKED)
                            dwState = BST_UNCHECKED;
                        else
                            dwState = BST_CHECKED;
                                
                        SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0);
                    break;
                    
                    case BS_AUTO3STATE:
                        dwState = (BUTTON_STATUS(pCtrl) & 0x00000003L);
                        dwState = (dwState + 1) % 3;
                        SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0);
                    break;
    
                    case BS_PUSHBUTTON:
                    case BS_DEFPUSHBUTTON:
                    break;
                }
                
                BUTTON_STATUS(pCtrl) &= ~BST_PUSHED;

                if (dwStyle & BS_NOTIFY)
                    NotifyParent (hWnd, pCtrl->id, BN_UNPUSHED);
                NotifyParent (hWnd, pCtrl->id, BN_CLICKED);

                InvalidateRect (hWnd, NULL, TRUE);
            }
            else if (BUTTON_STATUS(pCtrl) & BST_PUSHED) {
                BUTTON_STATUS(pCtrl) &= ~BST_PUSHED;

                if (dwStyle & BS_NOTIFY)
                    NotifyParent (hWnd, pCtrl->id, BN_UNPUSHED);

                InvalidateRect (hWnd, NULL, TRUE);
            }
        }
        return 0;
                
        case MSG_MOUSEMOVE:
        {
            int x, y;

            if (GetCapture() != hWnd)
                break;

            x = LOSWORD(lParam);
            y = HISWORD(lParam);
            ScreenToClient (GetParent (hWnd), &x, &y);
            
            if (PtInRect ((PRECT) &(pCtrl->cl), x, y))
            {
                if ( !(BUTTON_STATUS(pCtrl) & BST_PUSHED) ) {
                    BUTTON_STATUS(pCtrl) |= BST_PUSHED;
                    
                    if (dwStyle & BS_NOTIFY)
                        NotifyParent (hWnd, pCtrl->id, BN_PUSHED);
                    InvalidateRect (hWnd, NULL, TRUE);
                }
            }
            else if (BUTTON_STATUS(pCtrl) & BST_PUSHED) {
                BUTTON_STATUS(pCtrl) &= ~BST_PUSHED;

                if (dwStyle & BS_NOTIFY)
                    NotifyParent (hWnd, pCtrl->id, BN_UNPUSHED);
                InvalidateRect (hWnd, NULL, TRUE);
            }
        }
        break;
    
        case MSG_PAINT:
        {
            hdc = BeginPaint (hWnd);
            btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap);

            if (BUTTON_STATUS(pCtrl) & BST_PUSHED)
                btnPaintPushedButton (pCtrl, hdc, dwStyle,
                    &rcClient, &rcText, &rcBitmap);
            else if (BUTTON_STATUS(pCtrl) & BST_CHECKED)
                btnPaintCheckedButton (pCtrl, hdc, dwStyle, 
                    &rcClient, &rcText, &rcBitmap);
            else if (BUTTON_STATUS(pCtrl) & BST_INDETERMINATE)
                btnPaintInterminateButton (pCtrl, hdc, dwStyle,
                    &rcClient, &rcText, &rcBitmap);
            else
                btnPaintNormalButton (pCtrl, hdc, dwStyle,
                    &rcClient, &rcText, &rcBitmap);
            
            btnPaintContent (pCtrl, hdc, dwStyle, &rcText);

            if (BUTTON_STATUS(pCtrl) & BST_FOCUS)
                btnPaintFocusButton (pCtrl, hdc, dwStyle,
                    &rcClient, &rcText, &rcBitmap);
                
            EndPaint (hWnd, hdc);
        }
        return 0;

        default:
        break;
    }
    
    return DefaultControlProc (hWnd, uMsg, wParam, lParam);
}

#endif /* _CTRL_BUTTON */

⌨️ 快捷键说明

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