ListBox

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8563
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

Циник писал(а):Тут нужно сперва уяснить тебе, что за свои пределы родительский контрол никого не выпускает, по определению.
комбобокс тоже не выпускает? :twisted:
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Папа Карло,
Не отвлекайся на флейм. Уже давно пора работать. Солнце высоко. К станку (клавиатуре), товарищ, к станку. Не слушай Циника. Это он специально делает, чтоб тебя затормозить. Не удивлюсь, что он твой конкурент. Тогда всё понятно.

Ты совершенно на правильном пути. Отношение парент-чилд в твоём случае никакого отношения не имеет к отношению экстентов окон (контрол - тож оконный объект). Вернее имеет, если ты сам определишь клиентский ректангл контола, на который нажимаешь, и затем сделаешь MoveWindow или SetWindowPos для листбокса в зависимости от ректангла. Щас попытаюсь найти что-нить похожее на С++.
Аватара пользователя
Циник
Завсегдатай
Сообщения: 442
Зарегистрирован: 17 фев 2003, 17:17

Сообщение Циник »

папа Карло писал(а):
Циник писал(а):Тут нужно сперва уяснить тебе, что за свои пределы родительский контрол никого не выпускает, по определению.
комбобокс тоже не выпускает? :twisted:
Tы будешь смеяться, товарищ, но тоже не выпускает.
Для выпадающего окна комбобокса сам комбобокс не является родителем. Не путай житейское значение этого слова и винайпишное :twisted:

Вот, специально для тебя нашел в загашниках - Вильям Гейтс III уже куда-то эту статью спрятал. По-моему, достаточно коротко, ясно и прямо в глаз :twisted:

(см. выделенные жирным шрифтом примеры ниже)
INFO: Window Owners and Parents
ID: Q84190



--------------------------------------------------------------------------------
The information in this article applies to:

Microsoft Windows Software Development Kit (SDK)
Microsoft Win32 Software Development Kit (SDK)
Microsoft Windows 2000

--------------------------------------------------------------------------------


SUMMARY
In the Windows environment, two relationships that can exist between windows are the owner-owned relationship and the parent-child relationship.

The owner-owned relationship determines which other windows are automatically destroyed when a window is destroyed. When window A is destroyed, Windows automatically destroys all of the windows owned by A.

The parent-child relationship determines where a window can be drawn on the screen. A child window (that is, a window with a parent) is confined to its parent window's client area.

This article discusses these relationships and some Windows functions that provide owner and parent information for a given window.



MORE INFORMATION
Although WS_OVERLAPPED windows don't typically have owners, they can. Please see Kyle Marsh's MSDN article "Win32 Window Hierarchy and Styles," which says:

Overlapped windows may own other top-level windows or be owned by other top-level windows or both.
Alternatively, the desktop window can be considered the owner and parent of a WS_OVERLAPPED-style window. A WS_OVERLAPPED-style window can be drawn anywhere on the screen and Windows will destroy any existing WS_OVERLAPPED-style windows when it shuts down.

A window created with the WS_POPUP style does not have a parent by default; a WS_POPUP-style window can be drawn anywhere on the screen. A WS_POPUP-style window will have a parent only if it is given one explicitly through a call to the SetParent function.

The owner of a WS_POPUP-style window is set according to the hWndParent parameter specified in the call to CreateWindow that created the pop-up window. If hWndParent specifies a nonchild window, the hWndParent window becomes the owner of the new pop-up window. Otherwise, the first nonchild ancestor of hWndParent becomes the owner of the new pop-up window. When the owner window is destroyed, Windows automatically destroys the pop up. Note that modal dialog boxes work slightly differently. If hWndParent is a child window, then the owner window is the first nonchild ancestor that does not have an owner (its top-level ancestor).

A window created with the WS_CHILD style does not have an explicit owner; it is implicitly owned by its parent. A child window's parent is the window specified as the hWndParent parameter in the call to CreateWindow that created the child. A child window can be drawn only within its parent's client area, and is destroyed along with its parent.

An application can change a window's parent by calling the SetParent function after the window is created. Windows does not provide a method to change a window's owner.

Windows provides three functions that can be used to find a window's owner or parent:
GetWindow(hWnd, GW_OWNER)


GetParent(hWnd)


GetWindowWord(hWnd, GWW_HWNDPARENT)


GetWindow(hWnd, GW_OWNER) always returns a window's owner. For child windows, this function call returns NULL. Because the parent of the child window behaves similar to its owner, Windows does not maintain owner information for child windows.

The return value from the GetParent function is more confusing. GetParent returns zero for overlapped windows (windows with neither the WS_CHILD nor the WS_POPUP style). For windows with the WS_CHILD style, GetParent returns the parent window. For windows with the WS_POPUP style, GetParent returns the owner window.

GetWindowWord(hWnd, GWW_HWNDPARENT) returns the window's parent, if it has one; otherwise, it returns the window's owner.

Two examples of how Windows uses different windows for the parent and the owner to good effect are the list boxes in drop-down combo boxes and the title windows for iconic MDI (multiple document interface) child windows.

Due to its size, the list box component of a drop-down combo box may need to extend beyond the client area of the combo box's parent window. Windows creates the list box as a child of the desktop window (hWndParent is NULL); therefore, the list box will be clipped only by the size of the screen. The list box is owned by the first nonchild ancestor of the combo box. When that ancestor is destroyed, the list box is automatically destroyed as well.

When an MDI child window is minimized, Windows creates two windows: an icon and the icon title. The parent of the icon title window is set to the MDI client window, which confines the icon title to the MDI client area. The owner of the icon title is set to the MDI child window. Therefore, the icon title is automatically destroyed with the MDI child window.
Последний раз редактировалось Циник 15 сен 2003, 23:09, всего редактировалось 2 раза.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Для начала посмотри как скрещивают контролы, например, это

http://www.sources.ru/cpp/cpp_file_edit_ctrl.shtml
Аватара пользователя
Циник
Завсегдатай
Сообщения: 442
Зарегистрирован: 17 фев 2003, 17:17

Сообщение Циник »

vg писал(а):Ты совершенно на правильном пути.
В чем это выражается, товарищ ВГ? В том ли, что товарищ Карло пока не знает почти ничего о наших окнах?
vg писал(а):Отношение парент-чилд в твоём случае никакого отношения не имеет к отношению экстентов окон (контрол - тож оконный объект). Вернее имеет, если ты сам определишь клиентский ректангл контола, на который нажимаешь, и затем сделаешь MoveWindow или SetWindowPos для листбокса в зависимости от ректангла. Щас попытаюсь найти что-нить похожее на С++.
Знаешь, я бы тебе, товарищ, всерьез посоветовал учиться четко выражать свои мысли. Чувствуется, что знаешь предмет, и программу напишешь, а вот объяснить как следует не можешь. На интервью тебе будет с таким языком тяжело. Даже если б оно проходило по-русски :twisted:
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Не понял, а что я "не так" сказал?
Если я буду выражаться строго соблюдая терминологию, принятую в винапи или мфц, называя хендл окна хендлом, или указатель на CWnd-объектом - указателем, то ему это что поможет?

Впрочем, я сейчас засел за шарп. Пытаюсь разобраться, как там что работает. Пока такое осчусчение, что у мелкософта поехала крыша.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Да, Циник, забыл сказать. Никого ни о чём не прошу на этом форуме, но тебя попрошу, т.к. ты циничный Циник.

Меня всерьёз волнует вопросы, связанные с интервью, так что если поможешь здесь с "разбором полётов", буду благодарен. Папа Карло врядли разрешит ЭТО в данном топике (офтопик), но можешь кинуть критику в приват. Если не затруднит, конечно.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

папа Карло писал(а):
Циник писал(а):Тут нужно сперва уяснить тебе, что за свои пределы родительский контрол никого не выпускает, по определению.
комбобокс тоже не выпускает? :twisted:
насколько я помню, выпадающая часть комбобокса в части микрософтовских продуктов
(офис, iexplorer, etc) имеет своим парентом desktop, а не комбобокс. 2c for thoughts
Аватара пользователя
Циник
Завсегдатай
Сообщения: 442
Зарегистрирован: 17 фев 2003, 17:17

Сообщение Циник »

drain bamage писал(а):насколько я помню, выпадающая часть комбобокса в части микрософтовских продуктов
(офис, iexplorer, etc) имеет своим парентом desktop, а не комбобокс. 2c for thoughts
Ты практически верно помнишь, товарищ. Именно это я напоминал товарищу Карло чуть выше, цитатой из Микрософта, даже раскрасил для наглядности.
Кстати, статейка таки естьу них на сайте, никуда не делась.
Аватара пользователя
Циник
Завсегдатай
Сообщения: 442
Зарегистрирован: 17 фев 2003, 17:17

Сообщение Циник »

vg писал(а):Да, Циник, забыл сказать. Никого ни о чём не прошу на этом форуме
Ты это, товарищ, с этой рахметовщиной завязывай давай :twisted:
Не забывай, что ты уже большой и вообще без пяти минут эмигрант.
Просить о чем-то и тем более спрашивать - это вовсе не есть признак слабости.
но тебя попрошу, т.к. ты циничный Циник.
Вот оно как :twisted:
Обращайся, товарищ, конечно. Обещать наверняка ничего не обещаю, ключа от квартиры не дам точно, но есть шансы, что рассмотрю в конструктивном ключе :twisted:
Да и других опытных товарищей здесь немало. Ты главное, не приобрети вкус к шашечкам, а ехать тебе всегда помогут :twisted:
Меня всерьёз волнует вопросы, связанные с интервью, так что если поможешь здесь с "разбором полётов", буду благодарен. Папа Карло врядли разрешит ЭТО в данном топике (офтопик), но можешь кинуть критику в приват. Если не затруднит, конечно.
Кинуть не проблема, товарищ, но вот что кидать-то? Критику чего? :twisted:
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Папа Карло.
Я засел было за шарп. По началу – волосы дыбом. Но потом вроде и свыкся. Вот код, где видно, как можно скрестить контролы, т.е. твой контрол и листбокс. Сразу говорю, что программирую я в шарпе ровно 4 часа (вчера час и сегодня три). Поэтому, конечно, всё это может и не так, как надо делать в #. Хотя ошибок (синтаксических) нет. Я проверял. Это врезки из файлов работающего проекта. Кроме того, я не исключаю, что тебе надобно вообще нечто другое. Тогда можно попробовать ещё раз. Это набросок - как можно сделать. Если тебя это устроит, то там тебе останется в этом же «шаблоне» добавить обработку OnMouseMove (чтобы листбокс скрывался, когда мышь «покидает» клиентскую облать листбокса), собственно выбор элемента списка, обработку нажатий на клаву (управлять контролами нужно уметь и при помощи клавы, а не только мыши) и др.

В целом идея такова. Создаём свой класс, который наследует от кнопки (Button). Кнопка здесь выбрана для простоты. Класс имеет мембер-указатель на объект класса ListBox. На форме вначале в «дизайнере» рисуется обычный Button, а затем в классе формы изменяется класс этого контрола с Button на CMyBtn. Надеюсь, ниже всё и так будет понятно.

Код: Выделить всё

// file Form.cs
…
namespace WindowsApplication1
{
	public class Form1 : System.Windows.Forms.Form
	{
		CMyBtn button1;
		…
		public Form1()
		{
			InitializeComponent();

		}
		private void InitializeComponent()
		{
			this.button1 = new WindowsApplication1.CMyBtn();
			…
			this.button1.Add("123"); // добавляем элементы листбокса
			this.button1.Add("123");
			this.button1.Add("123");
			…

		}
			…
			…

	}
}
// end cut of file Form.cs


В файлике CMyBtn.cs собственно «комбоконтрол», в данном случае результат скрещивания кнопки с листбоксом. Кнопка выбрана для простоты

Код: Выделить всё

// file CMyBtn.cs

namespace WindowsApplication1
{
	public class CMyBtn : Button
	{
		private ListBox _list;
		public CMyBtn()
		{
			_list = new ListBox();
			RecalcListLayout();
			_list.Hide();
			
			///////////////////////////////////////////////////////////////
			// events hanlers
			// Здесь же добавь другие обработчики
			Click			+= new System.EventHandler(this.btn_Click);
			ParentChanged	+= new System.EventHandler(this.OnParentChanged);
			Move			+= new System.EventHandler(this.OnMove_Resize);
			Resize			+= new System.EventHandler(this.OnMove_Resize);
			
		}
		
		private void RecalcListLayout()
		{
			_list.Location = new Point(this.Left, this.Top + this.Height + 1);
		}

		public void SetListWidth(int nWidth)			
		{
			_list.Width = nWidth;
		}
		public void Clear()			
		{
			_list.Items.Clear();
		}
		public void Add(object item)
		{
			_list.Items.Add(item);
		}

		// Overrides 
		//
		//protected override void OnMouseDown(MouseEventArgs e) 
		//{
		//	Можешь использовать оверайдм вместо Click обработчиков
		// 	Дело вкуса. Работает и так, и так.
		//}

		// Event handlers
		private void btn_Click(object sender, System.EventArgs e)
		{
			_list.Show();
			// Тебе здесь надо написать, возмлжно, что-то умное
		}
		private void OnParentChanged(object sender, System.EventArgs e)
		{
			_list.Parent = Parent;
			RecalcListLayout();
		}
		private void OnMove_Resize(object sender, System.EventArgs e)
		{
			RecalcListLayout();
		}
	}
}

// end of cut CMyBth.cs
PS. папа Карло,ты, наверное, всё это и сам давно знаешь.
Мой пост в том, что если копать, то мож в таком разрезе?
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Циник,
Да и других опытных товарищей здесь немало. Ты главное, не приобрети вкус к шашечкам, а ехать тебе всегда помогут
Что имеется в виду под "шашечками"? Синофант, что ли?
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8563
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

вроде разобрался. всем спасибо. :)
Ответить