Главная » C#, Компоненты » Встроенные компоненты C# примеры

0

Компонент может содержать другие компоненты, но возникает одна проблема— во время разработки такие "встроенные" компоненты не получают никаких сообщений от Windows и, соответственно, не реагируют на мышь и клавиатуру.

Попробуйте пролистать значения в компоненте ListBox (рис. 6.9), который встроен в компонент ListBoxControl (листинг 6.13). Скроллинг попросту не работает, а компонент ListBox ведет себя "как нарисованный".

Рис. 6.9. Компонент ListBox внутри компонента ListBoxControl

Исправить ситуацию помогает специальный дизайнер (точнее сказать, метод wndProcO этого дизайнера), который транслирует сообщения Windows в режиме разработки (листинг 6.14). После подключения дизайнера к компоненту внутренний компонент будет работать как настоящий ListBox, позволяя прокручивать сообщения. Правда, при этом пропадает возможность перемещать компонент и менять его размеры. Еще раз со встроенными компонентами мы встретимся в разд. 7.15, а о возможностях расположения компонентов друг на друге я расскажу в разд. 6.17.

Листинге 13 КомпонентLietBoxControl

using System.;

using System.Collections;

using System.ComponentModel;

using System.ComponentModel.Design;

using System.Drawing;

using System.Drawing.Design;

using System.Data;

using System.Diagnostics;

using System. Windows. Forms;

using System.Security.Permissions;

using System. Windows. Forms. Design;

namespace WindowMessageDesignerExample

{

public class ListBoxControl : UserControl {

private ListBox listBoxl;

public ListBoxControl{) {

InitializeComponent();

}

public override ISite Site {

get {

return base.Site;

}

set {

base.Site = value;

II Заполняем listbox

for (int i = 0; i < 100; i++)

listBoxl.Items.Add(i.ToString());

}

)

// Инициализация компонентов

private void initializeComponent()

{

this.listBoxl = new ListBoxО; this.SuspendLayout();

this.listBoxl.Location – new System.Drawing.Point(8, 8); this.listBoxl.Name = "listBoxl";

this.listBoxl.Size = new System.Drawing.Size(192, 368); this.listBoxl.Tablndex = 0;

this.BackCoior = System.Drawing.Color.Beige; this.Controls.Add(this.listBoxl);

this.Location = new System.Drawing.point (500, 400); this.Name = "ListBoxControl";

this.Size = new System.Drawing.Size(442, 422); this.ResumeLayout(false);

}

}

I

Листинг 6 14 Дизаинср Win                                                      передающий сообщения

в режиме разработки

public class WindowMessageDesigner : ControlDesigner {

public WindowMessageDesigner() {

}

// Обрабатываем Wndproc

protected override void Wndproc(ref Message message)

{

if (message.HWnd -= this.Control.Handle)

base.Wndproc(ref message); else

this.DefWndProc(ref message);

Литература:

Агуров П. В. C#. Разработка компонентов в MS Visual Studio 2005/2008. – СПб.: БХВ-Петербург, 2008. — 480 е.: ил.

По теме:

  • Комментарии