информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Сетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
 С наступающим 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Сдается мне, что надо для верхнего - убрать флаг cbrs_align_bottom 24.01.08 20:23  Число просмотров: 2804
Автор: Neznaika <Alex> Статус: Member
<"чистая" ссылка>
<programming>
[MFC] Затруднение с сохранением тулбаров (docking'а) 24.01.08 17:21  
Автор: Heller <Heller> Статус: Elderman
Отредактировано 24.01.08 17:24  Количество правок: 1
<"чистая" ссылка>
BOOL CMainFrame::InitObjects() {
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
		CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED, CRect(0, 0, 0, 0)/*, IDC_MISC*/)|!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) {
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}
	// TODO: Remove this if you don't want tool tips or a resizeable toolbar
	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED | CBRS_FLOAT_MULTI);

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
	EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
	DockControlBar(&m_wndToolBar, AFX_IDW_DOCKBAR_TOP);
	m_wndToolBar.SetButtonStyle (m_wndToolBar.CommandToIndex(IDM_FILTER), TBBS_CHECKBOX);
	m_wndToolBar.GetToolBarCtrl().CheckButton(m_wndToolBar.CommandToIndex(IDM_FILTER), FALSE);
	VERIFY(m_pToolBar->SubclassWindow(m_wndToolBar.m_hWnd));*/
	m_pCBClient = new CTrueCB;
	CRect rc, rc1;

	UINT ui = m_wndToolBar.CommandToIndex(ID_CBOX);
	UINT ui1= m_wndToolBar.CommandToIndex(ID_CBOX1);
	m_wndToolBar.GetItemRect(ui, rc);
	m_wndToolBar.GetItemRect(ui1, rc1);
	rc.bottom= rc.top + rc.Height()*16;
	rc.right = rc1.right;
	VERIFY(m_pCBClient->Create(CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_VSCROLL, rc, &m_wndToolBar, ID_CBOX));
	m_pCBClient->EnableWindow(FALSE);
	m_wndToolBar.ShowWindow(SW_SHOW);

//HERE IS NEW CODE
	m_wndTabsBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
		CBRS_TOOLTIPS | CBRS_FLOAT_MULTI | CBRS_FLYBY | CBRS_SIZE_FIXED, CRect(0, 0, 0, 0));
	m_wndTabsBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED | CBRS_FLOAT_MULTI);
	m_wndTabsBar.LoadToolBar(IDS_TABSBAR);
	m_wndTabsBar.EnableDocking(CBRS_ALIGN_BOTTOM);
	DockControlBar(&m_wndTabsBar, AFX_IDW_DOCKBAR_BOTTOM);
	m_wndTabsBar.ShowWindow(SW_SHOW);

	m_wndToolBar.SetWindowText("Панель инструментов");
	m_wndToolBar.SetWindowText("Экраны");
//END OF NEW CODE

	LoadBarState("BarsState");

	return TRUE;
}

---

m_wndToolBar и m_wndTabsBar определены как CToolBar.

До того как добавили новый код с m_wndTabsBar все было хорошо. После добавления нового тулбара началась проблема - верхний тулбар (m_wndToolBar) после загрузки из LoadBarState переносится в низ экрана.

Записи реестра прикладываю. old.reg - это ключи реестра до добавления m_wndTabsBar. new.reg - после добавления. Что написано в реестре я сам не понимаю, но чувствуется, что оба тулбара имеют один идентификатор (0xe800, если это он в реестре). Подскажите пожалуйста что-нибудь.

old.reg
new.reg
Сдается мне, что надо для верхнего - убрать флаг cbrs_align_bottom 24.01.08 20:23  
Автор: Neznaika <Alex> Статус: Member
<"чистая" ссылка>
Проблема разрешилась 25.01.08 19:07  
Автор: Heller <Heller> Статус: Elderman
Отредактировано 25.01.08 19:22  Количество правок: 1
<"чистая" ссылка>
Добавил идентификаторы тулбаров в CreateEx, но с достаточно большой разницей. Разницы в 1-2 было не достаточно (каждый как я понял жрет отдельный идентификатор для каждого из возможных своих docking'ов). В общем, все теперь в норме.

Первоначальный ответ ниже сохраняю для истории - это уже не актуально.

-----------
Не помогает. К тому же дать пользователю право цеплять тулбары куда угодно весьма полезно.

Вообще CreateEx определяется как

BOOL CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle = TBSTYLE_FLAT, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_TOOLBAR);

Есть подозрение, что последний параметр указывает на ID тулбара, который как раз и сохраняется. Пробовал присваивать разные ID'шники тулбарам относительно AFX_IDW_TOOLBAR, но тогда при загрузке прога падает на каком-то из внутренних ASSERT'ов. Я имею ввиду при загрузке настроек. С чистым реестром все грузится нормально, но после закрытия проги и загрузки вновь начинает падать. Где именно что неассертится смогу сказать только в понедельник.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach