예제 #1
0
        public void DrawString(string Text, Rect theRect, IFontStyleInfo theFont)
        {
            GDIFontStyle FontStyle = (GDIFontStyle)theFont;

            if (CurrentTextColor != FontStyle.Win32ForeColor)
            {
                CurrentTextColor = FontStyle.Win32ForeColor;
                API.SetTextColor(hDC, FontStyle.Win32ForeColor);
            }

            IntPtr hOldFont = API.SelectObject(hDC, ((GDIFont)FontStyle.Font).hFont);

            API.RECT r = new API.RECT();

            r.Left   = theRect.Location.X;
            r.Top    = theRect.Location.Y;
            r.Right  = theRect.Right;
            r.Bottom = theRect.Bottom;

            // API.DrawText(hDC, Text, Text.Length, ref r, 2368);

            API.ExtTextOut(hDC, r.Left, r.Top, 4, ref r, Text, (uint)Text.Length, null);

            API.SelectObject(hDC, hOldFont);

            // No need to Delete hFont because we're going to reuse it
            // it is being saved in GDIFontStyle FontStyle
            // API.DeleteObject(hFont);

            // No need to restore old text color
            // because we're setting it new each time anyway
            // API.SetTextColor(hDC, hOldColor);
        }
예제 #2
0
        public void GradientFill4(
            Rect rect,
            Color leftTop,
            Color rightTop,
            Color leftBottom,
            Color rightBottom,
            int steps)
        {
            //long startTime = Stopwatch.GetTimestamp();
            GuiLabs.Utils.API.RECT r = new API.RECT();

            Color upper, lower, final;

            final = Color.WhiteSmoke;

            for (int i = 0; i < steps; i++)
            {
                float xratio = (float)i / steps;
                r.Left  = (int)(rect.Left + rect.Width * xratio);
                r.Right = (int)(rect.Left + rect.Width * (float)(i + 1) / steps);
                for (int j = 0; j < steps; j++)
                {
                    float yratio = (float)j / steps;
                    r.Top    = (int)(rect.Top + rect.Height * yratio);
                    r.Bottom = (int)(rect.Top + rect.Height * (float)(j + 1) / steps);

                    upper = Colors.Interpolate(leftTop, rightTop, xratio);
                    lower = Colors.Interpolate(leftBottom, rightBottom, xratio);
                    final = Colors.Interpolate(upper, lower, yratio);

                    API.FillRectangle(hDC, final, r);
                }
            }

            //long stopTime = Stopwatch.GetTimestamp();
            //DrawString(
            //    ((stopTime - startTime) / (double)Stopwatch.Frequency).ToString(),
            //    rect);
        }
예제 #3
0
        private void label4_Click(object sender, EventArgs e)
        {
            bool mainShow = WindowUtils.IsVisible(FormMain.formMain.Handle);

            if (mainShow)
            {
                WindowUtils.Hide(FormMain.formMain.Handle);
            }
            WindowUtils.Hide(Handle);
            FormChooseWindow formChooseWindow = new FormChooseWindow();

            if (formChooseWindow.ShowDialog() == DialogResult.OK)
            {
                if (formChooseWindow.Window != IntPtr.Zero)
                {
                    API.RECT rc = formChooseWindow.RECT;
                    Location         = new Point(rc.Left, rc.Top);
                    resizeTargetSize = new Size(rc.Right - rc.Left, rc.Bottom - rc.Top);
                    if (resizeTargetSize.Width % 4 != 0)
                    {
                        resizeTargetSize.Width -= resizeTargetSize.Width % 4;
                    }
                    if (resizeTargetSize.Height % 4 != 0)
                    {
                        resizeTargetSize.Height -= resizeTargetSize.Height % 4;
                    }
                    Size             = resizeTargetSize;
                    resizeTargetSize = Size.Empty;
                }
            }
            if (mainShow)
            {
                WindowUtils.Show(FormMain.formMain.Handle);
            }
            WindowUtils.Show(Handle);
        }
예제 #4
0
        public void GradientFillRectangle(Rect theRect, System.Drawing.Color Color1, System.Drawing.Color Color2, LinearGradientMode GradientType)
        {
            int ColorR1 = Color1.R;
            int ColorG1 = Color1.G;
            int ColorB1 = Color1.B;

            int ColorR2 = Color2.R - ColorR1;
            int ColorG2 = Color2.G - ColorG1;
            int ColorB2 = Color2.B - ColorB1;

            int Width  = theRect.Size.X;
            int Height = theRect.Size.Y;
            int x0     = theRect.Location.X;
            int y0     = theRect.Location.Y;
            int x1     = theRect.Right;
            int y1     = theRect.Bottom;

            if (Width <= 0 || Height <= 0)
            {
                return;
            }

            double Coeff;
            int    StepSize;

            API.RECT R = new API.RECT();

            int NumberOfSteps = 128;             // number of steps

            if (GradientType == System.Drawing.Drawing2D.LinearGradientMode.Horizontal)
            {
                double InvWidth = 1.0 / Width;

                StepSize = Width / NumberOfSteps;
                if (StepSize < 1)
                {
                    StepSize = 1;
                }

                R.Top    = y0;
                R.Bottom = y1;

                for (int i = x0; i <= x1; i += StepSize)
                {
                    R.Left  = i;
                    R.Right = i + StepSize;
                    if (R.Right > x1)
                    {
                        R.Right = x1;
                    }

                    Coeff = (i - x0) * InvWidth;

                    IntPtr hBrush = API.CreateSolidBrush((int)
                                                         (int)(ColorR1 + (double)ColorR2 * Coeff) |
                                                         (int)(ColorG1 + (double)ColorG2 * Coeff) << 8 |
                                                         (int)(ColorB1 + (double)ColorB2 * Coeff) << 16
                                                         );

                    API.FillRect(hDC, ref R, hBrush);
                    API.DeleteObject(hBrush);
                }
            }
            else
            {
                double InvHeight = 1.0 / Height;

                StepSize = Height / NumberOfSteps;

                if (StepSize < 1)
                {
                    StepSize = 1;
                }

                R.Left  = x0;
                R.Right = x1;

                for (int i = y0; i <= y1; i += StepSize)
                {
                    R.Top    = i;
                    R.Bottom = i + StepSize;
                    if (R.Bottom > y1)
                    {
                        R.Bottom = y1;
                    }

                    Coeff = (i - y0) * InvHeight;
                    IntPtr hBrush = API.CreateSolidBrush(
                        (int)(ColorR1 + (double)ColorR2 * Coeff) |
                        (int)(ColorG1 + (double)ColorG2 * Coeff) << 8 |
                            (int)(ColorB1 + (double)ColorB2 * Coeff) << 16
                        );

                    API.FillRect(hDC, ref R, hBrush);
                    API.DeleteObject(hBrush);
                }
            }
        }
예제 #5
0
 private Rect MyConverterApiRectToRect(API.RECT rect)
 {
     return(new Rect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top));
 }