Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22
1

Как сформировать bitmap с отображением label

11.07.2014, 18:41. Просмотров 675. Ответов 9
Метки нет (Все метки)

У меня создается форма:
C#
1
Form GraphForm = new Form();
Далее на ней размещается контрол Zedgraph, PictureBox с картинкой ресурсом легенды графика Zedgraph и поверх картинки-легенды на label отображается необходимая линейка:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ZedGraphControl div = new ZedGraphControl();
//Настройка контрола и заполнение его данными
GraphForm.Controls.Add(div);
double divValLeg;
                int s = 0;
                divValLeg = -5 * (Convert.ToDouble(divconstSb.Text));
                for (; divValLeg < 9*Convert.ToDouble(divconstSb.Text); divValLeg += Convert.ToDouble(divconstSb.Text))
                {                    
                    System.Windows.Forms.Label label = new System.Windows.Forms.Label();
                    label.Location = new Point(1200, 32+s);
                    s += 32;
                    label.Size = new Size(31, 16);
                    label.Font = new Font(label.Font.FontFamily, 8);
                    divValLeg = Math.Round(divValLeg, 2);
                    label.Text = Convert.ToString(divValLeg+Convert.ToDouble(divconstSb.Text));
                    label.Visible = true;
                    label.Show();
                    label.BackColor = Color.White;
                    GraphForm.Controls.Add(label);
                }
PictureBox legend = new PictureBox();
                legend.Image = new Bitmap(Properties.Resources.legend);
                legend.Location = new Point(1200, 0);
                legend.Size = new Size(78, 493);
                legend.Visible = true;
                legend.Show();
                GraphForm.Controls.Add(legend);
После чего моя задача сводится к сохранению всего того что есть на форме в картинку.
Если делать это следующим образом:
C#
1
2
3
Bitmap b = new Bitmap(GraphForm.Size.Width, GraphForm.Size.Height);
GraphForm.DrawToBitmap(b, new Rectangle(0, 0, 1270, 510));
bmpSaveDialog(b);
, то сохраняется все что есть на форме кроме label`ов.
Как сформировать bitmap с отображением label

Если формировать bitmap следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bmpSaveDialog(CaptureControl(GraphForm));
private Bitmap CaptureControl(Control ctl)
        {
            Rectangle rect;
 
            if (ctl is Form)
                rect = new Rectangle(ctl.Location, ctl.Size);
            else
                rect = new Rectangle(ctl.PointToScreen(new Point(0, 0)), ctl.Size);
 
            Bitmap bitmap = new Bitmap(rect.Width, rect.Height);
 
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);
            }
 
            return bitmap;
        }
, то сохраняется снимок экрана ПОД формой, т.е. кусок VisualStudio
Как сформировать bitmap с отображением label

Вопрос.Как сформировать bitmap чтобы на нем отображались label с GraphForm ?
Как сформировать bitmap с отображением label
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2014, 18:41
Ответы с готовыми решениями:

Как создать bitmap из области (по координатам пикселей) другого bitmap
Здравствуйте. Подскажите пожалуйста как создать bitmap из области(по...

Нарисовать прошлый Bitmap на новом так, чтобы небыл растянут рисунок, если новый Bitmap больше размером
Короче пытался сделать такое дело: Рисую фигуры на форме, когда отпускаю левую...

Как удалить картинку, загружаемую как Bitmap, но более не использующуюся
Bitmap bitmap = new Bitmap(mypath); im2.Image = bitmap;...

Webbrowser - как редактировать html сайта перед отображением (например, чистить рекламу)
Добрый день! Webbrowser отображает сайт внутри моей программы. Однако на...

Как преобразовать Bitmap в массив?
задача такая, есть picutrebox в нем загружена картинка ч\б, как обратится...

9
aleks_pilipenko
)))
606 / 310 / 55
Регистрация: 31.12.2009
Сообщений: 2,273
Записей в блоге: 3
11.07.2014, 20:37 2
прорисовывай Лейблы как текст в нужном тебе Битмапе...
координаты Лейблов есть, текст из них же...
Через цикл foreach можно перебрать необходимые, по сути в три строки кода можно уложиться...
0
Ev_Hyper
Заблокирован
13.07.2014, 16:34 3
super_pavelka, может стоит попробывать добавить легенду на график, а после уже сохранять сразу через зедграф-контрол?
0
super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22
29.07.2014, 17:14  [ТС] 4
aleks_pilipenko,я нуб.можно пример кода? я не понял что значит прорисовать лейблы как текст в нужном битмапе.
Ev_Hyper, тоже не совсем понятно.у меня все элементы добавляются на GraphForm, а с GraphForm потом рисуется bitmap.тоесть ZedGraphControl находится на GraphForm.
0
Ev_Hyper
Заблокирован
29.07.2014, 18:21 5
super_pavelka, я имею ввиду нарисовать легенду на самом контроле ZedGraph. Тогда можно будет сохранить изображение через него, не используя Bitmap.

http://jenyay.net/ZedGraph/TextBackground
1
aleks_pilipenko
)))
606 / 310 / 55
Регистрация: 31.12.2009
Сообщений: 2,273
Записей в блоге: 3
29.07.2014, 18:30 6
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
 
namespace Project2
{
    public partial class Form1 : Form
    {
    
        public Form1()
        {
            InitializeComponent();
        }
 
        private Button button1;
        Label[] LB = new Label[10];
 
        [STAThread]
        static void Main()
        { Application.Run(new Form1()); }
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(343, 29);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "Сохранить";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // Form1
            // 
            this.ClientSize = new System.Drawing.Size(496, 313);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                LB[i] = new Label();
                LB[i].Text = "label"+(i+1).ToString();
                LB[i].AutoSize = true;
                this.Controls.Add(LB[i]);
                LB[i].Location = new Point(0, i * 20);
                LB[i].MouseDown += new MouseEventHandler(LB_MouseDown);
                LB[i].MouseMove += new MouseEventHandler(LB_MouseDown);
            }
        }
 
        int x, y;
        bool s = false;
        void LB_MouseDown(object sender, MouseEventArgs e)
        {
            Label p1 = sender as Label;
            if (s == false) { x = e.X; y = e.Y; s = true; }
            if (e.Button.ToString() == "Left")
                p1.Location = new Point(p1.Left+e.X - x,p1.Top+ e.Y - y); 
            else { s = false; }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap BM = new Bitmap(this.Width, this.Height);
            Graphics c = Graphics.FromImage(BM);
            for (int i = 0; i < 10; i++)
                c.DrawString(LB[i].Text, LB[i].Font, new SolidBrush(LB[i].ForeColor), LB[i].Location);
            BM.Save(Application.StartupPath + "//1.jpg");
        }
    }
}
1
super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22
29.07.2014, 21:29  [ТС] 7
огромное спасибо!
0
super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22
31.07.2014, 12:04  [ТС] 8
aleks_pilipenko, по вашему способу сделать было проще, но я столкнулся со следующей проблемой: при отображении формы все лейблы находятся на своем месте
Как сформировать bitmap с отображением label

, а после сохранения смещаются по оси Y вверх
Как сформировать bitmap с отображением label


вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
double divValLeg;
                int s = 0;
                divValLeg = -5 * (Convert.ToDouble(divconstSb.Text));
                System.Windows.Forms.Label[] LB = new System.Windows.Forms.Label[14];
                for (int i = 0; i < 14; i++)
                {
                    LB[i] = new System.Windows.Forms.Label();
                    LB[i].Text = Convert.ToString(Math.Round(divValLeg + Convert.ToDouble(divconstSb.Text),2));
                    LB[i].Font = new Font(LB[i].Font.FontFamily, 8);
                    LB[i].Size = new Size(31, 16);
                    LB[i].Location = new Point(1200, 32 + s);
                    s += 32;
                    LB[i].BackColor = Color.White;
                    LB[i].Show();
                    GraphForm.Controls.Add(LB[i]);                    
                    divValLeg += Convert.ToDouble(divconstSb.Text);
                }
PictureBox legend = new PictureBox();
                legend.Image = new Bitmap(Properties.Resources.legend);
                legend.Location = new Point(1200, 0);
                legend.Size = new Size(78, 493);
                legend.Visible = true;
                legend.Show();
                div.Invalidate();
                GraphForm.Controls.Add(legend);
                Graphics g = GraphForm.CreateGraphics();                
                Rectangle r = GraphForm.RectangleToScreen(GraphForm.ClientRectangle);
                Bitmap b = new Bitmap(GraphForm.Size.Width, GraphForm.Size.Height);         
                GraphForm.DrawToBitmap(b, new Rectangle(0, 0, 1300, 514));
                Graphics c = Graphics.FromImage(b);
                for (int i = 0; i < 14; i++)
                    c.DrawString(LB[i].Text, LB[i].Font, new SolidBrush(LB[i].ForeColor), LB[i].Location);
                bmpSaveDialog(b);
0
aleks_pilipenko
)))
606 / 310 / 55
Регистрация: 31.12.2009
Сообщений: 2,273
Записей в блоге: 3
31.07.2014, 12:08 9
Цитата Сообщение от super_pavelka Посмотреть сообщение
смещаются по оси Y вверх
чесс слово, не знаю... Разбираться сейчас некогда, работа...
Может они не на форме, а на Панельке? Или ещё что-нибудь, потренеруйся на маленьком проект, потом свой проверяй...
0
super_pavelka
0 / 0 / 2
Регистрация: 22.06.2013
Сообщений: 22
31.07.2014, 15:44  [ТС] 10
aleks_pilipenko, да вроде на форме.ладно спасибо буду разбираться дальше =)

Добавлено через 3 часа 14 минут
aleks_pilipenko, нашел выход.при прорисовке текста в битмап надо чуть сместить начальные координаты лейблов и тогда они будут сохранятся с поправкой в нужном месте:
C#
1
2
for (int i = 0; i < 14; i++)
 c.DrawString(LB[i].Text, LB[i].Font, new SolidBrush(LB[i].ForeColor), LB[i].Location.X+5,LB[i].Location.Y + 18);
тему думаю можно закрыть
0
31.07.2014, 15:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 15:44

Как сравнить два bitmap?
День добрый. Пишу игру &quot;Сбей самолет&quot;, снаряды летают, самолеты тоже, а вот как...

Как сделать подписи осей на Bitmap?
Добрый вечер, форумчане. Проблема: есть график на bitmap-е и нужно сделать...

Как указать путь к файлу в Bitmap?
Ребят, подскажите пожалуйста как правильно указать путь к файлу? Bitmap...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru