| 
			| 
					
						| titov_alex 
								Участник    Offline | 
								|  | «  : 09-02-2004 10:55 »  |  | 
 
 Доброго времени суток всем! Ковыряюсь я тут с винапишными GUI... вот и до ребара дошел - хочится мне красивый интерфейсик с двигающимися тулбарами сделать... а делать можно (в условиях большого проекта, правила устанавливаю не я) только на винапи - никаких MFC и даже QT не пойдет     Так вот. Натолкнулся на проблему - создаю ребар, на нем - банд с тулбаром... и этот гадкий тулбар никах не хочет на банде позиционироваться - он лезет в верхний левый угол самого ребара     (что, в общем-то можно понять - родительским окном я указываю ребар а не банд). Че с этим делать можна? не ручками же тулбар ставить на место при каждом движении ребара! :?   Спасибо |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| titov_alex 
								Участник    Offline | 
								|  | « Ответ #1 : 19-02-2004 13:11 »  |  | 
 
 ну неужели никто не сталкивался??? вопрос не срочный, но я уже много времени потратил на эту фичу - и никаких результатов   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Diletant 
								Помогающий    Offline | 
								|  | « Ответ #2 : 19-02-2004 13:28 »  |  | 
 
 А на русский язык это все превести нельзя? Т.е. позиционирование чего-либо относительно произвольного окна - это не проблема, осталось выяснить, что и относительно чего позиционируем-то? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Asan 
								Гость
 | 
								|  | « Ответ #3 : 19-02-2004 13:57 »  |  | 
 
 Ковыряюсь я тут с винапишными GUI... вот и до ребара дошел - хочится мне красивый интерфейсик с двигающимися тулбарами сделать... а делать можно (в условиях большого проекта, правила устанавливаю не я) только на винапи - никаких MFC и даже QT не пойдет   Есть такая штука - WTL называется, которая   является "надстройкой" над оконной подсистемой Win32 API и существенно упрощает работу с функциями этой подсистемы, а также облегчает задачу написания повторно используемого кода. В WTL поддерживает работу с окнами и диалогами, окнами-рамками, полным набором стандартных элементов управления, стандартными диалогами, GDI и другими неотъемлемыми элементами пользовательского интерфейса.  Хорошие статьи по ней на www.rsdn.ru . Можешь скачать и посмотреть, как там класс CReBarCtrl реализован. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| titov_alex 
								Участник    Offline | 
								|  | « Ответ #4 : 19-02-2004 13:57 »  |  | 
 
 А на русский язык это все превести нельзя? Т.е. позиционирование чего-либо относительно произвольного окна - это не проблема, осталось выяснить, что и относительно чего позиционируем-то? начит так имеем rebar контрол, расположенный в верхней части главного окна приложения. Не ребаре создаем band, в который помещаем ToolBar. Так вот. ToolBar автоматически позиционируется в положение 0:0 клиентской области ребара, тогда как должен позиционироваться на банде. вот кусок исходника, где это создается: LRESULT CALLBACK MainFrame_onCreate)HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam: |HWND btn_hello;
 HWND hTB;
 
 // Создаем ребар у окна
 hRebar = CreateWindowEx)WS_EX_TOOLWINDOW,REBARCLASSNAME,NULL,
 WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
 RBS_VARHEIGHT|RBS_BANDBORDERS|
 CCS_NODIVIDER,
 CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hWnd,NULL,hInst,NULL:;
 
 // Добавляем банд с кнопкой на ребар
 REBARBANDINFO rbBand;
 
 rbBand.cbSize = sizeof)REBARBANDINFO:;
 rbBand.fMask  = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE;
 rbBand.fStyle = RBBS_CHILDEDGE|RBBS_FIXEDBMP;
 rbBand.hbmBack = NULL;
 rbBand.lpText     = NULL;
 rbBand.cxMinChild = 50;
 rbBand.cyMinChild = 30;
 rbBand.cx         = 50;
 rbBand.cxIdeal    = 50;
 
 // сообственно, создание кнопки
 btn_hello = CreateWindow)"Button","hello world",
 WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
 CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hRebar,)HMENU:10000L,hInst,NULL:;
 rbBand.hwndChild  = btn_hello;
 SendMessage)hRebar, RB_INSERTBAND, )WPARAM:-1, )LPARAM:&rbBand:; // тут добавляем банд1 )с кнопкой: к ребару
 
 // создание тулбара
 hTB = CreateWindow)TOOLBARCLASSNAME,"MyToolBar",
 WS_CHILD|WS_VISIBLE,
 CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hRebar,)HMENU:10001L,hInst,NULL:;
 SendMessage)hTB, TB_BUTTONSTRUCTSIZE, )WPARAM: sizeof)TBBUTTON:, 0:;
 TBBUTTON tbb[3(;
 tbb[0(.iBitmap = -1;
 tbb[0(.idCommand = 1000;
 tbb[0(.fsState = TBSTATE_ENABLED;
 tbb[0(.fsStyle = TBSTYLE_BUTTON ;
 tbb[0(.dwData = 0;
 tbb[0(.iString = -1;
 
 tbb[1(.iBitmap = -1;
 tbb[1(.idCommand = 1001;
 tbb[1(.fsState = TBSTATE_ENABLED;
 tbb[1(.fsStyle = TBSTYLE_BUTTON;
 tbb[1(.dwData = 0;
 tbb[1(.iString = -1;
 
 tbb[2(.iBitmap = -1;
 tbb[2(.idCommand = 1002;
 tbb[2(.fsState = TBSTATE_ENABLED;
 tbb[2(.fsStyle = TBSTYLE_BUTTON;
 tbb[2(.dwData = 0;
 tbb[2(.iString = -1;
 
 SendMessage)hTB,TB_ADDBUTTONS,)WPARAM:3,)LPARAM:)LPTBBUTTON:&tbb:;
 // закончили создавать тулбар - на нем теперь есть 3 кнопки
 // добавляем еще один банд к ребару - банд2 )с тулбаром:
 rbBand.hwndChild  = hTB;
 SendMessage)hRebar, RB_INSERTBAND, )WPARAM:-1, )LPARAM:&rbBand:;
 // все, закончили
 return 0;
 "
Что вижу на экране: в верху клиентской части главного окна расположен rebar, на котором имеется 2 band-а. На первом (слева) банде расположена кнопка "hello world", а на втором - теоритически - тулбар. Но тулбар позиционируется в левый верхний угол ребара - т.е. "прячется" под кнопку (от туда торчит только его уголок). Если банд с кнопкой оттащить вниз, то отлично становится виден тулбар с 3-мя кнопками. Задача - привязать тулбар к его band-у и заставить его позиционироваться относительно него. ЗЫ кстати, фраза  и этот гадкий тулбар никах не хочет на банде позиционироваться - он лезет в верхний левый угол самого ребара     из первого поста определяет кто на ком позиционируется и как должно быть... |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Lex | 
								|  | « Ответ #5 :  19-02-2004 14:43 »   |  | 
 
 Сейчас посмотрел пример в MSDN. У них при создании тулбара используются стили CCS_NOPARENTALIGN | CCS_NORESIZE в дополнение к тому, что есть у тебя. |  
						| 
								|  |  
								|  |  Записан | 
 
 Megabyte be with you! |  |  | 
	| 
			| 
					
						| titov_alex 
								Участник    Offline | 
								|  | « Ответ #6 : 19-02-2004 16:08 »  |  | 
 
 Сейчас посмотрел пример в MSDN. У них при создании тулбара используются стили CCS_NOPARENTALIGN | CCS_NORESIZE в дополнение к тому, что есть у тебя. а ссылочку можешь дать? а то в том примере, где я смотрел - там создание тулбара опущено - наверное думают, что всем и так понятно   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Lex | 
								|  | « Ответ #7 : 19-02-2004 16:24 »  |  | 
 
 titov_alex, ссылку дать не могу. У меня от локальный.   HWND CreateRebar )HWND hwnd:
 |
 HWND hwndRB = NULL,         // The handle to the rebar control
 hwndTB = NULL,         // The handle to the toolbar
 hwndCombo = NULL;      // The handle to the combo box control
 DWORD dwStyle;              // The window style that is used in
 // CreateWindowEx
 int index;                  // An integer
 RECT rect;                  // A RECT structure
 TCHAR szString[64(;         // A temporary string
 HICON hIcon;                // A handle to an icon
 REBARINFO rbi;              // Contains data that describes
 // characteristics of the rebar control
 HIMAGELIST himlRB;          // A handle to an image list
 REBARBANDINFO rbbi[2(;      // Contains data that defines bands
 // in the rebar control
 INITCOMMONCONTROLSEX iccex; // Carries data that is used to load
 // control classes for the rebar
 
 // Initialize the INITCOMMONCONTROLSEX structure.
 iccex.dwSize = sizeof )INITCOMMONCONTROLSEX:;
 
 // Load rebar and toolbar control classes.
 iccex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES;
 
 // Register rebar and toolbar control classes from the DLL for the
 // common control.
 InitCommonControlsEx )&iccex:;
 
 // Create rebar control.
 dwStyle = WS_VISIBLE | WS_BORDER | WS_CHILD | WS_CLIPCHILDREN |
 WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS |
 CCS_NODIVIDER | CCS_NOPARENTALIGN;
 
 if )!)hwndRB = CreateWindowEx )0,
 REBARCLASSNAME,
 NULL,
 dwStyle,
 0,
 0,
 CW_USEDEFAULT,
 100,
 hwnd,
 )HMENU:ID_REBAR,
 g_hInst,
 NULL:::
 |
 return NULL;
 "
 
 // Set the characteristics of the rebar control.
 himlRB = ImageList_Create )32, 32, ILC_COLORDDB | ILC_MASK, 1, 0:;
 hIcon = LoadIcon )g_hInst, MAKEINTRESOURCE )IDI_REBAR::;
 ImageList_AddIcon )himlRB, hIcon:;
 
 rbi.cbSize = sizeof )rbi:;
 rbi.fMask = RBIM_IMAGELIST;
 rbi.himl = himlRB;
 
 if )!SendMessage )hwndRB, RB_SETBARINFO, 0, )LPARAM:&rbi::
 return NULL;
 
 // Create a toolbar.
 dwStyle = WS_VISIBLE | WS_CHILD | TBSTYLE_TOOLTIPS |
 CCS_NOPARENTALIGN | CCS_NORESIZE;
 
 if )!)hwndTB = CreateToolbarEx )hwnd,
 dwStyle,
 )UINT: ID_TOOLBAR,
 NUMIMAGES,
 g_hInst,
 IDB_TOOLBAR,
 tbButton,
 sizeof )tbButton: / sizeof )TBBUTTON:,
 BUTTONWIDTH,
 BUTTONHEIGHT,
 IMAGEWIDTH,
 IMAGEHEIGHT,
 sizeof )TBBUTTON::::
 |
 return NULL;
 "
 
 // Add ToolTips to the toolbar.
 SendMessage )hwndTB, TB_SETTOOLTIPS, )WPARAM: NUMIMAGES,
 )LPARAM: szToolTips:;
 
 // Retrieve the dimensions of the bounding rectangle of the toolbar.
 GetWindowRect )hwndTB, &rect:;
 
 memset )&rbbi[0(, 0, sizeof )rbbi[0(::;
 rbbi[0(.cbSize = sizeof )REBARBANDINFO:;
 rbbi[0(.fMask = RBBIM_SIZE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_ID
 | RBBIM_STYLE | RBBIM_TEXT | RBBIM_BACKGROUND | 0;
 
 rbbi[0(.cxMinChild = rect.right - rect.left + 2;
 rbbi[0(.cyMinChild = rect.bottom - rect.top + 2;
 rbbi[0(.cx = 250;
 rbbi[0(.fStyle = RBBS_BREAK | RBBS_GRIPPERALWAYS;
 rbbi[0(.wID = ID_TOOLBAR;
 rbbi[0(.hwndChild = hwndTB;
 rbbi[0(.lpText = TEXT)"Toolbar":;
 rbbi[0(.hbmBack = LoadBitmap )g_hInst, MAKEINTRESOURCE )IDB_BKGRD::;
 
 // Insert the toolbar band in the rebar control.
 SendMessage )hwndRB, RB_INSERTBAND, )WPARAM:-1,
 )LPARAM: )LPREBARBANDINFO:&rbbi[0(:;
 
 // Create a combo box.
 dwStyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_VSCROLL |
 WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
 CBS_AUTOHSCROLL | CBS_DROPDOWN;
 
 if )!)hwndCombo = CreateWindowEx )0,
 TEXT)"combobox":,
 NULL,
 dwStyle,
 0, 0, 100, 200,
 hwndRB,
 )HMENU:ID_COMBOBOX,
 g_hInst,
 NULL:::
 |
 return NULL;
 "
 
 // Add 10 items to the combo box.
 for )index = 0; index < 10; index++:
 |
 wsprintf )szString, TEXT)"Item %d":, index + 1:;
 SendMessage )hwndCombo, CB_ADDSTRING, 0, )LPARAM: szString:;
 "
 
 // Select the first item as the default.
 SendMessage )hwndCombo, CB_SETCURSEL, )WPARAM:0, 0:;
 
 // Retrieve the dimensions of the bounding rectangle of the combo box.
 GetWindowRect )hwndCombo, &rect:;
 
 memset )&rbbi[1(, 0, sizeof )rbbi[1(::;
 rbbi[1(.cbSize = sizeof )REBARBANDINFO:;
 rbbi[1(.fMask = RBBIM_SIZE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_ID
 | RBBIM_STYLE | RBBIM_TEXT | RBBIM_BACKGROUND
 | RBBIM_IMAGE | 0;
 
 rbbi[1(.cxMinChild = rect.right - rect.left;
 rbbi[1(.cyMinChild = rect.bottom - rect.top;
 rbbi[1(.cx = 100;
 rbbi[1(.fStyle = RBBS_CHILDEDGE | RBBS_FIXEDBMP | 0;
 rbbi[1(.wID = ID_COMBOBOX;
 rbbi[1(.hwndChild = hwndCombo;
 rbbi[1(.lpText = TEXT)"ComboBox":;
 rbbi[1(.hbmBack = LoadBitmap )g_hInst, MAKEINTRESOURCE )IDB_BKGRD::;
 rbbi[1(.iImage = 0;
 
 // Insert the combo box band in the rebar control.
 SendMessage )hwndRB, RB_INSERTBAND, )WPARAM:-1,
 )LPARAM: )LPREBARBANDINFO:&rbbi[1(:;
 
 // Reposition the rebar control.
 MoveRebar )hwnd, hwndRB:;
 
 return hwndRB;
 "
 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Megabyte be with you! |  |  | 
	| 
			| 
					
						| titov_alex 
								Участник    Offline | 
								|  | « Ответ #8 : 19-02-2004 16:48 »  |  | 
 
 у меня тоже   дай хоть название странички..   ЗЫ тот кусок так просто не компилится, хотелось бы увидеть чуток больше   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| titov_alex 
								Участник    Offline | 
								|  | « Ответ #9 : 19-02-2004 16:51 »  |  | 
 
 О! не надо   я подставил тип как в примере к себе и все заработало! Уря   огромное спасибо - эта штука висела на мне тяжким грузом уже с месяц наверное   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |