📄 thedialog.cpp
字号:
i = FindIndex(id);
if(i && dlg[i]) return dlg[i]->dialog->SetCheck(id, o ? o : CurrDisp, state);
return false;
}
bool
DlgRoot::GetCheck(int Id)
{
int i;
i = FindIndex(Id);
if(i && dlg[i]) return dlg[i]->dialog->GetCheck(Id);
return false;
}
bool
DlgRoot::GetText(int id, char *txt)
{
int i;
i = FindIndex(id);
if(i && dlg[i]) return dlg[i]->dialog->GetText(id, txt);
return false;
}
bool
DlgRoot::SetText(int id, char *txt)
{
int i;
i = FindIndex(id);
if(i && dlg[i] && dlg[i]->dialog->Command(CMD_SETTEXT, txt, CurrDisp)) DoPlot(CurrDisp);
else return false;
return true;
}
bool
DlgRoot::TextStyle(int id, int style)
{
int i;
i = FindIndex(id);
if(i && dlg[i]) dlg[i]->dialog->TextDef.Style = style;
else return false;
return true;
}
bool
DlgRoot::TextFont(int id, int font)
{
int i;
i = FindIndex(id);
if(i && dlg[i]) dlg[i]->dialog->TextDef.Font = font;
else return false;
return true;
}
bool
DlgRoot::TextSize(int id, int size)
{
int i;
i = FindIndex(id);
if(size <= 0.001f) return false;
if(i && dlg[i]) {
dlg[i]->dialog->TextDef.iSize = size;
}
else return false;
return true;
}
bool
DlgRoot::ShowItem(int id, bool show)
{
int i;
i = FindIndex(id);
if(i && dlg[i]) dlg[i]->dialog->flags = show ?
dlg[i]->dialog->flags & ~HIDDEN : dlg[i]->dialog->flags | HIDDEN;
else return false;
return true;
}
int
DlgRoot::GetResult()
{
int ret;
//return each result only once !
ret = Result;
Result = -1;
return ret;
}
int
DlgRoot::FindIndex(unsigned short id)
{
int i;
for (i = 0; dlg[i] && i < cDlgs; i++) if(dlg[i]->id == id) return i;
return 0;
}
void
DlgRoot::ForEach(int cmd, int start, anyOutput *o)
{
int i, j, next;
if(o)CurrDisp = o;
if(dlg && CurrDisp) {
next = start;
do {
if(dlg[next]->first) {
if(dlg[next]->flags && ISPARENT) {
if(dlg[next]->dialog) {
dlg[next]->dialog->Command(CMD_FLUSH, 0L, 0L);
//if j equals cDlgs we are caught in a circular reference
for(j = 0, i = dlg[next]->first; i && j < cDlgs; j++) {
dlg[next]->dialog->Command(CMD_ADDCHILD, (void*)dlg[i = FindIndex(i)]->dialog, 0L);
if(i) i = dlg[i]->next;
}
}
else return; //error bad structured template
}
else { //a debugging aid ....
InfoBox("Warning:\ndialog contains\ngroup which is not parent");
}
//resolve sub-groups recursively
// this will not result in any action for children
// because the parent is not this!
ForEach(cmd, FindIndex(dlg[next]->first), 0L);
}
//parent objects (groups) will channel command to children
if(dlg[next]->dialog && dlg[next]->dialog->parent == this &&
!(dlg[next]->dialog->flags & HIDDEN)) switch(cmd) {
case CMD_DOPLOT:
dlg[next]->dialog->DoPlot(CurrDisp);
break;
case CMD_LBUP:
dlg[next]->dialog->Select(mev->x, mev->y, CurrDisp);
break;
case CMD_MOUSE_EVENT:
dlg[next]->dialog->MBtrack(mev, CurrDisp);
break;
case CMD_SELECT:
dlg[next]->dialog->Select(mev->x, mev->y, CurrDisp);
break;
}
next = FindIndex(dlg[next]->next);
}while(next && next < cDlgs);
}
}
void
DlgRoot::Activate(int id, bool active)
{
int i;
i = FindIndex(id);
if(i && dlg[i]) dlg[i]->dialog->Activate(id, active);
}
bool
DlgRoot::ItemCmd(int id, int cmd, void *tmpl)
{
int i;
if((i = FindIndex(id)) && dlg[i])
return dlg[i]->dialog->Command(cmd, tmpl, CurrDisp);
return false;
}
Dialog::Dialog(tag_DlgObj *par, DlgInfo *desc, RECT rec)
{
parent = par;
Id = desc->id;
flags = desc->flags;
memcpy(&cr, &rec, sizeof(RECT));
memcpy(&hcr, &rec, sizeof(RECT));
Line.width = 0.0;
Line.patlength = 1.0;
Line.color = DlgBGcolor;
Line.pattern = 0x00000000L;
Fill.type = FILL_NONE;
Fill.color = DlgBGcolor;
Fill.scale = 1.0;
Fill.hatch = 0L;
memcpy(&TextDef, &DlgText, sizeof(TextDEF));
type = desc->type;
bChecked = flags & CHECKED ? true : false;
bLBdown = false;
if(DEFAULT == (flags & DEFAULT)) DialogDefault = DialogTabStop = this;
bActive = true;
}
bool
Dialog::Select(int x, int y, anyOutput *o)
{
if(x > cr.left && x < cr.right && y > cr.top && y < cr.bottom) {
if((flags & TOUCHEXIT) && parent)
parent->Command(CMD_ENDDIALOG, (void *)this, o);
return true;
}
return false;
}
bool
Dialog::SetCheck(int id, anyOutput *o, bool state)
{
if(state != bChecked) {
if(parent && state && (flags & ISRADIO)) parent->Command(CMD_RADIOBUTT, (void *)this, o);
bChecked = state;
if(o) DoPlot(o);
return true;
}
return false;
}
void
Dialog::MBtrack(MouseEvent *mev, anyOutput *o)
{
bool bLBstate = false;
if(mev->Action == MOUSE_LBDOUBLECLICK) {
Select(mev->x, mev->y, o);
return;
}
switch(type){
case PUSHBUTTON: case ARROWBUTT: case CHECKBOX: case RADIO1:
case RADIO2: case TRASH: case CONFIG: case CHECKPIN:
if(mev->StateFlags &1) bLBstate = true;
if(IsInRect(&hcr, mev->x, mev->y)){
if(bLBstate && !bLBdown){
bLBdown = bLBstate; DoPlot(o);
return;
}
}
else if(bLBdown){
bLBdown = false;
DoPlot(o);
}
break;
}
}
void
Dialog::Activate(int id, bool active)
{
if(id == Id) bActive = active;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Collection of dialog items
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// a simple text button
PushButton::PushButton(tag_DlgObj *par, DlgInfo * desc, RECT rec, char *text)
:Dialog(par, desc, rec)
{
if(text) Text = strdup(text);
else Text = 0L;
TextDef.Align = TXA_HCENTER | TXA_VCENTER;
}
PushButton::~PushButton()
{
if(Text) free (Text);
}
bool
PushButton::Command(int cmd, void *tmpl, anyOutput *o)
{
switch(cmd) {
case CMD_ADDCHAR:
HideCopyMark();
if(parent && *((int*)tmpl) == 0x0d) //return pressed
parent->Command(CMD_ENDDIALOG, (void *)this, o);
return true;
}
return false;
}
void
PushButton::DoPlot(anyOutput *o)
{
POINT pts[3];
Line.color = 0x00000000L;
Fill.color = DlgBGhigh;
o->SetLine(&Line); o->SetFill(&Fill);
if(bLBdown) o->oRectangle(cr.left, cr.top, cr.right, cr.bottom);
else {
o->oRectangle(cr.left, cr.top, cr.right-1, cr.bottom-1);
Line.color = DlgBGcolor;
o->SetLine(&Line);
pts[0].x = cr.left; pts[0].y = pts[1].y = cr.bottom-1;
pts[1].x = pts[2].x = cr.right-1; pts[2].y = cr.top-1;
o->oPolyline(pts, 3);
Line.color = 0x00000000L;
o->SetLine(&Line);
pts[0].x = cr.left+5; pts[0].y = pts[1].y = cr.bottom-1;
pts[1].x = pts[2].x = cr.right-1; pts[2].y = cr.top +1;
o->oPolyline(pts, 3);
Line.color = 0x00ffffffL;
o->SetLine(&Line);
pts[0].x = pts[1].x = cr.left;
pts[0].y = cr.bottom -3;
pts[1].y = pts[2].y = cr.top;
pts[2].x = cr.right -2;
o->oPolyline(pts, 3);
}
if(Text) {
TextDef.Style = DialogDefault == this ? TXS_BOLD : TXS_NORMAL;
o->SetTextSpec(&TextDef);
o->oTextOut((cr.left + cr.right)/2-2, (cr.top + cr.bottom)/2-1, Text, 0);
}
o->UpdateRect(&cr, false);
if(parent)parent->Command(CMD_TABDLG, this, o);
}
bool
PushButton::Select(int x, int y, anyOutput *o)
{
if(IsInRect(&cr, x, y)) {
bLBdown = false; DoPlot(o);
if(parent) parent->Command(CMD_ENDDIALOG, (void *)this, o);
return true;
}
else if(bLBdown) {
bLBdown = false; DoPlot(o);
}
return false;
}
TextBox::TextBox(tag_DlgObj *par, DlgInfo * desc, RECT rec, char *text)
:Dialog(par, desc, rec)
{
TextDef.Font = FONT_COURIER;
#ifdef _WINDOWS
// TextDef.fSize unchanged
#else
TextDef.fSize *= .8;
#endif
Fill.color = 0x00ffffffL; Line.color = 0x00000000L; cont = 0L;
if(text) cont = new mLabel(0L, 0L, rec.left+3, rec.top+1, &TextDef, text);
}
TextBox::~TextBox()
{
if(cont)DeleteGO(cont);
}
bool
TextBox::Command(int cmd, void *tmpl, anyOutput *o)
{
switch(cmd) {
case CMD_CURRLEFT: case CMD_CURRIGHT: case CMD_DELETE:
case CMD_POS_FIRST: case CMD_POS_LAST: case CMD_SHIFTLEFT:
case CMD_SHIFTRIGHT: case CMD_ADDCHAR:
if(bChecked && CurrGO && CurrGO->parent == cont){
CurrGO->Command(cmd, tmpl, o);
DoPlot(o); o->MrkMode = MRK_NONE;
return CurrGO->Command(CMD_REDRAW, 0L, o); //text cursor !
}
case CMD_CURRUP: case CMD_CURRDOWN:
if(bChecked && CurrGO && CurrGO->parent == cont){
cont->Command(cmd, tmpl, o);
DoPlot(o); o->MrkMode = MRK_NONE;
return true;
}
break;
case CMD_SETTEXT:
if(cont)DeleteGO(cont);
if(tmpl) cont = new mLabel(0L, 0L, cr.left+3, cr.top+1, &TextDef, (char*)tmpl);
return true;
}
return false;
}
void
TextBox::DoPlot(anyOutput *o)
{
o->SetLine(&Line); o->SetFill(&Fill);
o->oRectangle(cr.left, cr.top, cr.right, cr.bottom);
if(cont)cont->DoPlot(o);
o->UpdateRect(&cr, false);
}
bool
TextBox::Select(int x, int y, anyOutput *o)
{
POINT p1;
p1.x = x; p1.y = y;
if(bActive && IsInRect(&cr, x, y) && !(flags & NOEDIT)) {
DialogDefault = DialogFocus = DialogTabStop = this;
if(cont) bChecked = cont->Command(CMD_SELECT, &p1, o);
}
return false;
}
bool
TextBox::GetText(int id, char *txt)
{
if(cont) return cont->Command(CMD_ALLTEXT, txt, 0L);
return false;
}
ArrowButton::ArrowButton(tag_DlgObj *par, DlgInfo * desc, RECT rec, int *which)
:Dialog(par, desc, rec)
{
direct = which ? *which : 0;
}
void
ArrowButton::DoPlot(anyOutput *o)
{
POINT pts[4];
int ix, iy, dx, dy;
Line.color = 0x00000000L;
Fill.color = DlgBGhigh;
ix = (dx =(cr.right-cr.left))>5 ? dx>>2 : 2;
iy = (dy =(cr.bottom-cr.top))>5 ? dy>>2 : 2;
o->SetLine(&Line);
o->SetFill(&Fill);
if(bLBdown) o->oRectangle(cr.left, cr.top, cr.right, cr.bottom);
else {
o->oRectangle(cr.left, cr.top, cr.right-1, cr.bottom-1);
Line.color = DlgBGcolor;
o->SetLine(&Line);
pts[0].x = cr.left; pts[0].y = pts[1].y = cr.bottom-1;
pts[1].x = pts[2].x = cr.right-1; pts[2].y = cr.top-1;
o->oPolyline(pts, 3);
Line.color = 0x00ffffffL;
o->SetLine(&Line);
pts[0].x = pts[1].x = cr.left;
pts[0].y = cr.bottom -3;
pts[1].y = pts[2].y = cr.top;
pts[2].x = cr.right -2;
o->oPolyline(pts, 3);
}
Fill.color = Line.color = 0x00000000L;
o->SetLine(&Line);
o->SetFill(&Fill);
switch(direct) {
case 1:
pts[0].x = pts[3].x = cr.left+ix;
pts[0].y = pts[3].y = pts[1].y = cr.bottom-(iy<<1);
pts[1].x = cr.right-(ix<<1);
pts[2].x = (cr.right + cr.left)/2 -1;
pts[2].y = cr.top+iy;
o->oPolygon(pts, 4);
break;
case 2:
pts[0].x = pts[3].x = cr.left+ix;
pts[0].y = pts[3].y = pts[1].y = cr.top+iy;
pts[1].x = cr.right-(ix<<1);
pts[2].x = (cr.right + cr.left)/2 -1;
pts[2].y = cr.bottom-(iy<<1);
o->oPolygon(pts, 4);
break;
case 3:
pts[0].x = pts[3].x = cr.left+ix;
pts[0].y = pts[3].y = (cr.bottom + cr.top)/2-1;
pts[1].x = pts[2].x = cr.right-(ix<<1);
pts[1].y = cr.bottom-(iy<<1);
pts[2].y = cr.top+iy;
o->oPolygon(pts, 4);
break;
case 4:
pts[0].x = pts[3].x = cr.right-(ix<<1);
pts[0].y = pts[3].y = (cr.bottom + cr.top)/2-1;
pts[1].x = pts[2].x = cr.left+2;
pts[1].y = cr.bottom-(iy<<1);
pts[2].y = cr.top+iy;
o->oPolygon(pts, 4);
break;
}
o->UpdateRect(&cr, false);
}
bool
ArrowButton::Select(int x, int y, anyOutput *o)
{
if(IsInRect(&cr, x, y)) {
bLBdown = false;
DoPlot(o);
if(parent) parent->Command(CMD_ENDDIALOG, (void *)this, o);
return true;
}
else if(bLBdown) {
bLBdown = false;
DoPlot(o);
}
return false;
}
ColorButton::ColorButton(tag_DlgObj *par, DlgInfo * desc, RECT rec, unsigned long color)
:Dialog(par, desc, rec)
{
col = color;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -