예제 #1
0
    // Procedures
    // External procedures
    // Chapter: Graphics / Text
    // Short Description: This procedure writes a text message.
    public void disp_message(object hv_WindowHandle, object hv_String, object hv_CoordSystem,
                             object hv_Row, object hv_Column, object hv_Color, object hv_Box)
    {
        HOperatorSetX    Op    = new HOperatorSetX();
        HTupleX          Tuple = new HTupleX();
        HDevWindowStackX COMExpWinHandleStack = new HDevWindowStackX();
        HSystemX         sys = new HSystemX();

        // Local control variables

        object hv_Red, hv_Green, hv_Blue, hv_Row1Part;
        object hv_Column1Part, hv_Row2Part, hv_Column2Part, hv_RowWin;
        object hv_ColumnWin, hv_WidthWin, hv_HeightWin, hv_MaxAscent;
        object hv_MaxDescent, hv_MaxWidth, hv_MaxHeight, hv_R1 = null;
        object hv_C1 = null, hv_FactorRow = null, hv_FactorColumn = null;
        object hv_Width = null, hv_Index = null, hv_Ascent = null, hv_Descent = null;
        object hv_W = null, hv_H = null, hv_FrameHeight = null, hv_FrameWidth = null;
        object hv_R2 = null, hv_C2 = null, hv_DrawMode = null, hv_Exception = null;
        object hv_CurrentColor = null;

        // Initialize local and output iconic variables

        //This procedure displays text in a graphics window.
        //
        //Input parameters:
        //WindowHandle: The WindowHandle of the graphics window, where
        //   the message should be displayed
        //String: A tuple of strings containing the text message to be displayed
        //CoordSystem: If set to 'window', the text position is given
        //   with respect to the window coordinate system.
        //   If set to 'image', image coordinates are used.
        //   (This may be useful in zoomed images.)
        //Row: The row coordinate of the desired text position
        //   If set to -1, a default value of 12 is used.
        //Column: The column coordinate of the desired text position
        //   If set to -1, a default value of 12 is used.
        //Color: defines the color of the text as string.
        //   If set to [], '' or 'auto' the currently set color is used.
        //   If a tuple of strings is passed, the colors are used cyclically
        //   for each new textline.
        //Box: If set to 'true', the text is written within a white box.
        //
        //prepare window
        Op.GetRgb(hv_WindowHandle, out hv_Red, out hv_Green, out hv_Blue);
        Op.GetPart(hv_WindowHandle, out hv_Row1Part, out hv_Column1Part, out hv_Row2Part,
                   out hv_Column2Part);
        Op.GetWindowExtents(hv_WindowHandle, out hv_RowWin, out hv_ColumnWin, out hv_WidthWin,
                            out hv_HeightWin);
        Op.SetPart(hv_WindowHandle, 0, 0, Tuple.TupleSub(hv_HeightWin, 1), Tuple.TupleSub(
                       hv_WidthWin, 1));
        //
        //default settings
        if (Convert.ToInt32(Tuple.TupleEqual(hv_Row, -1)) != 0)
        {
            hv_Row = 12;
        }
        if (Convert.ToInt32(Tuple.TupleEqual(hv_Column, -1)) != 0)
        {
            hv_Column = 12;
        }
        if (Convert.ToInt32(Tuple.TupleEqual(hv_Color, null)) != 0)
        {
            hv_Color = "";
        }
        //
        hv_String = Tuple.TupleSplit(Tuple.TupleAdd(Tuple.TupleAdd("", hv_String), ""),
                                     "\n");
        //
        //Estimate extentions of text depending on font size.
        Op.GetFontExtents(hv_WindowHandle, out hv_MaxAscent, out hv_MaxDescent, out hv_MaxWidth,
                          out hv_MaxHeight);
        if (Convert.ToInt32(Tuple.TupleEqual(hv_CoordSystem, "window")) != 0)
        {
            hv_R1 = hv_Row;
            hv_C1 = hv_Column;
        }
        else
        {
            //transform image to window coordinates
            hv_FactorRow = Tuple.TupleDiv(Tuple.TupleMult(1.0, hv_HeightWin), Tuple.TupleAdd(
                                              Tuple.TupleSub(hv_Row2Part, hv_Row1Part), 1));
            hv_FactorColumn = Tuple.TupleDiv(Tuple.TupleMult(1.0, hv_WidthWin), Tuple.TupleAdd(
                                                 Tuple.TupleSub(hv_Column2Part, hv_Column1Part), 1));
            hv_R1 = Tuple.TupleMult(Tuple.TupleAdd(Tuple.TupleSub(hv_Row, hv_Row1Part), 0.5),
                                    hv_FactorRow);
            hv_C1 = Tuple.TupleMult(Tuple.TupleAdd(Tuple.TupleSub(hv_Column, hv_Column1Part),
                                                   0.5), hv_FactorColumn);
        }
        //
        //display text box depending on text size
        if (Convert.ToInt32(Tuple.TupleEqual(hv_Box, "true")) != 0)
        {
            //calculate box extents
            hv_String = Tuple.TupleAdd(Tuple.TupleAdd(" ", hv_String), " ");
            hv_Width  = null;
            for (hv_Index = 0; Convert.ToInt32(hv_Index) <= Convert.ToInt32(Tuple.TupleSub(
                                                                                Tuple.TupleLength(hv_String), 1)); hv_Index = Convert.ToInt32(hv_Index) + 1)
            {
                Op.GetStringExtents(hv_WindowHandle, Tuple.TupleSelect(hv_String, hv_Index),
                                    out hv_Ascent, out hv_Descent, out hv_W, out hv_H);
                hv_Width = Tuple.TupleConcat(hv_Width, hv_W);
            }
            hv_FrameHeight = Tuple.TupleMult(hv_MaxHeight, Tuple.TupleLength(hv_String));
            hv_FrameWidth  = Tuple.TupleMax(Tuple.TupleConcat(0, hv_Width));
            hv_R2          = Tuple.TupleAdd(hv_R1, hv_FrameHeight);
            hv_C2          = Tuple.TupleAdd(hv_C1, hv_FrameWidth);
            //display rectangles
            Op.GetDraw(hv_WindowHandle, out hv_DrawMode);
            Op.SetDraw(hv_WindowHandle, "fill");
            Op.SetColor(hv_WindowHandle, "light gray");
            Op.DispRectangle1(hv_WindowHandle, Tuple.TupleAdd(hv_R1, 3), Tuple.TupleAdd(
                                  hv_C1, 3), Tuple.TupleAdd(hv_R2, 3), Tuple.TupleAdd(hv_C2, 3));
            Op.SetColor(hv_WindowHandle, "white");
            Op.DispRectangle1(hv_WindowHandle, hv_R1, hv_C1, hv_R2, hv_C2);
            Op.SetDraw(hv_WindowHandle, hv_DrawMode);
        }
        else if (Convert.ToInt32(Tuple.TupleNotEqual(hv_Box, "false")) != 0)
        {
            hv_Exception = "Wrong value of control parameter Box";
            throw new HException(hv_Exception);
        }
        //Write text.
        for (hv_Index = 0; Convert.ToInt32(hv_Index) <= Convert.ToInt32(Tuple.TupleSub(Tuple.TupleLength(
                                                                                           hv_String), 1)); hv_Index = Convert.ToInt32(hv_Index) + 1)
        {
            hv_CurrentColor = Tuple.TupleSelect(hv_Color, Tuple.TupleMod(hv_Index, Tuple.TupleLength(
                                                                             hv_Color)));
            if (Convert.ToInt32(Tuple.TupleAnd(Tuple.TupleNotEqual(hv_CurrentColor, ""),
                                               Tuple.TupleNotEqual(hv_CurrentColor, "auto"))) != 0)
            {
                Op.SetColor(hv_WindowHandle, hv_CurrentColor);
            }
            else
            {
                Op.SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);
            }
            hv_Row = Tuple.TupleAdd(hv_R1, Tuple.TupleMult(hv_MaxHeight, hv_Index));
            Op.SetTposition(hv_WindowHandle, hv_Row, hv_C1);
            Op.WriteString(hv_WindowHandle, Tuple.TupleSelect(hv_String, hv_Index));
        }
        //reset changed window settings
        Op.SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);
        Op.SetPart(hv_WindowHandle, hv_Row1Part, hv_Column1Part, hv_Row2Part, hv_Column2Part);

        return;
    }