Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Combo, Edit и т.д. на ToolBar'e ( WinAPI ) 
V
    Опции темы
Densource
Дата 31.7.2006, 04:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



собсно сабж - как на ТулБар припаять стандартный контрол типа комбо или едит.  В одном МFC примерчике видел что создавали простым созданием но для API что-то непроканало   smile 

и как сделать у кнопки тулбара узкую кнопочку со стрелкой вниз и выпадающим меню ?  smile 
PM MAIL   Вверх
Romikgy
Дата 31.7.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



имхо родителем этого контрола укажи тулбар 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Densource
Дата 31.7.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Romikgy, тоже самое и мне пришло в голову первым - созданный комбо перекрывает собой кнопки справа, которые находятся под ним 
 smile  
PM MAIL   Вверх
Romikgy
Дата 31.7.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



дык размеры на что ? поменяй размер 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Densource
Дата 31.7.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



 а как можно поменять размер отдельно взятой кнопки на тулбаре ???  
PM MAIL   Вверх
Romikgy
Дата 31.7.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Я о комбо, а можно еще положить н-количество пустых кнопок под комбо,
а вообще читай хелп по тулбару smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pulse69
Дата 1.8.2006, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



Посмотри в MSDN про Rebar Control. С его помощью можно сделать выпадающее меню на тулбаре, добавить в тулбар другие элементы управления ( даже диалог ) и ещё много чего.
Если нужно будет, выложу примерчик.
--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
Densource
Дата 1.8.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Pulse69, что же ты молчал  smile  - пример в студию !!
PM MAIL   Вверх
Romikgy
Дата 1.8.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Densource, ты гуглом пользоватся умеешь?
http://windowssdk.msdn.microsoft.com/en-us...y/ms652245.aspx


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pulse69
Дата 2.8.2006, 04:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10





Остаётся только добавить, что у панели инструментов, которую ты будешь добавлять в rebar, обязательно должен быть установлен стиль CCS_NORESIZE, иначе тулбар будет автоматически перемещаться наверх ребара  и закрывать другие полоски, которые ты туда добавишь.
--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
Densource
Дата 2.8.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.7.2006

Репутация: нет
Всего: нет






УРААА !! я нашёл решение

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

Вот мой код 

Код

//----------------------------------------------------------------------------//

#include <windows.h>
#include <commctrl.h>

HWND  hEdit, hLabel, hButton, hClrLbl, hBtnFnt,hToolBar, htool2,hcool,
      hCombo, hStatus, hList1, hList2, hBtnClr;

HMENU hFileMenu, hHelpMenu, hSubMenu, hMenu, hPopUp;

const IDM_Enable_Disable = 0;
const IDM_Exit = 1;
const IDM_About = 2;
const IDP_File=3;
const IDP_Help = 4;
const IDM_Bitmap =5;

const ToolBtns = 13;

//----------------------------------------------------------------------------//

long __stdcall MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{ 
 switch( msg )
 {
   case WM_DESTROY: {  PostQuitMessage( 0 );  return 0;}
   case WM_NOTIFY:
   {
       LPNMTOOLBAR lpnmtb = (LPNMTOOLBAR) lParam;
       LPNMHDR lpnm = (LPNMHDR) lParam;
    switch (lpnm->code)
     {
      case TBN_DROPDOWN:
       {
        switch (lpnmtb->iItem)
         {
          case 301:
            RECT rc;
            SendMessage( hToolBar, TB_GETRECT, lpnmtb->iItem, (LPARAM)&rc);
          POINT pp;
            ZeroMemory( &pp, sizeof(pp));
            ClientToScreen( hToolBar, &pp );
            TrackPopupMenuEx( hFileMenu,  TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
                    rc.left+pp.x, rc.bottom+pp.y, hWnd, NULL);
            break;
         }
       }
     }
     return 0;
   }
 }
  return DefWindowProc( hWnd, msg, wParam, lParam );
}

