Перейти до вмісту

робота з гілками дерева TreeView в visual c++ (api)


Повідомлень в темі: 11

#1 te_morituri

    Ледар

  • Користувачі
  • PipPip
  • 14 повідомлень

Відправлено 12.10.2009 – 22:32

  • 11
допоможіть! не можу витянути імя з виділеної вітки. інформації достатньо, а зліпити все в одну кучу не можу: нада використати наступні повідомлення, і прапори-

SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_CARET, NULL);
SendMessage(hTreeView, TVM_GETITEM, NULL, (LPARAM)&HItem);

HItem.mask=TVIF_HANDLE|TVIF_TEXT;

що робить? хтось підскаже? на перед дякую)

Повідомлення відредагував phobos: 15.10.2009 – 07:37
вітки - гілки, наче так


#2 kavalera

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1258 повідомлень
  • Стать:Чоловік

Відправлено 13.10.2009 – 05:03

Перегляд дописуte_morituri (12.10.2009 23:32) писав:

допоможіть! не можу витянути імя з виділеної вітки. інформації достатньо, а зліпити все в одну кучу не можу: нада використати наступні повідомлення, і прапори-

SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_CARET, NULL);
SendMessage(hTreeView, TVM_GETITEM, NULL, (LPARAM)&HItem);

HItem.mask=TVIF_HANDLE|TVIF_TEXT;

що робить? хтось підскаже? на перед дякую)
#define	MAXLEN	0xFE		// це максимальна довжина рядка, маєте самі визначити її по потребі.

//		*******		*******		*******

	HTREEITEM hItem,hitem;

	hitem=(HTREEITEM)SendMessage(hWnd,TVM_GETNEXTITEM,TVGN_ROOT,0);
	if(hitem)hItem=(HTREEITEM)SendMessage(hWnd,TVM_GETNEXTITEM,TVGN_CARET,(LPARAM)hitem);

	if(hItem){

		char szBuffer[MAXLEN+1];
		TV_ITEM item;

		item.hItem=hItem;
		item.mask=TVIF_TEXT;
		item.pszText=szBuffer;
		item.cchTextMax=MAXLEN;

		SendMessage(hWnd,TVM_GETITEM,0,(LPARAM)&item); 			// В разі успіху ім*я буде в буфері szBuffer 
	}

//		*******		*******		*******

  • 0

#3 te_morituri

    Ледар

  • Користувачі
  • PipPip
  • 14 повідомлень

Відправлено 13.10.2009 – 17:56

:) спс, те що потрібно)) все паше.
мож ще підскажете таку річ: цей програм код хочу кинути на подію вибору вітки. Знайшов інформацію що при виборі вітки посилаєть повідомлення TVM_SELECTITEM, но при:
switch(Message)
{

case TVM_SELECTITEM:

// функції...

return 0;
тупо всі функції не працюють в цьому розділі((

може я не ту подію обрав, чи не вірно використовую. Звичайно можна програм код кинути і на кнопку, але це не прикольно, а от коли обираєш вітку і він виконуєтьсчя це вже інша справа :rolleyes:
  • 0

#4 te_morituri

    Ледар

  • Користувачі
  • PipPip
  • 14 повідомлень

Відправлено 13.10.2009 – 23:43

до речі, все виконується добре:

hitem=(HTREEITEM)SendMessage(hTreeChild,TVM_GETNEXTITEM,TVGN_ROOT,0);
if(hitem)hItem=(HTREEITEM)SendMessage(hTreeChild,TVM_GETNEXTITEM,TVGN_CARET,(LPA
RAM)hitem);

if(hItem){


TV_ITEM item;

item.hItem=hItem;
item.mask=TVIF_TEXT;
item.pszText=szBuffer;
item.cchTextMax=MAXLEN;

SendMessage(hTreeChild,TVM_GETITEM,0,(LPARAM)&item);
/*********************/


MessageBox(NULL, szBuffer,"Eroor", MB_OK);//повідомлення із назвою вітки

// Add the items

if(ERROR_SUCCESS==RegQueryInfoKey((HKEY) szBuffer,//але зворотньо імя перетворити в HKEY і використати в подальшому не можу(( функція сприймає параметр, але не бачить такиго ключа
  • 0

#5 kavalera

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1258 повідомлень
  • Стать:Чоловік

Відправлено 14.10.2009 – 00:17

Перегляд дописуte_morituri (14.10.2009 00:43) писав:

до речі, все виконується добре:

hitem=(HTREEITEM)SendMessage(hTreeChild,TVM_GETNEXTITEM,TVGN_ROOT,0);
if(hitem)hItem=(HTREEITEM)SendMessage(hTreeChild,TVM_GETNEXTITEM,TVGN_CARET,(LPA
RAM)hitem);

if(hItem){


TV_ITEM item;

item.hItem=hItem;
item.mask=TVIF_TEXT;
item.pszText=szBuffer;
item.cchTextMax=MAXLEN;

SendMessage(hTreeChild,TVM_GETITEM,0,(LPARAM)&item);
/*********************/


MessageBox(NULL, szBuffer,"Eroor", MB_OK);//повідомлення із назвою вітки

// Add the items

if(ERROR_SUCCESS==RegQueryInfoKey((HKEY) szBuffer,//але зворотньо імя перетворити в HKEY і використати в подальшому не можу(( функція сприймає параметр, але не бачить такиго ключа
Пане, з вашого запису взагалі важко щось зрозуміти... Наскільки я розумію першим аргументом функції RegQueryInfoKey має бути дескриптор (гендл HKEY) на відкритий ключ реєстра. Причому тут szBuffer? Взагалі, раджу вам сходити сюди, і уважно почитати. З ваших питань, і уривкових кусків коду вам навряд хтось щось зможе порадити.
  • 0

#6 te_morituri

    Ледар

  • Користувачі
  • PipPip
  • 14 повідомлень

Відправлено 14.10.2009 – 18:31

дякую за зауваження. тей сайт хороший, я його "облазив" багато разів. Поясню спочатку, може в цьму проблема (так воно і є)

наступний програм код мені дали тут:

hitem=(HTREEITEM)SendMessage(hTreeChild,TVM_GETNEXTITEM,TVGN_ROOT,0); //получает хэндл самого пеpвого из коpневых элементов tree view (реєстра)
if(hitem)hItem=(HTREEITEM)SendMessage(hTreeChild,TVM_GETNEXTITEM,TVGN_CARET,(LPA
RAM)hitem);//отримуємо дискриптор виділеної вітки реєстра

if(hItem){
TV_ITEM item;
item.hItem=hItem;
item.mask=TVIF_TEXT;//задаєм маску для вибору інформації з вітки
item.pszText=szBuffer;// в szBuffer заноситься імя вітки реєстра, яке є її HKEY ( szBuffer=(char*) HKEY ) у мене в програмі вітки це ключі
item.cchTextMax=MAXLEN;

SendMessage(hTreeChild,TVM_GETITEM,0,(LPARAM)&item);//дістає з виділено вітки її імя

Тепер маючи імя вітки, я хочу використати в ф RegQueryInfoKey.
RegQueryInfoKey(
(HKEY)szBuffer, cClass, &dwSize, NULL, &dwSubKeys, &dwMaxLength, &dwMaxClass, &dwValues, &dwMaxValue, &dwMaxData, &dwSec, &ftFileTime))

але так воно не працює((. чому воно повинно апрацювати ВИ запитаєте, ось прикла програми який в мене працює:
//від першого елемента відки до останнюго
for(j = 0; j<(int)dwSubKeys; j++)
{
RegEnumKey(Zzz, (int) j, cClassName, dwClassNameSize);//читаємо і-тий підлюч, ключа (HKEY) Zzz, і присвоюємо його cClassName(char cClassName[80]="":happy1:

FillSubBranch( (HKEY) cClassName/*вітка 2-го порядку*/, (char*) cClassName/*имя вытка 2-го порядку*/, hTreeWnd, hNewParentItem);
}
//FillSubBranch це власна функція яка виконує ф RegQueryInfoKey над cClassName!!! яка раніше була char, а перетворили примусово у HKEY. і вона працює.

чому з szBuffer це не проходить.

P.S. сьогодні подумав, може краще мені із вітки брати не імя, а зразу HKEY? і використовувати його в функціях без ніякого перетворення. Задача - як вибрати із вітки її HKEY?
  • 0

#7 te_morituri

    Ледар

  • Користувачі
  • PipPip
  • 14 повідомлень

Відправлено 14.10.2009 – 22:21

всі вище задані питання я вирішив. Залишилося одне: як описати подію вибору вітки.
TVM_SELECTITEM-ця смс посилається при виборі вітки, як правильно оформити?
  • 0

#8 kavalera

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1258 повідомлень
  • Стать:Чоловік

Відправлено 14.10.2009 – 23:53

Перегляд дописуte_morituri (14.10.2009 23:21) писав:

всі вище задані питання я вирішив. Залишилося одне: як описати подію вибору вітки.
TVM_SELECTITEM-ця смс посилається при виборі вітки, як правильно оформити?
ну як? як і якесь інше повідомлення.
case TVM_SELECTITEM:
//шось робите
break;

Якщо це не працює, значить ви помилились в чомусь іншому, адже абсолютно не видно, що у вас там.
  • 0

#9 kavalera

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1258 повідомлень
  • Стать:Чоловік

Відправлено 15.10.2009 – 04:30

Перегляд дописуte_morituri (14.10.2009 19:31) писав:

P.S. сьогодні подумав, може краще мені із вітки брати не імя, а зразу HKEY? і використовувати його в функціях без ніякого перетворення. Задача - як вибрати із вітки її HKEY?
Я не розумію, як ви там з ім*я робите дескриптор, і як воно ще й получається. :happy1: Ось, спробуйте так:
Нехай ваш ключ зветься Smth, і лежить в HKLM\SOFTWARE.

	HKEY hKey;

	RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("Software\\Smth"),0,KEY_QUERY_VALUE,&hKey);
В разі, якщо ця функція поверне ERROR_SUCCESS (перевірте!), викликайте RegQueryInfoKey, і
передавайте їй hKey. Може тоді і з TVM_SELECTITEM вийде.
  • 0

#10 te_morituri

    Ледар

  • Користувачі
  • PipPip
  • 14 повідомлень

Відправлено 16.10.2009 – 15:49

Цитата

ну як? як і якесь інше повідомлення.
case TVM_SELECTITEM:
//шось робите
break;

Якщо це не працює, значить ви помилились в чомусь іншому, адже абсолютно не видно, що у вас там.

проблема в тому що події відбуваються в дочірньому вікні, я спробував описати ці події так
LRESULT CALLBACK RRegistryWndProc(HWND hTreeChild/*дискриптор  дочірнього  вікна*/, UINT Message, UINT wParam, LONG lParam)
{
	
	
	switch(Message)
	{

case TVM_SELECTITEM:
//шось робите
	MessageBox(NULL,"klick","АААА",MB_OK);
return 0;


case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hTreeChild,Message,wParam,lParam);
}


але результату нуль. На даний час шукаю потрібну літературу.
підскажіть як правильно?
  • 0

#11 te_morituri

    Ледар

  • Користувачі
  • PipPip
  • 14 повідомлень

Відправлено 17.10.2009 – 14:11

Перегляд дописуte_morituri (16.10.2009 16:49) писав:

підскажіть як правильно?

називається з огня да в полум*я((

вирішив я проблему шляхом сабкласінга.
WNDPROC TreeWndProc;//огласить это в глобал

/**обработка сообщений с дерева**/
LRESULT APIENTRY EditSubclassProc(HWND hTreeChild,
								  UINT Message, 
								  UINT wParam, 
								  LONG lParam)
{
	
	switch (Message)
		{

			case WM_LBUTTONDOWN :

		//	MessageBox(NULL,"klick","АААА",MB_OK);
			return 0;
			case WM_DESTROY:
			PostQuitMessage(0);
			 return 0;
		}
return CallWindowProc(TreeWndProc, hTreeChild, Message, 
		wParam, lParam); 

}


LRESULT CALLBACK RegistryWndProc (HWND hWnd,UINT Message, UINT wParam, LONG lParam)
{
static HWND hTreeChild/*дерево*/;

switch (Message)
  {

  case WM_CREATE:
	  hTreeChild=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",WS_VISIBLE|WS_CHILD|		WS_BORDER,0,0,100.100,100.100,hWnd,	   NULL,hInst,NULL);
	  SetWindowLong( hTreeChild,GWL_WNDPROC,LONG(RegistryWndProc));

але я замінив стандартні події цього класу( і тепер вітки не виділяються, не відкриваються по одному кліку.
підскажіть як доповнити а не замінити стандартні події?
P.S. зараз хочу спробувати DispatchMessage для події кліка. може вийде
  • 0

#12 te_morituri

    Ледар

  • Користувачі
  • PipPip
  • 14 повідомлень

Відправлено 17.10.2009 – 17:11

проблема вирішена- потрібно смінити подію на WM_LBUTTONDBLCLK і все паше :)

---------------------------------
довольний шо слон
  • 0



Кількість користувачів, що читають цю тему: 1

0 користувачів, 1 гостей, 0 анонімних


Магазин кубиков Рубика Cubes.in.ua