Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > WinAPI
Перезагрузить страницу Как сделать у кнопки тулбара узкую кнопочку со стрелкой вниз и выпадающим меню
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Densource Densource вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.07.2006
По умолчанию Как сделать у кнопки тулбара узкую кнопочку со стрелкой вниз и выпадающим меню - 31.07.2006, 07:05

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

и как сделать у кнопки тулбара узкую кнопочку со стрелкой вниз и выпадающим меню ?
Ответить с цитированием
  (#2 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 31.07.2006, 12:28

См. www.codeproject.com и www.codeguru.com
Ответить с цитированием
  (#3 (permalink)) Старый
Densource Densource вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.07.2006
По умолчанию 01.08.2006, 06:01

Jonano - короче только фраза *см. там* =)) , ничего кроме МФЦ примеров там не нашёл.


По части кнокочки для ДропДауна на сайтах и МСДН сказано что надо установить TBSTYLE_EX_DRAWDDARROWS для ExStyle ToolBar'a и TBSTYLE_DROPDOWN для

нужной кнопки этого ТулБара. Результат - отсутствие такового ... Такое ощущение что когда придумывался этот функционал, то об АПИ сама М$ уже забыла.
Ответить с цитированием
  (#4 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 01.08.2006, 13:20

Цитата:
Jonano - короче только фраза *см. там* =)) , ничего кроме МФЦ примеров там не нашёл.
Ну а больше ничего и не надо. MFC на чём основано? На WinAPI. Какой из этого вывод?
Пример есть, если у тебя есть голова на плечах, то ты всё сообразишь, что к чему.
Ответить с цитированием
  (#5 (permalink)) Старый
Densource Densource вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.07.2006
Cool 02.08.2006, 16:09

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

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

Вот мой код

Код:
//----------------------------------------------------------------------------//

#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 );

}

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


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


Код:
//----------------------------------------------------------------------------//

#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 );

}

//---------------------------------------------------------------------------
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с выпадающим меню в IE Odin_KG DHTML, JavaScript, VBScript 1 22.08.2011 00:54
Как в windows phone 7 сделать так, чтобы при нажатии кнопки один style этой кнопки с Жужа Другие мобильные платформы 0 06.03.2011 18:52
Как сделать чтобы Status bar не двигался вверх и вниз Aziz C++ Builder 2 05.07.2010 22:16
Нужно вывести форму со списком в реакции на нажатие кнопки меню qqeeaaddzzcc_the_same C++ Builder 5 11.10.2009 20:56
Блокирование появления контекстного меню по нажатию правой кнопки мыши alexu C++ Builder 10 25.11.2008 09:44
Как сделать, чтоб при перетаскивании мышки файлы перетаскивались вверх и вниз WolfEinstein Delphi 6 12.08.2005 00:17
Как добавить обработчик кнопки тулбара MrLamozzz Visual C++ 0 21.03.2005 16:57
Какое событие надо перехватить, что бы пункты меню и кнопки сделать активными ME45 Visual C++ 1 30.11.2004 14:57
Как сделать вывод текста не с верху вниз а наоборот снизу вверх Werti Delphi 0 23.06.2004 20:11
Как при нажатии кнопки меню открыть диалоговое окно в С++ anna Вопросы начинающих программистов 2 22.03.2004 12:08
Как в заголовке колонки сделать стрелочку вверх и вниз Anonymous Delphi 1 17.07.2003 15:53
Сортировка меню кнопки Пуск Anonymous Visual C++ 0 04.07.2003 21:50



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов