Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 10.07.2018
Сообщений: 11

Добавление пользовательского элемента управления из другого проекта

16.07.2018, 12:04. Показов 1912. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Нашел на форуме ссылочку на материал, в котором человек в видео рассказывает, как создавал пользовательский trackbar, скачал его проект (в свободном доступе), но не знаю как добавить в свой проект его наработки. У него в Проекте тестовая форма и куча пользовательских контролов. Все они лежат в отдельной папке файлами *.cs ... Пользуюсь VS 2017.
Заранее благодарю за помощь.

Кликните здесь для просмотра всего текста

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.ComponentModel;
 
namespace AboControls.ExtendedControls
{
    [Flags]
    public enum SmartLocking { None, Left, Middle, Right, All = Left | Middle | Right };
 
    [DefaultEvent("ValueChanged")]
    class Slider : Control
    {
        private Bitmap _knobBitmap, _knobRolloverBitmap, _disabledImage;
        private BufferedGraphics _bufGraphics;
        private readonly BufferedGraphicsContext _bufContext = BufferedGraphicsManager.Current;
        private Rectangle _knobRect;
        private int _lastX;
        private float _value;
        private bool _isMouseOverSlider;
        private bool _draggingKnob; // Denotes whether we are dragging over the knob
 
        [Description("Occurs when the scroll percentage is changed")]
        public event EventHandler ValueChanged;
 
        public Slider()
        {
            this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint
                | ControlStyles.OptimizedDoubleBuffer, true);
 
            AllowKeyNavigation = true;
            RetainPercent = true;
            UpdateGraphicsBuffer();
            SetDefaultBitmaps();
        }
 
        #region Overrides
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
 
            if (AllowKeyNavigation)
            {
                switch (e.KeyCode)
                {
                    case Keys.D1: Value = 0.1f; break;
                    case Keys.D2: Value = 0.2f; break;
                    case Keys.D3: Value = 0.3f; break;
                    case Keys.D4: Value = 0.4f; break;
                    case Keys.D5: Value = 0.5f; break;
                    case Keys.D6: Value = 0.6f; break;
                    case Keys.D7: Value = 0.7f; break;
                    case Keys.D8: Value = 0.8f; break;
                    case Keys.D9: Value = 0.9f; break;
                    case Keys.D0: Value = 0.0f; break;
                    case Keys.Oemplus: Value += 0.1f; break;
                    case Keys.OemMinus: Value -= 0.1f; break;
                }
            }
        }
 
        protected override void OnMouseClick(MouseEventArgs e)
        {
            base.OnMouseClick(e);
 
            if (AllowQuickTracking && !_draggingKnob)
            {
                SliderX = e.X - _knobBitmap.Width / 2;
                this.Invalidate(); // Need to invalidate everything here
            }
        }
 
        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
 
            if (_isMouseOverSlider)
            {
                _isMouseOverSlider = false;
                this.Invalidate(_knobRect);
            }
        }
 
        protected override void OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);
 
            if (SmartLockAmount > 0)
            {
                int wholePercent = (int)((float)_knobRect.Left / (this.Width - _knobRect.Width) * 100 + 0.5);
 
                // If around 0%
                if (SmartLockingFlags.HasFlag(SmartLocking.Left) && wholePercent < SmartLockAmount)
                {
                    Value = 0;
                }
                // If around 50%
                else if (SmartLockingFlags.HasFlag(SmartLocking.Middle) && Math.Abs(wholePercent - 50) < SmartLockAmount)
                {
                    Value = 0.5f;
                }
                // If around 100%
                else if (SmartLockingFlags.HasFlag(SmartLocking.Right) && 100 - wholePercent < SmartLockAmount)
                {
                    Value = 1f;
                }
            }
 
            _draggingKnob = false;
            this.Invalidate();
        }
 
        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
 
            if (UseHandCursorForKnob)
            {
                if (_knobRect.Contains(e.Location))
                {
                    if (!this.Cursor.Equals(Cursors.Hand))
                        this.Cursor = Cursors.Hand;
                }
                else if (!this.Cursor.Equals(Cursors.Hand))
                {
                    this.Cursor = Cursors.Default;
                }
            }
 
            bool maxedLeft = e.X < 0 && _value == 0f;
            bool maxedRight = e.X > this.Width && _value == 1f;
 
            // If left mouse button pressed and cursor x is within slider bounds
            if (_draggingKnob && !(maxedLeft || maxedRight))
            {
                SliderX += e.X - _lastX;
                _lastX = e.X;
                this.Invalidate(_knobRect);
            }
 
            // Only update rollover effects if a change has occured
            if (!_isMouseOverSlider && _knobRect.Contains(e.Location))
            {
                _isMouseOverSlider = true;
                this.Invalidate(_knobRect);
            }
            else if (_isMouseOverSlider && !_knobRect.Contains(e.Location))
            {
                _isMouseOverSlider = false;
                this.Invalidate(_knobRect);
            }
        }
 
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            _lastX = e.X;
            _draggingKnob = (_knobRect.Contains(e.Location) && e.Button == MouseButtons.Left);
        }
 
        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);
 
            // Retain slider percent position on sizing
            if (RetainPercent)
            {
                _knobRect.X = (int)((this.ClientSize.Width - _knobRect.Width) * _value + 0.5);
            }
            else // Reassign to SliderX to retain bounds
            {
                SliderX = _knobRect.X;
            }
 
            UpdateGraphicsBuffer();
 
            if (_knobBitmap != null)
            {
                _knobRect.Height = _knobBitmap.Height;
                this.Height = _knobBitmap.Height;
            }
 
            this.Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            _bufGraphics.Graphics.Clear(this.BackColor);
            DrawBar(_bufGraphics.Graphics);
 
            if (_isMouseOverSlider || _draggingKnob)
                _bufGraphics.Graphics.DrawImage(_knobRolloverBitmap, _knobRect);
            else if (!this.Enabled && _disabledImage != null)
                _bufGraphics.Graphics.DrawImage(_disabledImage, _knobRect);
            else
                _bufGraphics.Graphics.DrawImage(_knobBitmap, _knobRect);
 
            _bufGraphics.Render(e.Graphics);
        }
        #endregion
 
        /// <summary>
        /// Provides default bitmaps for the rollover and default slider images
        /// </summary>
        private void SetDefaultBitmaps()
        {
            KnobImage = new Bitmap(20, 20);
 
            using (Graphics graphics = Graphics.FromImage(_knobBitmap))
            {
                IncreaseGfxQuality(graphics);
                graphics.FillEllipse(Brushes.Red, 0, 0, _knobBitmap.Width, _knobBitmap.Height);
            }
 
            _knobRolloverBitmap = new Bitmap(20, 20);
 
            using (Graphics graphics = Graphics.FromImage(_knobRolloverBitmap))
            {
                IncreaseGfxQuality(graphics);
                graphics.FillEllipse(Brushes.Green, 0, 0, _knobRolloverBitmap.Width, _knobRolloverBitmap.Height);
            }
        }
 
        private void UpdateGraphicsBuffer()
        {
            if (this.Width > 0 && this.Height > 0)
            {
                _bufContext.MaximumBuffer = new Size(this.Size.Width + 1, this.Size.Height + 1);
                _bufGraphics = _bufContext.Allocate(this.CreateGraphics(), this.ClientRectangle);
                IncreaseGfxQuality(_bufGraphics.Graphics);
            }
        }
 
        private static void IncreaseGfxQuality(Graphics graphics)
        {
            graphics.SmoothingMode = SmoothingMode.AntiAlias;
            graphics.InterpolationMode = InterpolationMode.HighQualityBilinear;
            graphics.CompositingQuality = CompositingQuality.HighQuality;
            graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
        }
 
        /// <summary>
        /// Draws the back bar or any graphics, behind the knob
        /// </summary>
        protected virtual void DrawBar(Graphics graphics)
        {
            // Draw default back bar
            int barHeight = (int)(this.Height / 3.0 + 0.5);
            int barY = this.Height / 2 - barHeight / 2;
            Rectangle rect = new Rectangle(_knobRect.Width / 2, barY, this.Width - _knobRect.Width, barHeight);
            graphics.FillRectangle(Brushes.Gray, rect);
        }
 
        #region Properties
        [Category("Appearance")]
        [DefaultValue(null)]
        [Description("The image to be displayed when this control is disabled")]
        public Bitmap DisabledImage
        {
            get { return _disabledImage; }
            set
            {
                _disabledImage = value;
                this.Invalidate(_knobRect);
            }
        }
 
        [Category("Appearance")]
        [DefaultValue(null)]
        [Description("The image to be displayed when a users mouse leaves the slider")]
        public Bitmap KnobImage
        {
            get { return _knobBitmap; }
            set
            {
                _knobBitmap = value;
 
                if (_knobBitmap != null)
                {
                    _knobRect.Size = new Size(_knobBitmap.Width, _knobBitmap.Height);
                    this.Height = _knobBitmap.Height;
                }
 
                this.Invalidate(_knobRect);
            }
        }
 
        [Category("Appearance")]
        [DefaultValue(null)]
        [Description("The image to be displayed when a user rolls the mouse over the slider")]
        public Bitmap KnobRolloverImage
        {
            get { return _knobRolloverBitmap; }
            set
            {
                _knobRolloverBitmap = value;
                this.Invalidate(_knobRect);
            }
        }
 
        private int SliderX
        {
            get { return _knobRect.X; }
            set
            {
                if (value < 0) value = 0;
                else if (value > this.Width - _knobRect.Width) value = this.Width - _knobRect.Width;
 
                Value = (float)_knobRect.Left / (this.ClientSize.Width - _knobRect.Width);
                _knobRect.X = value;
            }
        }
 
        /// <summary>
        /// Gets or sets the position of the knob as a percentage of the control
        /// </summary>
        [Category("Data")]
        [DefaultValue(0)]
        [Description("The current value as a percentage from 0-1")]
        public float Value
        {
            get { return _value; }
            set
            {
                if (value != _value)
                {
                    if (value > 1) value = 1;
                    if (value < 0) value = 0;
                    _value = value;
                    _knobRect.X = (int)(_value * (this.Width - _knobRect.Width));
                    this.Invalidate();
 
                    if (ValueChanged != null)
                        ValueChanged(this, EventArgs.Empty);
                }
            }
        }
 
        [Category("Behavior")]
        [DefaultValue(0)]
        [Description("Determines the range in percentage to snap at the specified locking points")]
        public int SmartLockAmount { get; set; }
 
        [Category("Behavior")]
        [DefaultValue(SmartLocking.None)]
        [Description("Determines the snapping behavior of the tracker")]
        public SmartLocking SmartLockingFlags { get; set; }
 
        [Category("Behavior")]
        [DefaultValue(false)]
        [Description("Determines whether to allow the user to set the knob's position by clicking anywhere on the control")]
        public bool AllowQuickTracking { get; set; }
 
        [Category("Appearance")]
        [DefaultValue(false)]
        [Description("Determines whether to use the hand cursor when the mouse is over the knob")]
        public bool UseHandCursorForKnob { get; set; }
 
        [Category("Behavior")]
        [DefaultValue(true)]
        [Description("Determines whether to retain percent value when resizing")]
        public bool RetainPercent { get; set; }
 
        [Category("Behavior")]
        [DefaultValue(true)]
        [Description("When true, allows the user to slider the knob using 0-9 and -+")]
        public bool AllowKeyNavigation { get; set; }
        #endregion
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.07.2018, 12:04
Ответы с готовыми решениями:

Свойства пользовательского элемента управления
Сделал я пользовательский элемент управления. В нем есть строка: public string str { get { return str; } ...

Отловить событие пользовательского элемента управления
вопрос состоит в следующем как реализовать обновление данных в окне текст бокса если у меня обновилось какое нибудь свойство компонента,...

Доступ к свойствам пользовательского элемента управления
Создал пользовательский элемент управления.Нарисовал на нём круг и линию с помощью Visual Basic PowerPacks. Как осуществить доступ к нему...

2
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
16.07.2018, 22:00
Добавляешь файл с кодом контрола, собираешь проект, после этого этот контрол должен появится в дизайнере форм
0
0 / 0 / 0
Регистрация: 10.07.2018
Сообщений: 11
17.07.2018, 15:50  [ТС]
SeIZVeIZ, если верно понял: ПКМ в обозреватели решений - добавить - существующий объект - выбираю этот файл. Затем меняю пространство имен в файле с контролом на то, что в проекте. Затем Сборка - Собрать решение. Эффекта 0... Пересобирал - не помогает. Что-то не так делаю?

Добавлено через 17 часов 38 минут
Все, разобрался, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.07.2018, 15:50
Помогаю со студенческими работами здесь

Взаимодействие пользовательского элемента управления и формы
Здравствуйте, формучане. Эксперементировал с пользоватльскими элементами и возникли два вопроса: 1. Создал пользовательский элемент на...

Глубокое копирование пользовательского элемента управления
Здравствуйте! Ну вопрос практически описан в шапке. Есть пользовательский контрол. Надо сделать его глубокую копию. Поскольку это...

Проблема с запуском кода пользовательского элемента управления
Поясните, почему не запускается этот код ? Что надо ещё дописать, чтобы он работал ? То есть я именно этот код и вставляю в visual studio. ...

Ошибка при создании пользовательского элемента управления
Я создал пользовательский элемент управления &quot;UserControl1&quot;, в него добавил label и назвал его txt. Вот его код. public partial...

Вопрос о подключении библиотеки с реализацией пользовательского элемента управления
При подключении (через Reference) библиотеки, элемент не отображается на ToolBox, при этом при описании класса контрола в самой главное...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru