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

📄 thedialog.cpp

📁 Linux/windows 环境下跨平台开发程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -