Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите разобраться с ребаром (VC60+WINAPI)  (Прочитано 14651 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
titov_alex
Участник

ru
Offline Offline

« : 09-02-2004 10:55 » 

Доброго времени суток всем!

Ковыряюсь я тут с винапишными GUI... вот и до ребара дошел - хочится мне красивый интерфейсик с двигающимися тулбарами сделать... а делать можно (в условиях большого проекта, правила устанавливаю не я) только на винапи - никаких MFC и даже QT не пойдет   Так больше нельзя...

Так вот. Натолкнулся на проблему - создаю ребар, на нем - банд с тулбаром... и этот гадкий тулбар никах не хочет на банде позиционироваться - он лезет в верхний левый угол самого ребара  Молчу (что, в общем-то можно понять - родительским окном я указываю ребар а не банд). Че с этим делать можна? не ручками же тулбар ставить на место при каждом движении ребара! :?  

Спасибо
Записан
titov_alex
Участник

ru
Offline Offline

« Ответ #1 : 19-02-2004 13:11 » 

ну неужели никто не сталкивался???
вопрос не срочный, но я уже много времени потратил на эту фичу - и никаких результатов Жаль
Записан
Diletant
Помогающий

de
Offline Offline

« Ответ #2 : 19-02-2004 13:28 » 

А на русский язык это все превести нельзя? Т.е. позиционирование чего-либо относительно произвольного окна - это не проблема, осталось выяснить, что и относительно чего позиционируем-то?
Записан
Asan
Гость
« Ответ #3 : 19-02-2004 13:57 » new

Цитата: titov_alex

Ковыряюсь я тут с винапишными GUI... вот и до ребара дошел - хочится мне красивый интерфейсик с двигающимися тулбарами сделать... а делать можно (в условиях большого проекта, правила устанавливаю не я) только на винапи - никаких MFC и даже QT не пойдет   Так больше нельзя...


Есть такая штука - WTL называется, которая
Цитата
является "надстройкой" над оконной подсистемой Win32 API и существенно упрощает работу с функциями этой подсистемы, а также облегчает задачу написания повторно используемого кода. В WTL поддерживает работу с окнами и диалогами, окнами-рамками, полным набором стандартных элементов управления, стандартными диалогами, GDI и другими неотъемлемыми элементами пользовательского интерфейса.


Хорошие статьи по ней на www.rsdn.ru.
Можешь скачать и посмотреть, как там класс CReBarCtrl реализован.
Записан
titov_alex
Участник

ru
Offline Offline

« Ответ #4 : 19-02-2004 13:57 » 

Цитата: Diletant
А на русский язык это все превести нельзя? Т.е. позиционирование чего-либо относительно произвольного окна - это не проблема, осталось выяснить, что и относительно чего позиционируем-то?

начит так
имеем 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
Специалист

ru
Offline Offline

WWW
« Ответ #5 : 19-02-2004 14:43 » 

Сейчас посмотрел пример в MSDN. У них при создании тулбара используются стили CCS_NOPARENTALIGN | CCS_NORESIZE в дополнение к тому, что есть у тебя.
Записан

Megabyte be with you!
titov_alex
Участник

ru
Offline Offline

« Ответ #6 : 19-02-2004 16:08 » 

Цитата: Lex
Сейчас посмотрел пример в MSDN. У них при создании тулбара используются стили CCS_NOPARENTALIGN | CCS_NORESIZE в дополнение к тому, что есть у тебя.

а ссылочку можешь дать?
а то в том примере, где я смотрел - там создание тулбара опущено - наверное думают, что всем и так понятно Улыбаюсь
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #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
Участник

ru
Offline Offline

« Ответ #8 : 19-02-2004 16:48 » 

у меня тоже Улыбаюсь
дай хоть название странички.. Улыбаюсь

ЗЫ тот кусок так просто не компилится, хотелось бы увидеть чуток больше Улыбаюсь
Записан
titov_alex
Участник

ru
Offline Offline

« Ответ #9 : 19-02-2004 16:51 » 

О! не надо Улыбаюсь
я подставил тип как в примере к себе и все заработало! Уря Улыбаюсь
огромное спасибо - эта штука висела на мне тяжким грузом уже с месяц наверное Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines