Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2011, 22:15   #1
Kh_Shad
Пользователь
 
Регистрация: 21.10.2011
Сообщений: 12
По умолчанию Получение указателя на CListCtrl

Проблема такова. Я создал панель на основе класса CPaneDialog которая использует шаблон диалога с добавленными элементами CButton и CListCtrl. Сама панель создается методом CMainFrame::OnCreat, вроде бы все нормально, но после того как я её создал мне надо добраться до элемента CListCtrl, чтобы его настроить, делая как привык через GetDlgItem(), мне почему-то возвращается NULL, а не указатель, хотя с CButton такой проблемы нет.
Кто-нибуть сталкивался с таким?
Kh_Shad вне форума Ответить с цитированием
Старый 21.10.2011, 22:22   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от Kh_Shad Посмотреть сообщение
Я создал панель на основе класса CPaneDialog которая использует шаблон диалога с добавленными элементами CButton и CListCtrl.
круто...
Цитата:
Сообщение от Kh_Shad Посмотреть сообщение
Сама панель создается методом CMainFrame::OnCreat
...но, по-моему наследником CMainFrame может быть только основное окно...
Цитата:
Сообщение от Kh_Shad Посмотреть сообщение
мне надо добраться до элемента CListCtrl
попробуй GetWindow c GWL_CHILD
counter вне форума Ответить с цитированием
Старый 21.10.2011, 22:59   #3
Kh_Shad
Пользователь
 
Регистрация: 21.10.2011
Сообщений: 12
По умолчанию

Немного описка вышла не методом CMainFrame::OnCreat, а в нем c использованием CPaneDialog::Creat.

Последний раз редактировалось Kh_Shad; 21.10.2011 в 23:03.
Kh_Shad вне форума Ответить с цитированием
Старый 21.10.2011, 23:03   #4
Kh_Shad
Пользователь
 
Регистрация: 21.10.2011
Сообщений: 12
По умолчанию

Цитата:
попробуй GetWindow c GWL_CHILD
Нет не то. Дело в том что GetDlgItem() возвращает NULL, из её описание говориться, что в данном случае элемента управления не существует. Блин не пойму что за брет, если создавать элемент не через шаблон а напрямую через CListCtrl::Creat с ним можно работать как угодно. У меня идеи закончились может у кого есть
Kh_Shad вне форума Ответить с цитированием
Старый 21.10.2011, 23:14   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от Kh_Shad Посмотреть сообщение
если создавать элемент не через шаблон а напрямую через CListCtrl::Creat
так это MFC-ый контрол и его нельзя создать в ресурсах, только динамически!
counter вне форума Ответить с цитированием
Старый 21.10.2011, 23:47   #6
Kh_Shad
Пользователь
 
Регистрация: 21.10.2011
Сообщений: 12
По умолчанию

Странно, тогда почему в диалоге можно так сделать?
Kh_Shad вне форума Ответить с цитированием
Старый 21.10.2011, 23:52   #7
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

в каком диалоге?

UPD
оконные классы

Последний раз редактировалось counter; 22.10.2011 в 00:09.
counter вне форума Ответить с цитированием
Старый 22.10.2011, 00:26   #8
Kh_Shad
Пользователь
 
Регистрация: 21.10.2011
Сообщений: 12
По умолчанию

Цитата:
в каком диалоге?
Если создать диалог CDialog на основе шаблона с элементами, то манипуляции с доступом к элементу CListCtrl через GetDlgItem, происходит. А если создать панель CPaneDialog на основе этого же шаблона GetDlgItem возвращает NULL, как будто элемента нет, хотя в шаблоне он есть!?
Kh_Shad вне форума Ответить с цитированием
Старый 22.10.2011, 00:30   #9
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

ничего не понял... код показывай
counter вне форума Ответить с цитированием
Старый 22.10.2011, 01:14   #10
Kh_Shad
Пользователь
 
Регистрация: 21.10.2011
Сообщений: 12
По умолчанию

Посмотри тот момент, где происходит получение указателя на CListCtrl, именно он зараза возвращает NULL. Объявление панели CPaneDialog на основе шаблона с элементом CListCtrl, будет в коде чуть выше.

Код:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
		return -1;

	BOOL bNameValid;
	// установите наглядный диспетчер и стиль на основе постоянного значения
	OnApplicationLook(theApp.m_nAppLook);

	if (!m_wndMenuBar.Create(this))
	{
		TRACE0("Не удалось создать строку меню\n");
		return -1;      // не удалось создать
	}

	m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);

	// предотвращение фокусировки строки меню на активации 
	CMFCPopupMenu::SetForceMenuFocus(FALSE);

	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
	{
		TRACE0("Не удалось создать панель инструментов\n");
		return -1;      // не удалось создать
	}

	CString strToolBarName;
	bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
	ASSERT(bNameValid);
	m_wndToolBar.SetWindowText(strToolBarName);

	CString strCustomize;
	bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
	ASSERT(bNameValid);
	m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);

	// Разрешить операции с пользовательскими панелями инструментов:
	InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);

	if (!m_wndStatusBar.Create(this))
	{
		TRACE0("Не удалось создать строку состояния\n");
		return -1;      // не удалось создать
	}
	m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
	

	if(!m_wndDlgPan.Create(_T("Editor"), this, TRUE, IDD_DIALOGPANEL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |CBRS_BOTTOM, IDD_DIALOGPANEL))
	{
		TRACE0("Не удалось создать диалоговую панель");
		return -1;
	}
	
	// TODO: удалите эти пять строк, если панель инструментов и строка меню не должны быть закрепляемыми
	m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndDlgPan.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockPane(&m_wndMenuBar);
	DockPane(&m_wndToolBar);
	DockPane(&m_wndDlgPan);

	CListCtrl *ptrListInfo = static_cast<CListCtrl *>(GetDlgItem(IDC_LISTINFO));
	CRect ListInfoSize;
	ptrListInfo->GetClientRect(ListInfoSize);
	ptrListInfo->InsertColumn(0,_T("#"), LVCFMT_LEFT, ListInfoSize.Width()/3);
	ptrListInfo->InsertColumn(2,_T("Question"), LVCFMT_LEFT, ListInfoSize.Width()/3);
	
	// включить режим работы закрепляемых окон стилей Visual Studio 2005
	CDockingManager::SetDockingMode(DT_SMART);
	// включить режим работы автоматического скрытия закрепляемых окон стилей Visual Studio 2005
	EnableAutoHidePanes(CBRS_ALIGN_ANY);

	// Включить функцию замены меню панелей инструментов и закрепляемых окон 
	EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);

	// включить быструю (Alt+перетаскивание) настройку панелей инструментов
	CMFCToolBar::EnableQuickCustomization();

	if (CMFCToolBar::GetUserImages() == NULL)
	{
		// загрузить изображения пользовательских панелей инструментов
		if (m_UserImages.Load(_T(".\\UserImages.bmp")))
		{
			CMFCToolBar::SetUserImages(&m_UserImages);
		}
	}
	
	// включить персонализацию меню (последние использованные команды)
	// TODO: определите свои основные команды так, чтобы каждое раскрывающееся меню содержало по крайней мере одну основную команду.
	CList<UINT, UINT> lstBasicCommands;

	lstBasicCommands.AddTail(ID_FILE_NEW);
	lstBasicCommands.AddTail(ID_FILE_OPEN);
	lstBasicCommands.AddTail(ID_FILE_SAVE);
	lstBasicCommands.AddTail(ID_FILE_PRINT);
	lstBasicCommands.AddTail(ID_APP_EXIT);
	lstBasicCommands.AddTail(ID_EDIT_CUT);
	lstBasicCommands.AddTail(ID_EDIT_PASTE);
	lstBasicCommands.AddTail(ID_EDIT_UNDO);
	lstBasicCommands.AddTail(ID_APP_ABOUT);
	lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR);
	lstBasicCommands.AddTail(ID_VIEW_TOOLBAR);
	lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003);
	lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005);
	lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE);
	lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER);
	lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK);
	lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA);
	lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7);

	CMFCToolBar::SetBasicCommands(lstBasicCommands);

	return 0;
}
Kh_Shad вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересное поведение CListCtrl::InsertItem() metoflex Visual C++ 2 27.07.2011 11:19
Копирование указателя С++ Alex1991 Помощь студентам 2 24.04.2011 04:00
Массив с использование указателя Seferus Общие вопросы C/C++ 1 02.11.2010 19:54
Глюк с CommonControl CListCtrl в висте volok-aleksej Общие вопросы C/C++ 0 07.07.2009 18:20