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

📄 slidebox.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
字号:
/* ------------- slidebox.c ------------ */

#include "dflat.h"

static int (*GenericProc)
    (DFWINDOW wnd,DFMESSAGE msg,DF_PARAM p1,DF_PARAM p2);
static BOOL KeepRunning;
static int SliderLen;
static int Percent;
extern DF_DBOX SliderBoxDB;

static void InsertPercent(char *s)
{
    int offset;
    char pcc[5];

    sprintf(s, "%c%c%c",
            DF_CHANGECOLOR,
            DfColor[DF_DIALOG][DF_SELECT_COLOR][DF_FG]+0x80,
            DfColor[DF_DIALOG][DF_SELECT_COLOR][DF_BG]+0x80);
    s += 3;
    memset(s, ' ', SliderLen);
    *(s+SliderLen) = '\0';
    sprintf(pcc, "%d%%", Percent);
    strncpy(s+SliderLen/2-1, pcc, strlen(pcc));
    offset = (SliderLen * Percent) / 100;
    memmove(s+offset+4, s+offset, strlen(s+offset)+1);
    sprintf(pcc, "%c%c%c%c",
            DF_RESETCOLOR,
            DF_CHANGECOLOR,
            DfColor[DF_DIALOG][DF_SELECT_COLOR][DF_BG]+0x80,
            DfColor[DF_DIALOG][DF_SELECT_COLOR][DF_FG]+0x80);
    strncpy(s+offset, pcc, 4);
    *(s + strlen(s) - 1) = DF_RESETCOLOR;
}

static int
SliderTextProc (DFWINDOW wnd,DFMESSAGE msg,DF_PARAM p1,DF_PARAM p2)
{
    switch (msg)
    {
        case DFM_PAINT:
            Percent = (int)p2;
            InsertPercent(DfGetText(wnd) ?
                (char*)DfGetText(wnd) : SliderBoxDB.ctl[1].itext);
            GenericProc(wnd, DFM_PAINT, 0, 0);
            if (Percent >= 100)
                DfSendMessage(DfGetParent(wnd),DFM_COMMAND,DF_ID_CANCEL,0);
            if (!DfDispatchMessage ())
                DfPostMessage(DfGetParent(wnd), DFM_ENDDIALOG, 0, 0);
            return KeepRunning;
        default:
            break;
    }
    return GenericProc(wnd, msg, p1, p2);
}

static int
SliderBoxProc (DFWINDOW wnd, DFMESSAGE msg, DF_PARAM p1, DF_PARAM p2)
{
    int rtn;
    DFWINDOW twnd;
    switch (msg)    {
        case DFM_CREATE_WINDOW:
            DfAddAttribute(wnd, DF_SAVESELF);
            rtn = DfDefaultWndProc(wnd, msg, p1, p2);
            twnd = SliderBoxDB.ctl[1].wnd;
            GenericProc = twnd->wndproc;
            twnd->wndproc = SliderTextProc;
            KeepRunning = TRUE;
            DfSendMessage(wnd, DFM_CAPTURE_MOUSE, 0, 0);
            DfSendMessage(wnd, DFM_CAPTURE_KEYBOARD, 0, 0);
            return rtn;
        case DFM_COMMAND:
            if ((int)p2 == 0 && (int)p1 == DF_ID_CANCEL)    {
                if (Percent >= 100 ||
                        DfYesNoBox("Terminate process?"))
                    KeepRunning = FALSE;
                else
                    return TRUE;
            }
            break;
        case DFM_CLOSE_WINDOW:
            DfSendMessage(wnd, DFM_RELEASE_MOUSE, 0, 0);
            DfSendMessage(wnd, DFM_RELEASE_KEYBOARD, 0, 0);
            break;
        default:
            break;
    }
    return DfDefaultWndProc(wnd, msg, p1, p2);
}

DFWINDOW DfSliderBox(int len, char *ttl, char *msg)
{
    SliderLen = len;
    SliderBoxDB.dwnd.title = ttl;
    SliderBoxDB.dwnd.w =
        max((int)strlen(ttl),max(len, (int)strlen(msg)))+4;
    SliderBoxDB.ctl[0].itext = msg;
    SliderBoxDB.ctl[0].dwnd.w = strlen(msg);
    SliderBoxDB.ctl[0].dwnd.x =
        (SliderBoxDB.dwnd.w - strlen(msg)-1) / 2;
    SliderBoxDB.ctl[1].itext =
        DfRealloc(SliderBoxDB.ctl[1].itext, len+10);
    Percent = 0;
    InsertPercent(SliderBoxDB.ctl[1].itext);
    SliderBoxDB.ctl[1].dwnd.w = len;
    SliderBoxDB.ctl[1].dwnd.x = (SliderBoxDB.dwnd.w-len-1)/2;
    SliderBoxDB.ctl[2].dwnd.x = (SliderBoxDB.dwnd.w-10)/2;
    DfDialogBox(NULL, &SliderBoxDB, FALSE, SliderBoxProc);
    return SliderBoxDB.ctl[1].wnd;
}

/* EOF */

⌨️ 快捷键说明

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