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

📄 easytab.c

📁 基于Labwindows的电池故障诊断系统
💻 C
📖 第 1 页 / 共 5 页
字号:
        match the rotatation.
    */
static int RotatePixels90Degrees(int **pixels, int *height, int *width, int rotateLeft)
{
    int error = UIENoError;
    int *rotatedPixels = NULL;
    int *currPixels = *pixels;
    int oldHeight;
    int oldWidth;
    int newHeight;
    int newWidth;
    int h, w;
    
    oldHeight = *height;
    oldWidth = *width;
    newHeight = *width;
    newWidth = *height;
    
    nullChk( rotatedPixels = (int *)malloc(newHeight * newWidth * sizeof(int)));
    
    if (rotateLeft)
        {
        for (h = 0; h < oldHeight; h++)
            for (w = 0; w < oldWidth; w++)
                rotatedPixels[(oldWidth - w - 1) * newWidth + h] = currPixels[h * oldWidth + w];
        }
    else    /* rotate right */
        {
        for (h = 0; h < oldHeight; h++)
            for (w = 0; w < oldWidth; w++)
                rotatedPixels[w * newWidth + (oldHeight - h - 1)] = currPixels[h * oldWidth + w];
        }

Error:
    if (error < 0)
        {
        free(rotatedPixels);
        }
    else
        {
        free(*pixels);
        *pixels = rotatedPixels;
        *height = newHeight;
        *width = newWidth;
        }
        
    return error;
}

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

static int TabButton_CreateTextBitmap(TabButton tabButton)
{
    int             error = UIENoError;
    threadLocalVars *pTlv = 0;
    TabGroup        group;
    int             *pixels = 0;
    int             height, width;
    
    group = tabButton->sheet->group;
    height = tabButton->labelSize.y;
    width = tabButton->labelSize.x;
    
    InitializeMultithreadingIfNecessary();
    CmtGetThreadLocalVar (gThreadLocalHandle, &pTlv);
        
    errChk( TabButton_GetTextCanvas(&pTlv->bitmapPanel, &pTlv->bitmapCanvas, tabButton->labelSize));
    CanvasClear(pTlv->bitmapPanel, pTlv->bitmapCanvas, VAL_ENTIRE_OBJECT);
    
    /*DisplayPanel(panel);*/
    
    TabButton_DrawText(tabButton, pTlv->bitmapPanel, pTlv->bitmapCanvas, MakePoint(0,0));
    nullChk( pixels = (int *)calloc(height * width * sizeof(int), 1));
    CanvasGetPixels (pTlv->bitmapPanel, pTlv->bitmapCanvas, MakeRect(0,0, height, width), pixels);

    switch (group->buttonPosition)
        {
        case VAL_EASY_TAB_BTNS_ON_TOP:
        case VAL_EASY_TAB_BTNS_ON_BOTTOM:
            break;
        case VAL_EASY_TAB_BTNS_ON_RIGHT:
            errChk( RotatePixels90Degrees(&pixels, &height, &width, FALSE));
            break;
        case VAL_EASY_TAB_BTNS_ON_LEFT:
            errChk( RotatePixels90Degrees(&pixels, &height, &width, TRUE));
            break;
        }
        
    errChk( CreateTransparentOneColorBitmap(pixels, group->textColor, height, width, &tabButton->bitmap));
    
Error:
    free(pixels);
    return error;
}

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

static void TabButton_DrawText(TabButton tabButton, int panel, int canvas, Point textPosition)
{
    TabGroup    group;
    
    group = tabButton->sheet->group;

    SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, group->textColor);
    SetCtrlAttribute(panel, canvas, ATTR_PEN_FILL_COLOR, VAL_TRANSPARENT);
    CanvasDrawTextAtPoint(panel, canvas, tabButton->displayLabel, group->metaFont, textPosition, VAL_UPPER_LEFT);
    
    if (tabButton->acceleratorKey != 0)
        {
        Point   start = MakePoint(textPosition.x + tabButton->underlineOffset, textPosition.y + tabButton->labelSize.y - 1);
        Point   end =   MakePoint(textPosition.x + tabButton->underlineOffset + tabButton->underlineWidth - 1, start.y);

        if (end.x <= start.x)
            end.x = start.x + 2;
        CanvasDrawLine(panel, canvas, start, end);
        }
}

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

