📄 checkbox.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 + -