//----------------------------------------------------------------------------//

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
 WNDCLASS wc = { CS_HREDRAW | CS_VREDRAW , MsgProc,  0L, 0L,  hInstance,
                 LoadIcon(0, IDI_EXCLAMATION), LoadCursor(0, IDC_ARROW),
                 (HBRUSH)16,  NULL, "Window"  };
 RegisterClass( &wc );
 HWND hWnd = CreateWindow( "Window", "Интерфейс на WinAPI", WS_OVERLAPPEDWINDOW,// |WS_MINIMIZEBOX| WS_SYSMENU,
                            200, 200, 560, 270, NULL, NULL, wc.hInstance, NULL );

   

 INITCOMMONCONTROLSEX icc={ sizeof(icc), ICC_BAR_CLASSES|ICC_COOL_CLASSES };
  InitCommonControlsEx( &icc );

 DWORD ws = WS_CHILD | WS_VISIBLE, ws2 = ws | WS_TABSTOP;

  TBBUTTON tbb[ToolBtns];
  int tbs[ToolBtns]={STD_FILENEW, STD_FILEOPEN, STD_FILESAVE, -1,150,-1, STD_CUT,
                     STD_COPY, STD_PASTE, -1, STD_UNDO, STD_REDOW, STD_HELP};
  ZeroMemory( &tbb, sizeof(tbb));
  for(int i=0; i<11; i++)
  {
   tbb[i].iBitmap=tbs[i];
   tbb[i].idCommand=300+i;
   tbb[i].fsState=TBSTATE_ENABLED;
   if(tbs[i]==-1) tbb[i].fsStyle=TBSTYLE_SEP; else
                     tbb[i].fsStyle=TBSTYLE_BUTTON ;
   tbb[i].iString=0;
  }
  tbb[4].fsStyle=TBSTYLE_SEP;
  tbb[1].fsStyle=TBSTYLE_DROPDOWN  ;

  hToolBar = CreateToolbarEx( hWnd, /*CCS_ADJUSTABLE |*/WS_VISIBLE |TBSTYLE_FLAT|TBSTYLE_REGISTERDROP, 299, 15, HINST_COMMCTRL,
               IDB_STD_SMALL_COLOR, 0,  0, 16,16,  15,15,  sizeof(TBBUTTON) );



   DWORD EXST = (DWORD) SendMessage( hToolBar, TB_GETEXTENDEDSTYLE, 0, 0 );
        SendMessage( hToolBar, TB_SETEXTENDEDSTYLE, 0, EXST|TBSTYLE_EX_DRAWDDARROWS );



 hCombo  = CreateWindowEx(WS_EX_CLIENTEDGE , "COMBOBOX", NULL, ws2 |WS_VSCROLL |
             CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN ,
             90, 0, 150, 150, hToolBar, (HMENU)513, wc.hInstance, NULL);  //hCtrls[2] = hCombo;
             SetWindowText( hCombo, "<< Выберите пункт >>");
             SendMessage( hCombo, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Изменить заголовок" );
             SendMessage( hCombo, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Добавить строку" );
             SendMessage( hCombo, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Выход из программы" );
             SendMessage( hCombo, CB_SETDROPPEDWIDTH, 200, 0 );

     AppendMenu((hSubMenu=CreatePopupMenu()), MF_GRAYED | MF_STRING, 100,"Submenu 1 >");
     AppendMenu( hSubMenu, MF_ENABLED | MF_STRING, 100,"Submenu 2");

     AppendMenu((hFileMenu=CreatePopupMenu()), MF_ENABLED | MF_STRING, IDM_Enable_Disable, "&Enable exit");
     AppendMenu( hFileMenu, MF_SEPARATOR, 0,"");
     AppendMenu( hFileMenu, MF_ENABLED | MF_STRING | MF_POPUP,(UINT) hSubMenu,"&Right ->");
     AppendMenu( hFileMenu, MF_GRAYED | MF_STRING, (IDM_Exit+200),"E&xit");
        SendMessage( hToolBar, TB_ADDBUTTONS,  (UINT)11, (LPARAM)(LPTBBUTTON) &tbb );

     {
      ShowWindow  ( hWnd, SW_SHOWDEFAULT ), UpdateWindow( hWnd );
      MSG msg;

      while( GetMessage( &msg, NULL, 0, 0 ) )

        if(!IsDialogMessage( hWnd, &msg ))
          TranslateMessage( &msg ),
          DispatchMessage ( &msg );

       
    }
  UnregisterClass( "Window", wc.hInstance );

}

//----------------------------------------------------------------------------//


Pulse69,  Отдельное спасибо - как раз с этой проблемой столкнулся когда захотел к Банду Ребара прилепить Тулбар а не простое комбо или Едит.

PM MAIL   Вверх
Densource
Дата 2.8.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Вот ещё сорц Ребара с Тулбаро и Комбой.  Немного некрасиво работает, но работает ! )

Пульс - ещё раз спасибо !!

Код

//----------------------------------------------------------------------------//

#include <windows.h>
#include <commctrl.h>

HWND  hEdit, hLabel, hButton, hClrLbl, hBtnFnt,hToolBar, htool2,hcool,
      hCombo, hStatus, hList1, hList2, hBtnClr, hRebar;

HMENU hFileMenu, hHelpMenu, hSubMenu, hMenu, hPopUp;

const IDM_Enable_Disable = 0;
const IDM_Exit = 1;
const IDM_About = 2;
const IDP_File=3;
const IDP_Help = 4;
const IDM_Bitmap =5;

const ToolBtns = 13;

//----------------------------------------------------------------------------//

long __stdcall MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{ 
 switch( msg )
 {
   case WM_DESTROY: {  PostQuitMessage( 0 );  return 0;}
   case WM_NOTIFY:
   {
       LPNMTOOLBAR lpnmtb = (LPNMTOOLBAR) lParam;
       LPNMHDR lpnm = (LPNMHDR) lParam;
    switch (lpnm->code)
     {
      case TBN_DROPDOWN:
       {
        switch (lpnmtb->iItem)
         {
          case 301:
            RECT rc;
            SendMessage( hToolBar, TB_GETRECT, lpnmtb->iItem, (LPARAM)&rc);
          POINT pp;
            ZeroMemory( &pp, sizeof(pp));
            ClientToScreen( hToolBar, &pp );
            TrackPopupMenuEx( hFileMenu,  TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
                    rc.left+pp.x, rc.bottom+pp.y, hWnd, NULL);
            break;
         }
       }
     }
     return 0;
   }
   case WM_SIZE:
        {
          SendMessage( hRebar, WM_SIZE, 0, 0 );
          return 0;
        }

 }
  return DefWindowProc( hWnd, msg, wParam, lParam );
}

//----------------------------------------------------------------------------//

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
 WNDCLASS wc = { CS_HREDRAW | CS_VREDRAW , MsgProc,  0L, 0L,  hInstance,
                 LoadIcon(0, IDI_EXCLAMATION), LoadCursor(0, IDC_ARROW),
                 (HBRUSH)16,  NULL, "Window"  };
 RegisterClass( &wc );
 HWND hWnd = CreateWindow( "Window", "Интерфейс на WinAPI", WS_OVERLAPPEDWINDOW,// |WS_MINIMIZEBOX| WS_SYSMENU,
                            200, 200, 560, 270, NULL, NULL, wc.hInstance, NULL );

   

 INITCOMMONCONTROLSEX icc={ sizeof(icc), ICC_BAR_CLASSES|ICC_COOL_CLASSES };
  InitCommonControlsEx( &icc );

 DWORD ws = WS_CHILD | WS_VISIBLE, ws2 = ws | WS_TABSTOP;

        hRebar=CreateWindowEx(WS_EX_TOOLWINDOW,    //more or 'extended' styles
                                   REBARCLASSNAME,      //the 'class' of window to create
                                   NULL,                //the window title
                                   WS_CHILD|WS_VISIBLE| //window style: how it looks
                                   WS_CLIPSIBLINGS|   
                                   WS_CLIPCHILDREN|RBS_VARHEIGHT|
                                   CCS_NODIVIDER|WS_BORDER,
                                   0, 0, 0, 0, hWnd,  NULL, wc.hInstance, NULL); 

         REBARINFO     ri;
            REBARBANDINFO rbi;
            RECT          rc;
            HWND          hCombo,hBtn;
            TCHAR         chFile[32];
            //change the font to a bolder stock font for better contrast with bitmap
            SendMessage( hRebar, WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FONT), 0 );
            ZeroMemory(&ri,sizeof(ri));
            ZeroMemory(&rbi,sizeof(rbi));
            //no imagelist to attach to rebar
            ri.cbSize=sizeof(REBARINFO); 
            SendMessage( hRebar,RB_SETBARINFO,0,(LPARAM)&ri);
            //setup REBARBANDINFO with details common to both bands such as text colour
            //or background bitmap
            rbi.cbSize = sizeof(REBARBANDINFO);
            rbi.fMask  = RBBIM_COLORS|/*RBBIM_TEXT|*/RBBIM_BACKGROUND|RBBIM_STYLE|
                         RBBIM_CHILD |RBBIM_CHILDSIZE|RBBIM_SIZE;
            rbi.fStyle = RBBS_CHILDEDGE|RBBS_FIXEDBMP|RBBS_GRIPPERALWAYS;
          


  TBBUTTON tbb[ToolBtns];
  int tbs[ToolBtns]={STD_FILENEW, STD_FILEOPEN, STD_FILESAVE, -1,150,-1, STD_CUT,
                     STD_COPY, STD_PASTE, -1, STD_UNDO, STD_REDOW, STD_HELP};
  ZeroMemory( &tbb, sizeof(tbb));
  for(int i=0; i<11; i++)
  {
   tbb[i].iBitmap=tbs[i];
   tbb[i].idCommand=300+i;
   tbb[i].fsState=TBSTATE_ENABLED;
   if(tbs[i]==-1) tbb[i].fsStyle=TBSTYLE_SEP; else
                     tbb[i].fsStyle=TBSTYLE_BUTTON ;
   tbb[i].iString=0;
  }
  tbb[4].fsStyle=TBSTYLE_SEP;
  tbb[1].fsStyle=TBSTYLE_DROPDOWN  ;

  hToolBar = CreateToolbarEx( hWnd, CCS_NORESIZE|WS_VISIBLE |TBSTYLE_FLAT|TBSTYLE_REGISTERDROP, 299, 15, HINST_COMMCTRL,
               IDB_STD_SMALL_COLOR, 0,  0, 16,16,  15,15,  sizeof(TBBUTTON) );

 DWORD EXST = (DWORD) SendMessage( hToolBar, TB_GETEXTENDEDSTYLE, 0, 0 );
        SendMessage( hToolBar, TB_SETEXTENDEDSTYLE, 0, EXST|TBSTYLE_EX_DRAWDDARROWS );

            GetClientRect(hToolBar,&rc);    //get dimensions of combobox control
            rbi.clrFore=RGB(222,255,255);    //text colour
            rbi.clrBack=GetSysColor(COLOR_BTNFACE);
            rbi.hwndChild=hToolBar;
            rbi.cxMinChild=rc.right-rc.left;
            
            rbi.cyMinChild=rc.bottom-rc.top;
            //rbi.cx=0;
            //Attach combobox band to rebar common control
            SendMessage( hRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbi);
  

 hCombo  = CreateWindowEx(WS_EX_CLIENTEDGE , "COMBOBOX", NULL, ws2 |WS_VSCROLL |
             CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN ,
             90, 0, 150, 150, hRebar, (HMENU)513, wc.hInstance, NULL);  //hCtrls[2] = hCombo;
             SetWindowText( hCombo, "<< Выберите пункт >>");
             SendMessage( hCombo, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Изменить заголовок" );
             SendMessage( hCombo, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Добавить строку" );
             SendMessage( hCombo, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Выход из программы" );
             SendMessage( hCombo, CB_SETDROPPEDWIDTH, 200, 0 );

GetClientRect(hCombo,&rc);    //get dimensions of combobox control
            rbi.hwndChild  = hCombo;
            rbi.cxMinChild = 0;
            rbi.cyMinChild = rc.bottom-rc.top;
            rbi.cx = 200;
            //Attach combobox band to rebar common control
            SendMessage( hRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbi);
  

     AppendMenu((hSubMenu=CreatePopupMenu()), MF_GRAYED | MF_STRING, 100,"Submenu 1 >");
     AppendMenu( hSubMenu, MF_ENABLED | MF_STRING, 100,"Submenu 2");

     AppendMenu((hFileMenu=CreatePopupMenu()), MF_ENABLED | MF_STRING, IDM_Enable_Disable, "&Enable exit");
     AppendMenu( hFileMenu, MF_SEPARATOR, 0,"");
     AppendMenu( hFileMenu, MF_ENABLED | MF_STRING | MF_POPUP,(UINT) hSubMenu,"&Right ->");
     AppendMenu( hFileMenu, MF_GRAYED | MF_STRING, (IDM_Exit+200),"E&xit");
        SendMessage( hToolBar, TB_ADDBUTTONS,  (UINT)11, (LPARAM)(LPTBBUTTON) &tbb );

     {
      ShowWindow  ( hWnd, SW_SHOWDEFAULT ), UpdateWindow( hWnd );
      MSG msg;

      while( GetMessage( &msg, NULL, 0, 0 ) )

        if(!IsDialogMessage( hWnd, &msg ))
          TranslateMessage( &msg ),
          DispatchMessage ( &msg );

       
    }
  UnregisterClass( "Window", wc.hInstance );

}

//---------------------------------------------------------------------------



Это сообщение отредактировал(а) Fixin - 2.8.2006, 15:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.