Member 13610960 Ответов: 2

Две проблемы стыковки cmfctoolbars в VS2010


Здравствуйте, я буду признателен, если кто-то поможет мне диагностировать следующую проблему: прямо сейчас я пытаюсь поместить две CMFCToolBars в приложение vs2010 SDI. Но сейчас у них проблемы с выравниванием. Первая панель инструментов красиво ложится под меню, но вторая, кажется, всегда летает вокруг. В большинстве случаев он появляется вертикально прикрепленным к левому краю клиентской области... Я играл в эту игру весь день напролет и должен спросить Здесь кое-какие идеи. Я считаю, что это интересный вопрос, поскольку я заметил, что у некоторых людей были эти проблемы, но были только некоторые вероятные решения для VS6...

Спасибо.

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1, 1, 1, 1), IDR_MAINFRAME_256 ) ||
		!m_wndToolBar.LoadToolBar( IDR_MAINFRAME_256 ))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}


	m_wndToolBar.SetWindowText(_T("test1"));
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

	//DockControlBar((CControlBar *)&m_wndToolBar,AFX_IDW_DOCKBAR_LEFT, &rect);

	if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1, 1, 1, 1), IDR_SORT )||
		!m_wndToolBar1.LoadToolBar(IDR_SORT))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}


	m_wndToolBar1.SetWindowText(_T("test"));
	m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockPane(&m_wndToolBar);
	DockPane(&m_wndToolBar1);


Что я уже пробовал:

две проблемы стыковки CMFCToolBars в VS2010

2 Ответов

Рейтинг:
1

Member 13610960

Спасибо, Рик, я попробовал эту функцию. Мне кажется, что я должен принудительно преобразовать CMFCToolBar* в CControlBar*, как определено для параметров. Это приводит к сбою, когда программа вызывает DockControlBarLeftOf(this, m_wndToolBar1, m_wndToolBar). Есть ли какое-нибудь решение для этого?


Rick York

Вы пробовали Докпанелефтоф ? Он принимает указатели на CPane, и именно из этого происходит CMFCToolBar. Эта статья может помочь.

Кроме того, это не должно быть опубликовано в качестве решения. Это должен быть вопрос к моему решению.

Рейтинг:
1

Member 13610960

Привет Рик, я не пробовал DockPaneLeftOf(). Однако я нашел решение, манипулируя несколькими параметрами идентификатора при создании панели инструментов в CreateEX(). Что я сделал, так это использовал IDR_TOOLBAR1|AFX_IDW_TOOLBAR, заменив Соло ID IDR_TOOLBAR1. Я предполагаю, что VS2010 принимает это как указание на то, что вторая CMFCToolBar ( m_toolbar1) является еще одной "простой" панелью инструментов, и помещает ее в другую строку слева...


Спасибо снова.


Rick York

I recommend downloading the FeaturePack samples for VS2010 and looking at the VisualStudioDemo sample app. It uses CMFCToolBars and calls DockPaneLeftOf in the CMainFrame class. What you did seems like a hack to me. In the sample app they use two IDs, one in a call to Create() and a different one in a call to LoadToolBar(). The one in the call to LoadToolBar is the ID of the bitmap resource. The other one (used in the call to Create) is the ID of the toolbar window and it is above the AFX_IDW_TOOLBAR value. That value is used for tool windows that can dock or float or what ever. You should not just OR a number with it to get the ID because that might not be unique and could cause problems.