📄 easytab.c
字号:
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 + -