static void TabButton_DrawLabel(TabButton tabButton, Rect bounds)
{
    Point       textPosition;
    TabGroup    group;
    int         panel;
    int         canvas;
    
    group = tabButton->sheet->group;
    panel = group->dialogPanel;
    canvas = group->canvas;
    
    switch (group->buttonPosition)
        {
        case VAL_EASY_TAB_BTNS_ON_TOP:
            textPosition.x = bounds.left + (bounds.width - tabButton->labelSize.x) / 2;
            textPosition.y = bounds.top + TABBUTTON_TOP_MARGIN;
            break;
        case VAL_EASY_TAB_BTNS_ON_RIGHT:
            textPosition.x = bounds.left + bounds.width - TABBUTTON_TOP_MARGIN - tabButton->labelSize.y - 1;
            textPosition.y = bounds.top + (bounds.height - tabButton->labelSize.x) / 2;
            break;
        case VAL_EASY_TAB_BTNS_ON_LEFT:
            textPosition.x = bounds.left + TABBUTTON_TOP_MARGIN;
            textPosition.y = bounds.top  + (bounds.height - tabButton->labelSize.x) / 2;
            break;
        case VAL_EASY_TAB_BTNS_ON_BOTTOM:
            textPosition.y = bounds.top + bounds.height - TABBUTTON_TOP_MARGIN - tabButton->labelSize.y - 2;
            textPosition.x = bounds.left + (bounds.width - tabButton->labelSize.x) / 2;
            break;
        }
        
    switch (group->buttonPosition)
        {
        case VAL_EASY_TAB_BTNS_ON_RIGHT:
        case VAL_EASY_TAB_BTNS_ON_LEFT:
            if (tabButton->bitmap == 0)
                TabButton_CreateTextBitmap(tabButton);
            break;
        }

    if (tabButton->bitmap != 0)
        CanvasDrawBitmap (panel, canvas, tabButton->bitmap, VAL_ENTIRE_OBJECT, 
                        MakeRect(textPosition.y, textPosition.x, VAL_KEEP_SAME_SIZE, VAL_KEEP_SAME_SIZE));
    else
        TabButton_DrawText(tabButton, panel, canvas, textPosition);
        
    if (tabButton->dimmed)
        {
        int bgColor, parent;

        GetPanelAttribute (tabButton->sheet->panel, ATTR_PANEL_PARENT, &parent);
        if (parent)
            GetPanelAttribute (tabButton->sheet->panel, ATTR_TITLE_BACKCOLOR, &bgColor);
        else
            GetPanelAttribute (tabButton->sheet->panel, ATTR_BACKCOLOR, &bgColor);
        SetCtrlAttribute (panel, canvas, ATTR_PEN_FILL_COLOR, bgColor);
        CanvasDimRect (panel, canvas, bounds);
        }
}

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

