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

📄 checkbox.c

📁 rtCell 实时微内核-具有下列功能: 1. 完全抢占的实时微内核结构
💻 C
字号:
/*
 *******************************************************************************
 *                      The real-time kernel "rtCell"                          *
 *              Copyright 2005 taowentao, allrights reserved.                  *
 * File : Checkbox.c                                                           *
 * By   : taowentao     2006-09-02  2007-05-20                                 *
 *******************************************************************************
 */

#if !defined(CHECKBOX_H)
#include "giCell\Wins\include\Checkbox.h"
#endif  

/*
 *******************************************************************************
 *                                                                             *
 *******************************************************************************
 */

static COLOR CheckboxColor = GD_GRAY;
static COLOR BoxColor = GD_WHITE;
static COLOR CaptionColor = GD_BLACK;
static const BYTE boxChecked[7] = {0x02, 0x06, 0x8E, 0xDC, 0xF8, 0x70, 0x20};

/*
 *******************************************************************************
 *                                                                             *
 *******************************************************************************
 */

static void CheckboxPaint(VIEW *pView)
{
    CHECKBOX* pCh;
    int    xSize, ySize;
    COLOR  clr;
    RECT   r;
    POINT  pt; 

    pCh = OBJ_FROM_VIEW(pView);
    FillRect(&(pView->viewRect), pCh->CheckboxColor);

    /* get box position, and draw it */
    GetOrgFromAlign(CHECK_BOX_W, CHECK_BOX_H, &(pView->viewRect), pCh->Align, &pt);
    r.left = pt.x; r.right = pt.x+CHECK_BOX_W-1;
    r.top = pt.y; r.bottom = pt.y+CHECK_BOX_H-1;
    DrawDownRect(&r);
    r.left += 2; r.right -= 2;
    r.top += 2; r.bottom -= 2;
    if ((pCh->Status & CTRL_MOUSE_CATCH) && (pCh->Status & CTRL_MOUSE_ENTER))
        clr = pCh->BoxColor[1];
    else
        clr = pCh->BoxColor[0];
    FillRect(&r, clr);
    if (pCh->Status & CTRL_CHECKBOX_CHECKED) {
        DrawMatrix(pt.x+3, pt.y+3, 8, 7, boxChecked, pCh->CaptionColor);
    }
    
    xSize = TextWidth(pCh->pCaption);
    ySize = TextHeight(pCh->pCaption);
    GetOrgFromAlign(xSize, ySize, &(pView->viewRect), pCh->Align, &pt);
    if (pCh->Status & CTRL_MOUSE_ENTER) clr = MOUSEENTERCOLOR;
    else clr = pCh->CaptionColor;
    DrawText(pt.x+CHECK_BOX_W+CAPTION_XOFF, pt.y, pCh->pCaption, clr);
    if (pCh->Status & CTRL_FOCUSSED) {
        r.left = pt.x+CHECK_BOX_W+CAPTION_XOFF; r.right = r.left+xSize-1;
        r.top = pt.y; r.bottom = pt.y+ySize-1;
        if ((r.right+(CAPTION_XOFF>>1)) > pView->viewRect.right)
            r.right = pView->viewRect.right-(CAPTION_XOFF>>1);
        if (r.right > r.left)
            DrawFocusRect(&r, -(CAPTION_XOFF>>1), GD_BLACK);
    }
}

static CBOOL _cdecl_ CheckboxViewProc(VMSG *pMsg)
{  
    CHECKBOX* pCh = OBJ_FROM_VIEW(pMsg->pView);
    CBOOL     checked; 
    
    switch (pMsg->MsgID) {
    case MSM_LB_UP:
        if ((pCh->Status & CTRL_MOUSE_CATCH) == 0) return (true);
        pCh->Status &= ~(CTRL_MOUSE_CATCH);

        if ((pCh->Status & CTRL_FOCUSSED) &&
            (pCh->Status & CTRL_MOUSE_ENTER)) {
            if (pCh->Status & CTRL_CHECKBOX_CHECKED) {
                checked = false;
                pCh->Status &= ~CTRL_CHECKBOX_CHECKED;
            } else {
                checked = true;
                pCh->Status |= CTRL_CHECKBOX_CHECKED;
            }
            UpdateView(pMsg->pView);

            if (pCh->pChecked != NULL) {
                (*(pCh->pChecked))(checked);
            }
        }  
        return (true);  
    default:
        return (CtrlViewProc(pMsg, CheckboxPaint, &(pCh->Status)));
    }
}

CHECKBOX* CreateCheckbox(int left, int top, int width, int height, VIEW* pParent,
                         BYTE* pCaption, PCHECK pChecked, CWORD Align)
{
    VIEW   *pView;
    CHECKBOX *pCh; 

    if (pParent == NULL) return (NULL);

    pView = CreateControl(left, top, width, height, pParent, 0,
                          CheckboxViewProc, sizeof(CHECKBOX));
    if (pView == NULL) return (NULL);
    
    pCh = OBJ_FROM_VIEW(pView);
    pCh->pView = pView;
    pCh->CaptionColor = CaptionColor;
    pCh->BoxColor[0] = BoxColor;
    pCh->BoxColor[1] = CheckboxColor;
    pCh->pChecked = pChecked;
    pCh->ptCatch.x = 0; pCh->ptCatch.y = 0;
    pCh->CheckboxColor = CheckboxColor;
    pCh->pCaption = pCaption;
    pCh->Status = 0;
    pCh->Align = (Align & CTRL_ALIGN_VMASK);
    pCh->Align |= CTRL_ALIGN_LEFT;
    ShowView(pCh->pView);
    return (pCh);
}

void DeleteCheckbox(CHECKBOX *pCh)
{
    if (pCh == NULL) return;
    DeleteView(pCh->pView);
}

void SetCheckboxAlign(CHECKBOX *pCh, CWORD Align)
{
    if (pCh == NULL) return;
    pCh->Align = (Align & CTRL_ALIGN_VMASK);
    pCh->Align |= CTRL_ALIGN_LEFT;
    UpdateView(pCh->pView);
}

void SetCheckboxStatus(CHECKBOX *pCh, CBOOL check)
{
    if (pCh == NULL) return;
    if (check == true) pCh->Status |= CTRL_CHECKBOX_CHECKED;
    else if (check == false) pCh->Status &= ~CTRL_CHECKBOX_CHECKED;
    UpdateView(pCh->pView); 
}


⌨️ 快捷键说明

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