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 » |
|
О! не надо я подставил тип как в примере к себе и все заработало! Уря огромное спасибо - эта штука висела на мне тяжким грузом уже с месяц наверное
|
|
|
Записан
|
|
|
|
|