static void TabButton_Draw(TabButton tabButton, int drawActive, int drawFocus)
{
    TabGroup    group;
    int         canvas;
    int         panel, parent;
    Rect        bounds;
    Rect        fillBounds;
    int         buttonRight;
    int         buttonBottom;
    int         bgColor;
    int         highlightColor;
    int         shadowColor;
    int         darkShadowColor;
    static const unsigned char    checkerPattern[8]   = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};
    static const unsigned char    solidPattern[8]     = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    
    group = tabButton->sheet->group;
    panel = group->dialogPanel;
    canvas = group->canvas;

    if(ListNumItems (group->sheetList) == 0)
        return;
                                                               
    GetPanelAttribute (tabButton->sheet->panel, ATTR_PANEL_PARENT, &parent);
    if (parent)
        GetPanelAttribute (tabButton->sheet->panel, ATTR_TITLE_BACKCOLOR, &bgColor);
    else
        GetPanelAttribute (tabButton->sheet->panel, ATTR_BACKCOLOR, &bgColor);
    
    if(tabButton->tabColor != -1)
        bgColor = tabButton->tabColor;

    Get3dBorderColors (bgColor & 0xFFFFFF, &highlightColor, NULL, &shadowColor, &darkShadowColor);
    
    if (drawActive) 
        bounds = tabButton->activeBounds;
    else
        bounds = tabButton->inactiveBounds;
    buttonRight = bounds.left + bounds.width - 1;
    buttonBottom = bounds.top + bounds.height - 1;
    
    switch (tabButton->sheet->group->buttonPosition)
        {
        case VAL_EASY_TAB_BTNS_ON_TOP:
                /*  shrink fill so that we don't draw outside of the rounded corners at the top of the tab button */
            SetCtrlAttribute(panel, canvas, ATTR_PEN_FILL_COLOR, bgColor);
            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, bgColor);
            RectSet(&fillBounds, bounds.top+1, bounds.left+1, bounds.height-1, bounds.width-2);
            CanvasDrawRect(panel, canvas, fillBounds, VAL_DRAW_FRAME_AND_INTERIOR);

            TabButton_DrawLabel(tabButton, bounds);
    
            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, highlightColor);
            CanvasSetPenPosition(panel, canvas, MakePoint(bounds.left, buttonBottom));
            CanvasDrawLineTo(panel, canvas, MakePoint(bounds.left, bounds.top + 2));
            CanvasDrawLineTo(panel, canvas, MakePoint(bounds.left + 2, bounds.top));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 2, bounds.top));

            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, darkShadowColor);
            CanvasSetPenPosition(panel, canvas, MakePoint(buttonRight - 1, bounds.top + 1));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight, bounds.top + 2));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight, buttonBottom));

            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, shadowColor);
            CanvasSetPenPosition(panel, canvas, MakePoint(buttonRight - 1, bounds.top + 2));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 1, buttonBottom));
            break;
        case VAL_EASY_TAB_BTNS_ON_BOTTOM:
                /*  shrink fill so that we don't draw outside of the rounded corners at the top of the tab button */
            SetCtrlAttribute(panel, canvas, ATTR_PEN_FILL_COLOR, bgColor);
            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, bgColor);
            RectSet(&fillBounds, bounds.top, bounds.left + 1, bounds.height - 2, bounds.width - 2);
            CanvasDrawRect(panel, canvas, fillBounds, VAL_DRAW_FRAME_AND_INTERIOR);

            TabButton_DrawLabel(tabButton, bounds);
    
            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, highlightColor);
            CanvasSetPenPosition(panel, canvas, MakePoint(bounds.left, bounds.top));
            CanvasDrawLineTo(panel, canvas, MakePoint(bounds.left, buttonBottom - 2));
            CanvasDrawLineTo(panel, canvas, MakePoint(bounds.left + 1, buttonBottom - 1));

            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, darkShadowColor);
            CanvasDrawPoint(panel, canvas, MakePoint(bounds.left + 1, buttonBottom - 1));
            CanvasSetPenPosition(panel, canvas, MakePoint(bounds.left + 2, buttonBottom));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 2, buttonBottom));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight, buttonBottom - 2));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight, bounds.top));

            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, shadowColor);
            CanvasSetPenPosition(panel, canvas, MakePoint(buttonRight - 1, bounds.top));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 1, buttonBottom - 2));
            CanvasSetPenPosition(panel, canvas, MakePoint(bounds.left + 2, buttonBottom - 1));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 2, buttonBottom - 1));
            break;
        case VAL_EASY_TAB_BTNS_ON_RIGHT:
                /*  shrink fill so that we don't draw outside of the rounded corners at the top of the tab button */
            SetCtrlAttribute(panel, canvas, ATTR_PEN_FILL_COLOR, bgColor);
            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, bgColor);
            RectSet(&fillBounds, bounds.top+1, bounds.left, bounds.height-2, bounds.width-1);
            CanvasDrawRect(panel, canvas, fillBounds, VAL_DRAW_FRAME_AND_INTERIOR);

            TabButton_DrawLabel(tabButton, bounds);
    
            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, highlightColor);
            CanvasSetPenPosition(panel, canvas, MakePoint(bounds.left, bounds.top));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 2, bounds.top));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight, bounds.top + 2));

            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, darkShadowColor);
            CanvasSetPenPosition(panel, canvas, MakePoint(bounds.left, buttonBottom));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 2, buttonBottom));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight, buttonBottom - 2));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight, bounds.top + 2));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 1, bounds.top + 1));

            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, shadowColor);
            CanvasSetPenPosition(panel, canvas, MakePoint(bounds.left - 1, buttonBottom - 1));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 2, buttonBottom - 1));
            CanvasSetPenPosition(panel, canvas, MakePoint(buttonRight - 1, buttonBottom - 2));
            CanvasDrawLineTo(panel, canvas, MakePoint(buttonRight - 1, bounds.top + 2));
            break;
        case VAL_EASY_TAB_BTNS_ON_LEFT:
                /*  shrink fill so that we don't draw outside of the rounded corners at the top of the tab button */
            SetCtrlAttribute(panel, canvas, ATTR_PEN_FILL_COLOR, bgColor);
            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, bgColor);
            RectSet(&fillBounds, bounds.top+1, bounds.left+1, bounds.height-2, bounds.width-1);
            CanvasDrawRect(panel, canvas, fillBounds, VAL_DRAW_FRAME_AND_INTERIOR);

            TabButton_DrawLabel(tabButton, bounds);
    
            SetCtrlAttribute(panel, canvas, ATTR_PEN_COLOR, highlightColor);
            CanvasSetPenPosition(panel, canvas, MakePoint(buttonRight, bounds.top));
            CanvasDrawLineTo(panel, canvas, MakePoint(bounds.left + 2, bounds.top));
            CanvasDrawLineTo(panel, canvas, MakePoint(bounds.left, bounds.top + 2));
            CanvasDrawLineTo(panel, canvas, MakePoint(bounds.left, buttonBottom - 2));

⌨️ 快捷键说明

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