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

📄 drawing.c

📁 Source code for an Numeric Cmputer
💻 C
📖 第 1 页 / 共 2 页
字号:
	    gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),		drawing_area->style->black_gc, x + WidDiv2 - 2 - Width,		y + Height, BufTxt, strlen(BufTxt));	}	break;    case ELE_COMPAR:	if (DrawForToolBar)	    break;	/* the box */	gdk_draw_rectangle(DrawPixmap, drawing_area->style->white_gc, TRUE,	    x + WidDiv3 - (Width * 2), y + HeiDiv4,	    Width * 2 + 1 * WidDiv3, 2 * HeiDiv4);	gdk_draw_rectangle(DrawPixmap, DynaGcOff, FALSE,	    x + WidDiv3 - (Width * 2), y + HeiDiv4,	    Width * 2 + 1 * WidDiv3, 2 * HeiDiv4);	/* input */	gdk_draw_line(DrawPixmap, TheGc,	    x - Width * 2, y + HeiDiv2, x - Width * 2 + WidDiv3, y + HeiDiv2);	/* output */	gdk_draw_line(DrawPixmap, TheGc,	    x + WidDiv3 * 2, y + HeiDiv2, x + Width, y + HeiDiv2);	gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),	    drawing_area->style->black_gc, x + WidDiv4 - (Width * 2) + 3,	    y + HeiDiv4 - 1, "COMPARE", strlen("COMPARE"));	/* arithmetic expression */	if (!EditDatas.ModeEdit)	    strcpy(BufTxt, DisplayArithmExpr(ArithmExpr[Element.VarNum].Expr,		    (Width * 2 + 1 * WidDiv3) / 8));	else	    strcpy(BufTxt,		DisplayArithmExpr(EditArithmExpr[Element.VarNum].Expr,		    (Width * 2 + 1 * WidDiv3) / 8));	gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),	    drawing_area->style->black_gc, x + WidDiv3 - (Width * 2) + 2,	    y + HeiDiv2 + 4, BufTxt, strlen(BufTxt));	break;    case ELE_OUTPUT_OPERATE:	if (DrawForToolBar)	    break;	/* the box */	gdk_draw_rectangle(DrawPixmap, drawing_area->style->white_gc, TRUE,	    x + WidDiv3 - (Width * 2), y + HeiDiv4,	    Width * 2 + 1 * WidDiv3, 2 * HeiDiv4);	gdk_draw_rectangle(DrawPixmap, DynaGcOff, FALSE,	    x + WidDiv3 - (Width * 2), y + HeiDiv4,	    Width * 2 + 1 * WidDiv3, 2 * HeiDiv4);	/* input */	gdk_draw_line(DrawPixmap, TheGc,	    x - Width * 2, y + HeiDiv2, x - Width * 2 + WidDiv3, y + HeiDiv2);	/* output */	gdk_draw_line(DrawPixmap, TheGc,	    x + WidDiv3 * 2, y + HeiDiv2, x + Width, y + HeiDiv2);	gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),	    drawing_area->style->black_gc, x + WidDiv4 - (Width * 2) + 3,	    y + HeiDiv4 - 1, "OPERATE", strlen("OPERATE"));	/* arithmetic expression */	if (!EditDatas.ModeEdit)	    strcpy(BufTxt, DisplayArithmExpr(ArithmExpr[Element.VarNum].Expr,		    (Width * 2 + 1 * WidDiv3) / 8));	else	    strcpy(BufTxt,		DisplayArithmExpr(EditArithmExpr[Element.VarNum].Expr,		    (Width * 2 + 1 * WidDiv3) / 8));	gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),	    drawing_area->style->black_gc, x + WidDiv3 - (Width * 2) + 2,	    y + HeiDiv2 + 4, BufTxt, strlen(BufTxt));	break;    }    /* Drawing Var */    if (!DrawForToolBar) {	switch (Element.Type) {	case ELE_INPUT:	case ELE_INPUT_NOT:	case ELE_RISING_INPUT:	case ELE_FALLING_INPUT:	case ELE_OUTPUT:	case ELE_OUTPUT_NOT:	case ELE_OUTPUT_SET:	case ELE_OUTPUT_RESET:	    strcpy(BufTxt, DisplayInfo(Element.VarType, Element.VarNum));	    gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),		drawing_area->style->black_gc, x + WidDiv4, y + HeiDiv4 - 2,		BufTxt, strlen(BufTxt));	    break;	case ELE_OUTPUT_JUMP:	    gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),		drawing_area->style->black_gc, x + 1, y + HeiDiv4 - 2,		RungArray[Element.VarNum].Label,		strlen(RungArray[Element.VarNum].Label));	    break;	case ELE_OUTPUT_CALL:	    sprintf(BufTxt, "SR%d", Element.VarNum);	    gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),		drawing_area->style->black_gc, x + 1, y + HeiDiv4 - 2, BufTxt,		strlen(BufTxt));	    break;	}    }    /* Drawing cnx with top */    if (Element.ConnectedWithTop) {	if (Element.DynamicInput)	    gdk_draw_line(DrawPixmap, DynaGcOn,		x, y + HeiDiv2 + 1, x, y - HeiDiv2);	else	    gdk_draw_line(DrawPixmap, drawing_area->style->black_gc,		x, y + HeiDiv2, x, y - HeiDiv2);    }    /* specials used for Editor */    if (DrawForToolBar) {	switch (Element.Type) {	case EDIT_POINTER:	    gdk_draw_line(DrawPixmap, drawing_area->style->black_gc, x + WidDiv4, y + HeiDiv4, x + Width - WidDiv4, y + Height - HeiDiv4);	/* \ 																		 */	    gdk_draw_line(DrawPixmap, drawing_area->style->black_gc, x + WidDiv4, y + HeiDiv4, x + WidDiv3, y + HeiDiv2);	/* | 																 */	    gdk_draw_line(DrawPixmap, drawing_area->style->black_gc, x + WidDiv4, y + HeiDiv4, x + WidDiv2, y + HeiDiv3);	/* _ 																 */	    gdk_draw_line(DrawPixmap, drawing_area->style->black_gc,		x + WidDiv3, y + HeiDiv2, x + WidDiv2, y + HeiDiv3);	    break;	case EDIT_CNX_WITH_TOP:	    gdk_draw_line(DrawPixmap, drawing_area->style->black_gc,		x + WidDiv2, y + HeiDiv4, x + WidDiv2, y + Height - HeiDiv4);	    break;	case EDIT_LONG_CONNECTION:	    gdk_draw_line(DrawPixmap, TheGc,		x, y + HeiDiv2, x + Width - 1, y + HeiDiv2);	    gdk_draw_line(DrawPixmap, TheGc,		x + 3 * WidDiv4 - 1, y + HeiDiv4, x + Width - 1, y + HeiDiv2);	    gdk_draw_line(DrawPixmap, TheGc,		x + 3 * WidDiv4 - 1, y + 3 * HeiDiv4, x + Width - 1,		y + HeiDiv2);	    gdk_draw_line(DrawPixmap, TheGc, x + 3 * WidDiv4 - 1, y + HeiDiv4,		x + 3 * WidDiv4 + 3, y + HeiDiv2);	    gdk_draw_line(DrawPixmap, TheGc, x + 3 * WidDiv4 + 3, y + HeiDiv2,		x + 3 * WidDiv4 - 1, y + 3 * HeiDiv4);	    break;	    /* little display used for the toolbar */	case ELE_TIMER:	    gdk_draw_rectangle(DrawPixmap, drawing_area->style->black_gc,		FALSE, x + WidDiv4, y + HeiDiv4, Width - 2 * WidDiv4,		Height - 2 * HeiDiv4);	    gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),		TheGc, x + WidDiv3 + 2, y + HeiDiv3 * 2, "T", 1);	    break;	case ELE_MONOSTABLE:	    gdk_draw_rectangle(DrawPixmap, drawing_area->style->black_gc,		FALSE, x + WidDiv4, y + HeiDiv4, Width - 2 * WidDiv4,		Height - 2 * HeiDiv4);	    gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),		TheGc, x + WidDiv3 + 2, y + HeiDiv3 * 2, "M", 1);	    break;	case ELE_COMPAR:	    gdk_draw_rectangle(DrawPixmap, drawing_area->style->black_gc,		FALSE, x + WidDiv4, y + HeiDiv4, Width - 2 * WidDiv4,		Height - 2 * HeiDiv4);	    gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),		TheGc, x + WidDiv3 + 2, y + HeiDiv3 * 2, ">", 1);	    break;	case ELE_OUTPUT_OPERATE:	    gdk_draw_rectangle(DrawPixmap, drawing_area->style->black_gc,		FALSE, x + WidDiv4, y + HeiDiv4, Width - 2 * WidDiv4,		Height - 2 * HeiDiv4);	    gdk_draw_text(DrawPixmap, gtk_style_get_font(drawing_area->style),		TheGc, x + WidDiv3 + 2, y + HeiDiv3 * 2, "=", 1);	    break;	}    }    if (!EditDatas.ModeEdit)	gdk_gc_unref(DynaGcOn);}void DrawBars(int PosiY, int IsTheCurrentRung){    GdkColor DynaGdkColor;    GdkGC *DynaGcBarsColor;    DynaGdkColor.pixel = 0xEE5555;    DynaGdkColor.red = 0xEE;    DynaGdkColor.green = 0x55;    DynaGdkColor.blue = 0x55;    if (!IsTheCurrentRung) {	DynaGcBarsColor = drawing_area->style->black_gc;    } else {	DynaGcBarsColor = gdk_gc_new(pixmap);	gdk_gc_set_foreground(DynaGcBarsColor, &DynaGdkColor);    }    gdk_draw_rectangle(pixmap, DynaGcBarsColor, TRUE,	1, 1 + PosiY, 3, InfosGene->BlockHeight * RUNG_HEIGHT);    gdk_draw_rectangle(pixmap, DynaGcBarsColor, TRUE,	InfosGene->BlockWidth * RUNG_WIDTH + OFFSET_X, 1 + PosiY,	3, InfosGene->BlockHeight * RUNG_HEIGHT);    if (IsTheCurrentRung)	gdk_gc_unref(DynaGcBarsColor);}void DrawGrid(int PosiY){    int x, y;    GdkColor DynaGdkColor;    GdkGC *DynaGcOn;    DynaGdkColor.pixel = 0xF4F4F4;    DynaGdkColor.red = 0xF4;    DynaGdkColor.green = 0xF4;    DynaGdkColor.blue = 0xF4;    DynaGcOn = gdk_gc_new(pixmap);    gdk_gc_set_foreground(DynaGcOn, &DynaGdkColor);    for (x = InfosGene->BlockWidth; x < RUNG_WIDTH * InfosGene->BlockWidth;	x = x + InfosGene->BlockWidth) {	gdk_draw_line(pixmap, DynaGcOn, x + OFFSET_X, OFFSET_Y + PosiY,	    x + OFFSET_X, RUNG_HEIGHT * InfosGene->BlockHeight + PosiY);    }    for (y = InfosGene->BlockHeight; y < RUNG_HEIGHT * InfosGene->BlockHeight;	y = y + InfosGene->BlockHeight) {	gdk_draw_line(pixmap, DynaGcOn, OFFSET_X, y + OFFSET_Y + PosiY,	    RUNG_WIDTH * InfosGene->BlockWidth + OFFSET_X,	    y + OFFSET_Y + PosiY);    }    gdk_gc_unref(DynaGcOn);}void DrawRungPartition(int PosiY){    GdkColor DynaGdkColor;    GdkGC *DynaGcOn;    DynaGdkColor.pixel = 0xCCCCCC;    DynaGdkColor.red = 0xCC;    DynaGdkColor.green = 0xCC;    DynaGdkColor.blue = 0xCC;    DynaGcOn = gdk_gc_new(pixmap);    gdk_gc_set_foreground(DynaGcOn, &DynaGdkColor);    gdk_draw_line(pixmap, DynaGcOn,	OFFSET_X, OFFSET_Y + PosiY,	RUNG_WIDTH * InfosGene->BlockWidth + OFFSET_X, OFFSET_Y + PosiY);    gdk_gc_unref(DynaGcOn);}void GetTheSizesForRung(){    static int PageHeightBak = 0;    static int BlockHeightBak = 0;    InfosGene->BlockWidth = InfosGene->BlockHeight =	(GTK_WIDGET(drawing_area)->allocation.width - OFFSET_X -	5) / RUNG_WIDTH;    InfosGene->PageHeight =	GTK_WIDGET(drawing_area)->allocation.height - OFFSET_Y;    // used for sequential    InfosGene->PageWidth =	GTK_WIDGET(drawing_area)->allocation.width - OFFSET_X;    // size of the page or block changed ?    if (InfosGene->PageHeight != PageHeightBak	|| InfosGene->BlockHeight != BlockHeightBak)	UpdateVScrollBar();    PageHeightBak = InfosGene->PageHeight;    BlockHeightBak = InfosGene->BlockHeight;}void DrawRung(StrRung * Rung, int PosiY){    int x, y;    for (y = 0; y < RUNG_HEIGHT; y++) {	for (x = 0; x < RUNG_WIDTH; x++) {	    DrawElement(pixmap, x * InfosGene->BlockWidth + OFFSET_X,		y * InfosGene->BlockHeight + OFFSET_Y + PosiY,		InfosGene->BlockWidth, InfosGene->BlockHeight,		Rung->Element[x][y], FALSE);	}    }}void DrawRungs(){    int ScanRung = InfosGene->TopRungDisplayed;    int ScanY = InfosGene->OffsetHiddenTopRungDisplayed;    StrRung *PtrRung;    int TheEnd = FALSE;    // Clean all    gdk_draw_rectangle(pixmap, drawing_area->style->white_gc, TRUE,	0, 0, InfosGene->BlockWidth * RUNG_WIDTH + 50,	InfosGene->PageHeight + 50);    for (ScanY = -InfosGene->OffsetHiddenTopRungDisplayed;	(ScanY < InfosGene->PageHeight) && !TheEnd;	ScanY += (InfosGene->BlockHeight * RUNG_HEIGHT)) {	PtrRung = &RungArray[ScanRung];	/* displaying the current rung - in edit ? */	if ((ScanRung == InfosGene->CurrentRung) && EditDatas.ModeEdit) {	    /* grid for edit mode and display the rung under edition */	    DrawGrid(ScanY);	    PtrRung = &EditDatas.Rung;	}	DrawBars(ScanY, ScanRung == InfosGene->CurrentRung);	DrawRung(PtrRung, ScanY);	DrawRungPartition(ScanY + InfosGene->BlockHeight * RUNG_HEIGHT - 5);	if (ScanRung != InfosGene->LastRung)	    ScanRung = RungArray[ScanRung].NextRung;	else	    TheEnd = TRUE;    }}void DrawCurrentSection(void){    GdkRectangle update_rect;    int iCurrentLanguage = SectionArray[InfosGene->CurrentSection].Language;    GetTheSizesForRung();    if (iCurrentLanguage == SECTION_IN_LADDER)	DrawRungs();#ifdef SEQUENTIAL_SUPPORT    if (iCurrentLanguage == SECTION_IN_SEQUENTIAL)	DrawSequentialPage(SectionArray[InfosGene->CurrentSection].	    SequentialPage);#endif    update_rect.x = 0;    update_rect.y = 0;    update_rect.width = GTK_WIDGET(drawing_area)->allocation.width;    update_rect.height = GTK_WIDGET(drawing_area)->allocation.height;    gtk_widget_draw(drawing_area, &update_rect);}

⌨️ 快捷键说明

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