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

📄 trackbar.c

📁 有了操作系统、TCP/IP协议栈、文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/*** $Id: trackbar.c,v 1.35 2005/01/31 09:12:48 clear Exp $**** trackbar.c: the TrackBar Control module.**** Copyright (C) 2003, 2004 Feynman Software.** Copyright (C) 2000 ~ 2002 Wei Yongming.**** NOTE: Originally by Zheng Yiran**** Create date: 2000/12/02*//*** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*//*** TODO:*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "common.h"#include "minigui.h"#include "gdi.h"#include "window.h"#include "ctrl/ctrlhelper.h"#include "ctrl/trackbar.h"#include "cliprect.h"#include "internals.h"#include "ctrlclass.h"#ifdef _CTRL_TRACKBAR#include "ctrlmisc.h"#include "trackbar_impl.h"#ifdef _PHONE_WINDOW_STYLEstatic const BITMAP *bmp_hbg, *bmp_hslider;static const BITMAP *bmp_vbg, *bmp_vslider;#define WIDTH_HORZ_SLIDER       (bmp_hslider->bmWidth)#define HEIGHT_VERT_SLIDER      (bmp_vslider->bmHeight)#else   /* not _PHONE_WINDOW_STYLE *//* use these definition when drawing trackbar */#define TB_BORDER               2#define WIDTH_HORZ_SLIDER       24#define HEIGHT_HORZ_SLIDER      12#define WIDTH_VERT_SLIDER       12#define HEIGHT_VERT_SLIDER      24#define WIDTH_VERT_RULER        6#define HEIGHT_HORZ_RULER       6/* please keep it even for good appearance */#define LEN_TICK                4#define GAP_TIP_SLIDER          12#define GAP_TICK_SLIDER         6#endif  /* not _PHONE_WINDOW_STYLE */static int TrackBarCtrlProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam);BOOL RegisterTrackBarControl (void){    WNDCLASS WndClass;#ifdef _PHONE_WINDOW_STYLE    if ((bmp_hbg = GetStockBitmap (STOCKBMP_TRACKBAR_HBG, 0, 0)) == NULL)        return FALSE;    if ((bmp_hslider = GetStockBitmap (STOCKBMP_TRACKBAR_HSLIDER, 0, 0)) == NULL)        return FALSE;    if ((bmp_vbg = GetStockBitmap (STOCKBMP_TRACKBAR_VBG, 0, 0)) == NULL)        return FALSE;    if ((bmp_vslider = GetStockBitmap (STOCKBMP_TRACKBAR_VSLIDER, 0, 0)) == NULL)        return FALSE;#endif    WndClass.spClassName = "trackbar";    WndClass.dwStyle     = WS_NONE;    WndClass.dwExStyle   = WS_EX_NONE;    WndClass.hCursor     = GetSystemCursor (0);    WndClass.iBkColor    = GetWindowElementColor (BKC_CONTROL_DEF);    WndClass.WinProc     = TrackBarCtrlProc;    return AddNewControlClass (&WndClass) == ERR_OK;}#if 0void TrackBarControlCleanup (void){    return;}#endif#ifdef _PHONE_WINDOW_STYLEstatic void GetTrackbarRects (TRACKBARDATA* pData, DWORD dwStyle, const RECT* rc_client, RECT* rc_ruler, RECT* rc_slider){    int     l, t, w, h;    int     pos, min, max;    int     sliderx, slidery, sliderw, sliderh;    /* get data of trackbar. */    w = RECTWP (rc_client);    h = RECTHP (rc_client);    pos = pData->nPos;    max = pData->nMax;    min = pData->nMin;    /* get width/height of slider. */    if (dwStyle & TBS_VERTICAL) {        sliderw = bmp_vslider->bmWidth;        sliderh = bmp_vslider->bmHeight;        h -= sliderh;        l = 0; t = sliderh>>1;    }    else {        sliderw = bmp_hslider->bmWidth;        sliderh = bmp_hslider->bmHeight;        w -= sliderw;        l = sliderw>>1; t = 0;    }    /* get the rectangle of the ruler. */    if (rc_ruler) {        SetRect (rc_ruler, l, t, l + w, t + h);    }        /* get the rectangle of the slider according to position. */    if (dwStyle & TBS_VERTICAL) {        sliderx = (w - sliderw)>>1;         slidery = t + (int)((max - pos) * h / (float)(max - min)) - (sliderh>>1);    }    else {        slidery = (h - sliderh)>>1;         sliderx = l + (int)((pos - min) * w / (float)(max - min)) - (sliderw>>1);    }    SetRect (rc_slider, sliderx, slidery, sliderx + sliderw, slidery + sliderh);}static void TrackBarOnDraw (HWND hwnd, HDC hdc, TRACKBARDATA* pData, DWORD dwStyle){    RECT rc_client, rc_ruler, rc_slider;    GetClientRect (hwnd, &rc_client);    GetTrackbarRects (pData, dwStyle, &rc_client, &rc_ruler, &rc_slider);    /* draw the ruler. */    if (dwStyle & TBS_VERTICAL)        DrawBoxFromBitmap (hdc, &rc_ruler, bmp_vbg, FALSE, FALSE);    else        DrawBoxFromBitmap (hdc, &rc_ruler, bmp_hbg, TRUE, FALSE);        /* draw the slider. */    FillBoxWithBitmap (hdc, rc_slider.left, rc_slider.top, 0, 0,             (dwStyle & TBS_VERTICAL) ? bmp_vslider : bmp_hslider);}#else /* not _PHONE_WINDOW_STYLE */static void GetTrackbarRects (TRACKBARDATA* pData, DWORD dwStyle, const RECT* rc_client, RECT* rc_ruler, RECT* rc_slider){    int x, y, w, h;    int pos, min, max;    int sliderx, slidery, sliderw, sliderh;    /* get data of trackbar. */    x = rc_client->left;    y = rc_client->top;    w = RECTWP (rc_client);    h = RECTHP (rc_client);    pos = pData->nPos;    max = pData->nMax;    min = pData->nMin;    if (dwStyle & TBS_BORDER) {        x += TB_BORDER;        y += TB_BORDER;        w -= TB_BORDER << 1;        h -= TB_BORDER << 1;    }    /* get the rectangle of the ruler. */    if (rc_ruler) {        if (dwStyle & TBS_VERTICAL) {            rc_ruler->left = x + ((w - WIDTH_VERT_RULER)>>1);            rc_ruler->top = y + (HEIGHT_VERT_SLIDER >> 1);            rc_ruler->right = x + ((w + WIDTH_VERT_RULER)>>1);            rc_ruler->bottom = y + h - (HEIGHT_VERT_SLIDER >> 1);        }        else {            rc_ruler->left = x + (WIDTH_HORZ_SLIDER >> 1);            rc_ruler->top = y + ((h - HEIGHT_HORZ_RULER)>>1);            rc_ruler->right = x + w - (WIDTH_HORZ_SLIDER >> 1);            rc_ruler->bottom = y + ((h + HEIGHT_HORZ_RULER)>>1);        }    }    /* get width/height of the slider. */    if (dwStyle & TBS_VERTICAL) {        sliderw = WIDTH_VERT_SLIDER;        sliderh = HEIGHT_VERT_SLIDER;    }    else {        sliderw = WIDTH_HORZ_SLIDER;        sliderh = HEIGHT_HORZ_SLIDER;    }    if (dwStyle & TBS_VERTICAL) {        sliderx = x + ((w - sliderw) >> 1);         slidery = y + (HEIGHT_VERT_SLIDER>>1)+ (int)((max - pos) *                 (h - HEIGHT_VERT_SLIDER) / (float)(max - min)) - (sliderh>>1);    }    else {        slidery = y + ((h - sliderh) >> 1);         sliderx = x + (WIDTH_HORZ_SLIDER >> 1) + (int)((pos - min) *                 (w - WIDTH_HORZ_SLIDER) / (float)(max - min)) - (sliderw>>1);    }    SetRect (rc_slider, sliderx, slidery, sliderx + sliderw, slidery + sliderh);}static void TrackBarOnDraw (HWND hwnd, HDC hdc, TRACKBARDATA* pData, DWORD dwStyle){    RECT    rc_client, rc_ruler, rc_slider;    int     x, y, w, h;    int     max, min;    int     TickFreq, EndTipLen;    int     sliderx, slidery, sliderw, sliderh;    int     TickStart, TickEnd;    float   TickGap, Tick;    char    sPos[10];    GetClientRect (hwnd, &rc_client);    GetTrackbarRects (pData, dwStyle, &rc_client, &rc_ruler, &rc_slider);    x = rc_client.left;    y = rc_client.top;    w = RECTW (rc_client);    h = RECTH (rc_client);    if (dwStyle & TBS_BORDER) {        x += TB_BORDER;        y += TB_BORDER;        w -= TB_BORDER << 1;        h -= TB_BORDER << 1;    }    /* get data of trackbar. */    TickFreq = pData->nTickFreq;    /* draw the border according to trackbar style. */#ifdef _FLAT_WINDOW_STYLE    if (dwStyle & TBS_BORDER) {        DrawFlatControlFrameEx (hdc,  hwnd,            rc_client.left, rc_client.top,            rc_client.right, rc_client.bottom,            0, DF_3DBOX_PRESSED | DF_3DBOX_NOTFILL, 0);    }#else    if (dwStyle & TBS_BORDER) {        Draw3DControlFrameEx (hdc, hwnd,            rc_client.left, rc_client.top,            rc_client.right, rc_client.bottom,            DF_3DBOX_PRESSED | DF_3DBOX_NOTFILL, 0);    }#endif    /* draw the rulder in middle of trackbar. */#ifdef _FLAT_WINDOW_STYLE    DrawFlatControlFrameEx (hdc, hwnd,            rc_ruler.left, rc_ruler.top,            rc_ruler.right - 1, rc_ruler.bottom - 1,            0, DF_3DBOX_PRESSED | DF_3DBOX_NOTFILL, 0);        #else    Draw3DControlFrameEx (hdc, hwnd,            rc_ruler.left, rc_ruler.top,            rc_ruler.right - 1, rc_ruler.bottom - 1,            DF_3DBOX_PRESSED | DF_3DBOX_NOTFILL, 0); #endif        max = pData->nMax;    min = pData->nMin;    sliderx = rc_slider.left;    slidery = rc_slider.top;    sliderw = RECTW(rc_slider);    sliderh = RECTH(rc_slider);    /* draw the tick of trackbar. */    if (!(dwStyle & TBS_NOTICK) && TickFreq < (max - min)) {        SetPenColor (hdc, PIXEL_black);        if (dwStyle & TBS_VERTICAL) {            TickStart = y + (HEIGHT_VERT_SLIDER >> 1);             TickGap = (h - HEIGHT_VERT_SLIDER) / (float)(max - min) * TickFreq;            TickEnd = y + h - (HEIGHT_VERT_SLIDER >> 1);            for (Tick = TickStart; Tick < TickEnd; Tick += TickGap) {                 MoveTo (hdc, x + (w>>1) + (sliderw>>1) + GAP_TICK_SLIDER, (int) Tick);                LineTo (hdc, x + (w>>1) + (sliderw>>1) + GAP_TICK_SLIDER + LEN_TICK, (int) Tick);            }            MoveTo (hdc, x + (w>>1) + (sliderw>>1) + GAP_TICK_SLIDER, TickEnd);            LineTo (hdc, x + (w>>1) + (sliderw>>1) + GAP_TICK_SLIDER + LEN_TICK, TickEnd);        } else {            TickStart = x + (WIDTH_HORZ_SLIDER >> 1);             TickGap = (w - WIDTH_HORZ_SLIDER) / (float)(max - min) * TickFreq;            TickEnd = x + w - (WIDTH_HORZ_SLIDER >> 1);            for (Tick = TickStart; Tick < TickEnd; Tick += TickGap) {                 MoveTo (hdc, (int)Tick, y + (h>>1) + (sliderh>>1) + GAP_TICK_SLIDER);                LineTo (hdc, (int)Tick, y + (h>>1) + (sliderh>>1) + GAP_TICK_SLIDER + LEN_TICK);            }            MoveTo (hdc, TickEnd, y + (h>>1) + (sliderh>>1) + GAP_TICK_SLIDER);            LineTo (hdc, TickEnd, y + (h>>1) + (sliderh>>1) + GAP_TICK_SLIDER + LEN_TICK);        }    }    /* draw the slider of trackbar according to pos. */#ifdef _FLAT_WINDOW_STYLE    DrawFlatControlFrameEx (hdc, hwnd,            rc_slider.left, rc_slider.top,            rc_slider.right - 1, rc_slider.bottom - 1, 0,             DF_3DBOX_NORMAL | DF_3DBOX_FILL, GetWindowBkColor (hwnd));#else    Draw3DControlFrameEx (hdc, hwnd,            rc_slider.left, rc_slider.top,            rc_slider.right - 1, rc_slider.bottom - 1,            DF_3DBOX_NORMAL | DF_3DBOX_FILL, GetWindowBkColor (hwnd));#endif    SetPenColor (hdc, GetWindowElementColorEx (hwnd, FGC_CONTROL_NORMAL));    if (dwStyle & TBS_VERTICAL) {        MoveTo (hdc, sliderx + (sliderw >> 1) - 3, slidery + (sliderh >> 1));        LineTo (hdc, sliderx + (sliderw >> 1) + 3, slidery + (sliderh >> 1));        MoveTo (hdc, sliderx + (sliderw >> 1) - 2, slidery + (sliderh >> 1) - 2);        LineTo (hdc, sliderx + (sliderw >> 1) + 2, slidery + (sliderh >> 1) - 2);        MoveTo (hdc, sliderx + (sliderw >> 1) - 2, slidery + (sliderh >> 1) + 2);        LineTo (hdc, sliderx + (sliderw >> 1) + 2, slidery + (sliderh >> 1) + 2);    }    else {        MoveTo (hdc, sliderx + (sliderw >> 1), slidery + (sliderh >> 1) - 3);        LineTo (hdc, sliderx + (sliderw >> 1), slidery + (sliderh >> 1) + 3);        MoveTo (hdc, sliderx + (sliderw >> 1) - 2, slidery + (sliderh >> 1) - 2);        LineTo (hdc, sliderx + (sliderw >> 1) - 2, slidery + (sliderh >> 1) + 2);        MoveTo (hdc, sliderx + (sliderw >> 1) + 2, slidery + (sliderh >> 1) - 2);        LineTo (hdc, sliderx + (sliderw >> 1) + 2, slidery + (sliderh >> 1) + 2);    }    /* draw the tip of trackbar. */    if ((dwStyle & TBS_TIP) && !(dwStyle & TBS_VERTICAL)) {

⌨️ 快捷键说明

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