📄 scrolbar.c
字号:
/*
*******************************************************************************
* The real-time kernel "rtCell" *
* Copyright 2005 taowentao, allrights reserved. *
* File : Scrollbar.c *
* By : taowentao 2006-09-02 2007-05-20 *
*******************************************************************************
*/
#if !defined(SCROLLBAR_H)
#include "giCell\Wins\include\Scrolbar.h"
#endif
#if !defined(WINDOW_H)
#include "giCell\Wins\include\Window.h"
#endif
/*
*******************************************************************************
* *
*******************************************************************************
*/
static COLOR ScrollbarColor = GD_GRAY;
/*
*******************************************************************************
* *
*******************************************************************************
*/
void SetScrolbar(SCROLLBAR *pScrolbar, const int page, const RECT *pPositionRect,
const RECT *pVRect, const RECT *pMRect, CBOOL dblScrol)
{
VIEW *pView = pScrolbar->pView;
int xSize, Max, View;
long sliderSize;
RECT r = (*pPositionRect);
pScrolbar->Page = page;
if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
r.left = r.right-BOX_W+1;
xSize = GetRectYSize(&r);
if (dblScrol == true) {
xSize -= BOX_H;
pScrolbar->Status |= CTRL_SCROLLBAR_VBAR_EX;
} else {
pScrolbar->Status &= ~CTRL_SCROLLBAR_VBAR_EX;
}
Max = GetRectYSize(pMRect); View = GetRectYSize(pVRect);
pScrolbar->Max = Max - View;
pScrolbar->Value = pVRect->top - pMRect->top;
} else {
r.top = r.bottom-BOX_W+1;
if (dblScrol == true) r.right -= BOX_H;
xSize = GetRectXSize(&r);
Max = GetRectXSize(pMRect); View = GetRectXSize(pVRect);
pScrolbar->Max = Max - View;
pScrolbar->Value = pVRect->left - pMRect->left;
}
pScrolbar->sliderSize = 0;
if (xSize < (BOX_H*2)) {
/*if (xSize < (2*BOX_H_MIN)) xSize = (2*BOX_H_MIN);*/
pScrolbar->btnSize = BOX_H_MIN;
} else {
if (xSize >= (BOX_H*2+BOX_H_MIN)) {
sliderSize = View;
sliderSize *= (xSize-BOX_H*2);
sliderSize = (sliderSize + ((Max+1)>>1))/Max;
if (sliderSize < BOX_H_MIN) sliderSize = BOX_H_MIN;
pScrolbar->sliderSize = (int)sliderSize;
}
pScrolbar->btnSize = BOX_H;
}
if (pScrolbar->Value < 0) pScrolbar->Value = 0;
if (pScrolbar->Value > pScrolbar->Max) pScrolbar->Value = pScrolbar->Max;
SetViewRect(pView, r.left, r.top, GetRectXSize(&r), GetRectYSize(&r));
}
static int GetScrollSize(SCROLLBAR *pScrolbar)
{
VIEW *pView = pScrolbar->pView;
int xSize;
if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
xSize = GetRectYSize(&(pView->viewRect));
if (pScrolbar->Status & CTRL_SCROLLBAR_VBAR_EX)
xSize -= BOX_H;
} else {
xSize = GetRectXSize(&(pView->viewRect));
}
if (xSize < (2*BOX_H_MIN)) xSize = (2*BOX_H_MIN);
xSize -= ((pScrolbar->btnSize<<1)+pScrolbar->sliderSize);
return (xSize);
}
static int GetScrolbarPos(SCROLLBAR *pScrolbar)
{
int xSize = GetScrollSize(pScrolbar);
long val = pScrolbar->Value;
val = (val*xSize+((pScrolbar->Max+1)>>1));
val /= (pScrolbar->Max);
return ((int)val);
}
static void GetScrolbarR0(SCROLLBAR *pScrolbar, RECT *pRect)
{
RECT r0 = pScrolbar->pView->viewRect;
if (pScrolbar->Align & CTRL_ALIGN_VCENTER)
r0.bottom = r0.top+pScrolbar->btnSize-1;
else
r0.right = r0.left+pScrolbar->btnSize-1;
if (pRect != NULL) (*pRect) = r0;
}
static void GetScrolbarR1(SCROLLBAR *pScrolbar, RECT *pRect)
{
int xSize = GetScrollSize(pScrolbar);
RECT r1, r0;
GetScrolbarR0(pScrolbar, &r0);
r1 = r0;
if (pScrolbar->Align & CTRL_ALIGN_VCENTER)
MoveRect(&r1, 0, xSize+pScrolbar->btnSize+pScrolbar->sliderSize);
else
MoveRect(&r1, xSize+pScrolbar->btnSize+pScrolbar->sliderSize, 0);
if (pRect != NULL) (*pRect) = r1;
}
static void GetScrolbarR(SCROLLBAR *pScrolbar, RECT *pRect)
{
int x = GetScrolbarPos(pScrolbar);
RECT r = pScrolbar->pView->viewRect;
if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
MoveRect(&r, 0, x+pScrolbar->btnSize);
r.bottom = r.top+pScrolbar->sliderSize-1;
} else {
MoveRect(&r, x+pScrolbar->btnSize, 0);
r.right = r.left+pScrolbar->sliderSize-1;
}
if (pRect != NULL) (*pRect) = r;
}
static void GetScrolbarTrackRect(SCROLLBAR *pScrolbar, RECT *pRect)
{
RECT r = pScrolbar->pView->viewRect;
if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
r.top += pScrolbar->btnSize; r.bottom -= pScrolbar->btnSize;
if (pScrolbar->Status & CTRL_SCROLLBAR_VBAR_EX)
r.bottom -= BOX_H;
} else {
r.left += pScrolbar->btnSize; r.right -= pScrolbar->btnSize;
}
if (pRect != NULL) (*pRect) = r;
}
void SetScrolbarValue(SCROLLBAR *pScrolbar, const int value)
{
if (value >= 0 && value <= pScrolbar->Max) {
RECT r;
if (pScrolbar->Value == value) return;
pScrolbar->Value = value;
GetScrolbarTrackRect(pScrolbar, &r);
UpdateViewRect(pScrolbar->pView, &r);
}
}
static void ScrolbarPaint(VIEW *pView)
{
SCROLLBAR *pScrolbar;
CWORD Align;
int offl, offr;
RECT r, r0, r1, rt;
pScrolbar = OBJ_FROM_VIEW(pView);
Align = pScrolbar->Align;
GetScrolbarR(pScrolbar, &r);
GetScrolbarR0(pScrolbar, &r0);
GetScrolbarR1(pScrolbar, &r1);
offl = 0; offr = 0;
if (pScrolbar->Status & CTRL_SCROLLBAR_LEFT_UP)
offl = 1;
if (pScrolbar->Status & CTRL_SCROLLBAR_RIGHT_DOWN)
offr = 1;
/* get box position, and draw it */
if (Align & CTRL_ALIGN_VCENTER) {
FillRect(&r0, pScrolbar->ObjColor);
FillRect(&r1, pScrolbar->ObjColor);
if (pScrolbar->btnSize == BOX_H) {
DrawTriangle(Align, r0.top+8+offl, r0.left+7+offl, 3, -1, GD_BLACK);
DrawTriangle(Align, r1.bottom-9+offr, r1.left+7+offr, 3, 1, GD_BLACK);
} else {
DrawTriangle(Align, r0.top+4+offl, r0.left+7+offl, 1, -1, GD_BLACK);
DrawTriangle(Align, r1.bottom-4+offr, r1.left+7+offr, 1, 1, GD_BLACK);
}
if ((pView->wdStatus & VS_HASTRANS) == 0) {
rt = r0; rt.top = r0.bottom+1; rt.bottom = r.top-1;
FillRectColor2(&rt, GD_WHITE, GD_LIGHTGRAY);
rt.top = r.bottom+1; rt.bottom = r1.top-1;
FillRectColor2(&rt, GD_WHITE, GD_LIGHTGRAY);
}
if (pScrolbar->Status & CTRL_SCROLLBAR_VBAR_EX) {
rt = pScrolbar->pView->viewRect;
rt.top = r1.bottom+1;
FillRect(&rt, pScrolbar->ObjColor);
}
} else {
FillRect(&r0, pScrolbar->ObjColor);
FillRect(&r1, pScrolbar->ObjColor);
if (pScrolbar->btnSize == BOX_H) {
DrawTriangle(Align, r0.left+8+offl, r0.top+7+offl, 3, -1, GD_BLACK);
DrawTriangle(Align, r1.right-9+offr, r1.top+7+offr, 3, 1, GD_BLACK);
} else {
DrawTriangle(Align, r0.left+4+offl, r0.top+7+offl, 1, -1, GD_BLACK);
DrawTriangle(Align, r1.right-4+offr, r1.top+7+offr, 1, 1, GD_BLACK);
}
if ((pView->wdStatus & VS_HASTRANS) == 0) {
rt = r0; rt.left = r0.right+1; rt.right = r.left-1;
FillRectColor2(&rt, GD_WHITE, GD_LIGHTGRAY);
rt.left = r.right+1; rt.right = r1.left-1;
FillRectColor2(&rt, GD_WHITE, GD_LIGHTGRAY);
}
}
if (pScrolbar->Status & CTRL_SCROLLBAR_LEFT_UP) DrawRect(&r0, GD_DARKGRAY);
else DrawUpRect(&r0);
if (pScrolbar->Status & CTRL_SCROLLBAR_RIGHT_DOWN) DrawRect(&r1, GD_DARKGRAY);
else DrawUpRect(&r1);
FillRect(&r, pScrolbar->ObjColor);
DrawUpRect(&r);
}
static void ScrollbarBtn(SCROLLBAR *pScrolbar)
{
int scrollOff = pScrolbar->Value;
int vo = pScrolbar->Page;
if (pScrolbar->Status & CTRL_SCROLLBAR_LEFT_UP) {
if (pScrolbar->Value > 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -