📄 odbuttons.cpp
字号:
break;
case 502:
pts[0].x = ix-5; pts[1].x = pts[2].x = ix; pts[3].x = ix +5;
pts[0].y = pts[1].y = rec->bottom-8; pts[2].y = pts[3].y = rec->top+8;
o->oPolyline(pts, 4);
break;
case 503:
pts[0].x = ix+5; pts[1].x = pts[2].x = ix; pts[3].x = ix -5;
pts[0].y = pts[1].y = rec->bottom-8; pts[2].y = pts[3].y = rec->top+8;
o->oPolyline(pts, 4);
break;
}
o->UpdateRect(rec, false);
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Execute polar plot templates as owner drawn buttons
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void OD_PolarTempl(int cmd, void *par, RECT *rec, anyOutput *o,
void *data, int id)
{
LineDEF Line = {.0f, 1.0f, 0x0L, 0x0L};
FillDEF Fill = {FILL_NONE, 0x00ffffffL, 1.0, 0L};
FillDEF FillR = {FILL_NONE, 0x000000ffL, 1.0, 0L};
FillDEF FillG = {FILL_NONE, 0x0000ff00L, 1.0, 0L};
FillDEF FillB = {FILL_NONE, 0x00ff0000L, 1.0, 0L};
FillDEF FillY = {FILL_NONE, 0x0000ffffL, 1.0, 0L};
TextDEF td, otd;
POINT pts[12];
int ix, iy;
switch(cmd) {
case OD_DRAWNORMAL:
case OD_DRAWSELECTED:
Line.color = cmd == OD_DRAWSELECTED ? 0x00000000L : 0x00e8e8e8L;
Fill.color = cmd == OD_DRAWSELECTED ? 0x00ffffffL : 0x00e8e8e8L;
ix = (rec->left + rec->right)/2;
iy = (rec->top +rec->bottom)/2;
o->SetLine(&Line);
pts[0].x = pts[3].x = pts[4].x = rec->left;
pts[0].y = pts[1].y = pts[4].y = rec->top;
pts[1].x = pts[2].x = rec->right-1;
pts[2].y = pts[3].y = rec->bottom-1;
o->oPolyline(pts, 5);
Line.color = 0x00000000L;
o->SetLine(&Line);
o->SetFill(&Fill);
o->oCircle(rec->left+3, rec->top+3, rec->right-3, rec->bottom-3);
switch(id) {
case 200:
case 201:
case 202:
if(id == 201 || id == 202) {
pts[0].x = rec->left+13; pts[0].y = rec->top+10;
pts[1].x = rec->left+15; pts[1].y = rec->top+25;
pts[2].x = rec->right-19; pts[2].y = rec->top+33;
pts[3].x = rec->right-11; pts[3].y = rec->top+13;
o->oPolyline(pts, 4);
o->SetFill(&FillG);
}
else o->SetFill(&FillR);
if(id == 200 || id == 201) {
o->oCircle(rec->left+10, rec->top+7, rec->left+16, rec->top+13);
o->oCircle(rec->left+12, rec->top+22, rec->left+18, rec->top+28);
o->oCircle(rec->right-22, rec->top+30, rec->right-16, rec->top+36);
o->oCircle(rec->right-14, rec->top+10, rec->right-8, rec->top+16);
}
break;
case 203:
pts[0].x = rec->left+7; pts[0].y = rec->top+13;
pts[1].x = rec->left+10; pts[1].y = rec->top+30;
pts[2].x = rec->right-19; pts[2].y = rec->top+33;
pts[3].x = rec->right-9; pts[3].y = rec->top+11;
pts[4].x = ix-4; pts[4].y =iy +3;
o->SetFill(&FillY);
o->oPolygon(pts, 5);
break;
case 204:
if(cmd == OD_DRAWNORMAL) FillG.color = 0x00e8e8e8L;
o->SetFill(&FillG);
o->oCircle(ix-6, rec->top+5, ix+6, iy+6);
memcpy(&td, &o->TxtSet, sizeof(TextDEF));
memcpy(&otd, &o->TxtSet, sizeof(TextDEF));
td.Align = TXA_HCENTER | TXA_VTOP;
td.Style = TXS_NORMAL;
td.Mode = TXM_TRANSPARENT;
td.fSize *= 0.8; td.iSize = 0;
td.ColTxt = 0x00ff0000L;
o->SetTextSpec(&td);
o->oTextOut(ix, iy+3, "y=f(x)", 0);
o->SetTextSpec(&otd);
}
o->UpdateRect(rec, false);
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Execute templates for pie-charts as owner drawn buttons
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void OD_PieTempl(int cmd, void *par, RECT *rec, anyOutput *o,
void *data, int id)
{
LineDEF Line = {.0, 1.0, 0x0L, 0x0L};
FillDEF Fill = {FILL_NONE, 0x00ffffffL, 1.0, 0L};
FillDEF FillR = {FILL_NONE, 0x000000ffL, 1.0, 0L};
FillDEF FillG = {FILL_NONE, 0x0000ff00L, 1.0, 0L};
FillDEF FillB = {FILL_NONE, 0x00ff0000L, 1.0, 0L};
double angels1[]={90.0, 45.0, -45.0, 90.0};
double angels2[]={180, 157.5, 112.5, 0.0};
POINT pts[12];
int ix, iy;
double r, *ang = angels1;
segment *seg = 0L;
lfPOINT fc;
switch(cmd) {
case OD_DRAWNORMAL:
case OD_DRAWSELECTED:
Line.color = cmd == OD_DRAWSELECTED ? 0x00000000L : 0x00e8e8e8L;
Fill.color = cmd == OD_DRAWSELECTED ? 0x00ffffffL : 0x00e8e8e8L;
ix = (rec->left + rec->right)/2;
iy = (rec->top +rec->bottom)/2;
o->SetLine(&Line);
pts[0].x = pts[3].x = pts[4].x = rec->left;
pts[0].y = pts[1].y = pts[4].y = rec->top;
pts[1].x = pts[2].x = rec->right-1;
pts[2].y = pts[3].y = rec->bottom-1;
o->oPolyline(pts, 5);
Line.color = 0x00000000L;
o->SetLine(&Line);
o->SetFill(&Fill);
o->oRectangle(rec->left+3, rec->top+3, rec->right-3, rec->bottom-3);
switch(id) {
case 401: case 411:
ang = angels2;
case 400: case 410:
fc.fx = o->fix2un((double)ix-1); fc.fy = o->fiy2un((double)iy);
r = o->fix2un((double)(rec->right -rec->left))/3;
seg = new segment(0L, 0L, &fc, 0.0, r, ang[0], ang[1]);
if(seg) {
if(id == 410 || id == 411) seg->SetSize(SIZE_RADIUS1, r*.7);
seg->Command(CMD_SEG_LINE, &Line, 0L);
seg->Command(CMD_SEG_FILL, &FillR, 0L);
seg->DoPlot(o);
seg->SetSize(SIZE_ANGLE1, ang[1]);
seg->SetSize(SIZE_ANGLE2, ang[2]);
seg->Command(CMD_SEG_FILL, &FillG, 0L);
seg->DoPlot(o);
seg->SetSize(SIZE_ANGLE1, ang[2]);
seg->SetSize(SIZE_ANGLE2, ang[3]);
seg->Command(CMD_SEG_FILL, &FillB, 0L);
seg->DoPlot(o);
delete seg;
}
break;
}
o->UpdateRect(rec, false);
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Show a simple graph how 3D axes are organized as owner drawn button
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void OD_AxisDesc3D(int cmd, void *par, RECT *rec, anyOutput *o,
void *data, int id)
{
POINT pts[5];
switch(cmd) {
case OD_DRAWNORMAL:
case OD_DRAWSELECTED:
pts[0].x = ((rec->left + rec->right)>>1)-15;
pts[0].y = ((rec->bottom + rec->top)>>1)+10;
pts[1].x = rec->left + 15; pts[1].y = rec->bottom-20;
o->oSolidLine(pts);
pts[2].x = pts[1].x +2; pts[2].y = pts[1].y -7;
o->oSolidLine(pts + 1);
pts[2].x = pts[1].x +6; pts[2].y = pts[1].y -2;
o->oSolidLine(pts + 1);
o->oTextOut(pts[1].x -2, pts[1].y -5, "z", 1);
pts[1].x = pts[0].x; pts[1].y = rec->top+20;
o->oSolidLine(pts);
pts[2].x = pts[1].x -4; pts[2].y = pts[1].y +6;
o->oSolidLine(pts + 1);
pts[2].x = pts[1].x +4;
o->oSolidLine(pts + 1);
o->oTextOut(pts[1].x + 4, pts[1].y - 18, "y", 1);
pts[1].x = rec->right-15; pts[1].y = rec->bottom -22;
o->oSolidLine(pts);
pts[2].x = pts[1].x -6; pts[2].y = pts[1].y +2;
o->oSolidLine(pts + 1);
pts[2].x = pts[1].x -4; pts[2].y = pts[1].y -5;
o->oSolidLine(pts + 1);
o->oTextOut(pts[1].x +9, pts[1].y -4, "x", 1);
o->UpdateRect(rec, false);
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Execute axis breaks symbols as owner drawn button
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void OD_BreakTempl(int cmd, void *par, RECT *rec, anyOutput *o,
void *data, int id)
{
LineDEF Line = {.1f, 1.0f, 0x0L, 0x0L};
FillDEF Fill = {FILL_NONE, 0x00ffffffL, 1.0, 0L};
POINT pts[15];
int i, ix, iy;
switch(cmd) {
case OD_DRAWNORMAL:
case OD_DRAWSELECTED:
Line.color = cmd == OD_DRAWSELECTED ? 0x00000000L : 0x00e8e8e8L;
Fill.color = cmd == OD_DRAWSELECTED ? 0x00ffffffL : 0x00e8e8e8L;
ix = (rec->left + rec->right)>>1;
iy = (rec->top +rec->bottom)>>1;
o->SetLine(&Line);
pts[0].x = pts[3].x = pts[4].x = rec->left;
pts[0].y = pts[1].y = pts[4].y = rec->top;
pts[1].x = pts[2].x = rec->right-1;
pts[2].y = pts[3].y = rec->bottom-1;
o->oPolyline(pts, 5);
Line.color = 0x00000000L;
o->SetLine(&Line);
o->SetFill(&Fill);
o->oRectangle(rec->left+3, rec->top+3, rec->right-3, rec->bottom-3);
pts[0].x = pts[1].x = ix;
pts[0].y = rec->top +5; pts[1].y = iy-3;
o->oSolidLine(pts);
pts[0].y = rec->bottom -7; pts[1].y = iy+3;
o->oSolidLine(pts);
switch(id) {
case 402:
pts[0].x = ix-7; pts[1].x = ix+7;
pts[0].y = iy; pts[1].y = iy-6;
o->oSolidLine(pts);
pts[0].y += 6; pts[1].y += 6;
o->oSolidLine(pts);
break;
case 403:
pts[0].x = ix-7; pts[1].x = ix+7;
pts[0].y = iy-3; pts[1].y = iy-3;
o->oSolidLine(pts);
pts[1].y += 6; o->oSolidLine(pts);
pts[0].y += 6; o->oSolidLine(pts);
break;
case 404:
for(i = 0; i < 15; i++) {
pts[i].x = ix +i -7;
pts[i].y = iy - 3 + (int)(sin((double)i*0.41887902)*2.5);
}
o->oPolyline(pts, 15);
for(i = 0; i < 15; i++) pts[i].y += 6;
o->oPolyline(pts, 15);
break;
}
o->UpdateRect(rec, false);
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Execute plot selection templates as owner drawn button
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void UtilBarDraw(POINT *pts, int x, int y1, int y2, anyOutput *o)
{
pts[1].x = pts[0].x = pts[4].x = x;
pts[0].y = y1; pts[1].y = y2;
pts[2].y = pts[1].y-1; pts[2].x = pts[3].x = pts[0].x-3;
pts[3].y = pts[0].y-1; pts[4].y = pts[0].y;
o->oPolygon(pts, 5);
pts[2].x += 5; pts[3].x += 5;
o->oPolygon(pts, 5);
pts[1].x -= 3; pts[1].y = pts[0].y-1;
pts[2].x = pts[0].x-2; pts[2].y = pts[0].y-2;
o->oPolygon(pts, 5);
}
void OD_PlotTempl(int cmd, void *par, RECT *rec, anyOutput *o,
void *data, int id)
{
LineDEF Line = {.0, 1.0, 0x0L, 0x0L};
LineDEF rLine = {.0, 1.0, 0x00000080L, 0x0L};
LineDEF bLine = {.0, 1.0, 0x00e00000L, 0x0L};
LineDEF gLine = {.0, 1.0, 0x0000e000L, 0x0L};
FillDEF Fill = {FILL_NONE, 0x00ffffffL, 1.0, 0L};
FillDEF FillR = {FILL_NONE, 0x000000ffL, 1.0, 0L};
FillDEF FillG = {FILL_NONE, 0x0000ff00L, 1.0, 0L};
FillDEF FillB = {FILL_NONE, 0x00ff0000L, 1.0, 0L};
FillDEF FillY = {FILL_NONE, 0x0000ffffL, 1.0, 0L};
TextDEF td, otd;
POINT pts[12];
int i, j, ix, iy;
double r;
segment *seg = 0L;
lfPOINT fc;
switch(cmd) {
case OD_DRAWNORMAL:
case OD_DRAWSELECTED:
ix = (rec->left + rec->right)>>1;
iy = (rec->top +rec->bottom)>>1;
switch(id) {
case 560: case 561: case 562: case 563: case 564: //3D axes
case 565:
OD_AxisTempl3D(cmd, par, rec, o, data, 410+AxisTempl3D);
break;
default:
Line.color = cmd == OD_DRAWSELECTED ? 0x00000000L : 0x00e8e8e8L;
Fill.color = cmd == OD_DRAWSELECTED ? 0x00ffffffL : 0x00e8e8e8L;
o->SetLine(&Line);
pts[0].x = pts[3].x = pts[4].x = rec->left;
pts[0].y = pts[1].y = pts[4].y = rec->top;
pts[1].x = pts[2].x = rec->right-1;
pts[2].y = pts[3].y = rec->bottom-1;
o->oPolyline(pts, 5);
Line.color = 0x00000000L;
o->SetLine(&Line);
o->SetFill(&Fill);
o->oRectangle(rec->left+3, rec->top+3, rec->right-3, rec->bottom-3);
break;
}
switch(id) {
case 500:
case 501:
fc.fx = o->fix2un((double)ix-1); fc.fy = o->fiy2un((double)iy);
r = o->fix2un((double)(rec->right -rec->left))/3;
seg = new segment(0L, 0L, &fc, 0.0, r, 90.0, 45.0);
if(seg) {
if(id == 501) seg->SetSize(SIZE_RADIUS1, r*.7f);
seg->Command(CMD_SEG_LINE, &Line, 0L);
seg->Command(CMD_SEG_FILL, &FillR, 0L);
seg->DoPlot(o);
seg->SetSize(SIZE_ANGLE1, 45.0f);
seg->SetSize(SIZE_ANGLE2, -45.0f);
seg->Command(CMD_SEG_FILL, &FillG, 0L);
seg->DoPlot(o);
seg->SetSize(SIZE_ANGLE1, -45.0f);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -