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