Winapi::Toolbar z ComboBoxem

0

Mam pytanie, jak zaprogramowac Toolbar w ktorym bedzie znajdowal sie Combo-Box?
Programuje z uzyciem Winapi pod Dev C++.
Jakby ktos podeslal szkielet, bylbym bardzo wdzieczny! ;-)

0

dodaj po prostu separator do toolbara o szerokości trochę większej niż combo, a samo combo utwóż jako child toolbara kilka pixeli na prawo od lewej krawędzi owego separatora.
"Przejmij" wndproc toolbara aby odebrać notyfikacje z combo
Na codeproject są minimum dwa gotowce z IE-toolbarem - jeden z nich to MotleyFool

0
kts napisał(a)

Mam pytanie, jak zaprogramowac Toolbar w ktorym bedzie znajdowal sie Combo-Box?
Programuje z uzyciem Winapi pod Dev C++.
Jakby ktos podeslal szkielet, bylbym bardzo wdzieczny! ;-)

Dokładnie tak jak ktoś przedemną napisał wygląda to mniej więcej tak:
main.cpp

//ToolBar z ComboBox Demo dla Dev-C++
#include <windows.h>

//-lcomctl32 do wiersza polecen konsolidatora w opcjach projektu
#define _WIN32_IE 0x0400
#include <commctrl.h>
#if defined __MINGW_H
#define _WIN32_IE 0x0400
#endif

#include "main.h"

HINSTANCE hInst;
HWND hMainWnd, hToolBar, hComboBox;
HIMAGELIST hImageList; 

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "MainWndClass";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{          
    MSG messages;      
    WNDCLASSEX wc;
    
    //--> To jest ważne
    INITCOMMONCONTROLSEX  InitCtrls;
    InitCtrls.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCtrls.dwICC= ICC_BAR_CLASSES;
    if (InitCommonControlsEx(&InitCtrls) == FALSE) {
        MessageBox(0, "Błąd funkcji InitCommonControlsEx", NULL, MB_ICONERROR);
        return 0;
    }    
    
    hInst = hThisInstance;
    //<--
    
    wc.hInstance = hThisInstance;
    wc.lpszClassName = szClassName;
    wc.lpfnWndProc = WindowProcedure;  
    wc.style = CS_DBLCLKS;               
    wc.cbSize = sizeof (WNDCLASSEX);

    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.lpszMenuName = NULL;                
    wc.cbClsExtra = 0;                  
    wc.cbWndExtra = 0; 
    wc.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    if (!RegisterClassEx (&wc))
        return 0;

    hMainWnd = CreateWindowEx(0, szClassName, "ToolBar Demo", 
       WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 375,                 
       HWND_DESKTOP, NULL, hThisInstance, NULL);

    ShowWindow (hMainWnd, nFunsterStil);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}



LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)              
    {
        case WM_CREATE:
            //--> To jest ważne
            
            HICON hIcon; 
            int i;
            TBBUTTON tb;
            TBBUTTONINFO tbi;  
            int nIndex;
            RECT lprc; 
            
            //Tworzymy ImageList dla 2 ikonek o wymiarach 16x16
            hImageList = ImageList_Create(16,16,ILC_MASK, 2, 0);

            
            //W pętli ładujemy ikonki
            for (i=ID_ICON1;i<=ID_ICON2;i++) {
              //ładuj ikone z zasobów
              hIcon = LoadIcon(hInst, MAKEINTRESOURCE(i));
              //dodaj ikone do ImageList
              ImageList_AddIcon(hImageList, hIcon);  
            }     
            //Toworzymy ToolBar
            hToolBar = CreateWindowEx(WS_EX_TOOLWINDOW, TOOLBARCLASSNAME, 
               0, WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_NODIVIDER, 
               0, 0, 0, 0, hwnd ,(HMENU)ID_TOOLBAR , hInst, 0);       
            
            SendMessage(hToolBar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
            SendMessage(hToolBar, TB_SETMAXTEXTROWS, 1, 0);
            SendMessage(hToolBar, TB_SETBITMAPSIZE, 0, MAKELONG(16, 16));
            SendMessage(hToolBar, TB_SETIMAGELIST, 0, (LPARAM)hImageList); 
            
            //Dodajemy przyciski
            tb.iBitmap = 0;
            tb.idCommand = ID_TB_BUTTON1;
            tb.fsState = TBSTATE_ENABLED;
            tb.iString = 0;   
            tb.fsStyle = TBSTYLE_BUTTON; 
            SendMessage(hToolBar, TB_ADDBUTTONS, 1, (LPARAM)&tb);  
            
            
            tb.iBitmap = -1;
            //To jest separator na którym bedzie ComboBox
            tb.idCommand = ID_COMBOBOX; 
            tb.fsState = TBSTATE_ENABLED;
            tb.iString = 0;    
            tb.fsStyle = TBSTYLE_SEP; 
            SendMessage(hToolBar, TB_ADDBUTTONS, 1, (LPARAM)&tb); 
            
            tb.iBitmap = 1;
            tb.idCommand = ID_TB_BUTTON2;
            tb.fsState = TBSTATE_ENABLED;
            tb.iString = 0;   
            tb.fsStyle = TBSTYLE_BUTTON; 
            SendMessage(hToolBar, TB_ADDBUTTONS, 1, (LPARAM)&tb);             
               
            //Pobieramy index separatora na którym ma być ComboBox
            nIndex = SendMessage(hToolBar, TB_COMMANDTOINDEX, ID_COMBOBOX, 0);
            tbi.cbSize = sizeof(TBBUTTONINFO);
            tbi.dwMask = TBIF_BYINDEX | TBIF_SIZE;
            tbi.cx = 120;
            //Zmianiamy szerokosc separatora (Tak aby zmiescił sie ComboBox)
            SendMessage(hToolBar, TB_SETBUTTONINFO, nIndex, (LPARAM)&tbi);          
           
            //Pobieramy wsp i wielkosc separatora            
            SendMessage(hToolBar, TB_GETITEMRECT, nIndex, (LPARAM)&lprc);
            
            //Tworzymy ComboBox                 
            hComboBox = CreateWindowEx(WS_EX_TOOLWINDOW, "COMBOBOX", 0,
               WS_CHILD | WS_VISIBLE | CBS_DROPDOWN	 | CBS_HASSTRINGS, 
               lprc.left + 5, lprc.top + 1, lprc.right - lprc.left - 10, 200, 
               hToolBar, (HMENU)ID_COMBOBOX, hInst, 0);
            //Zmioana wysokosci ComboBox aby bardziej dopasowac go do ToolBara 
            SendMessage(hComboBox, CB_SETITEMHEIGHT , (WPARAM)-1, (LPARAM)14);
            
            /*Tutaj dodajesz pozycje do ComboBox (komunikat CB_ADDSTRING)
              a osbsługujesz go normalnie przez WM_COMMAND */
            
            MoveWindow(hToolBar, 0, 0, 0, 0, true);           
            break; //<--
        case WM_DESTROY:
            //--> To jest ważne
            ImageList_RemoveAll(hImageList);
            ImageList_Destroy(hImageList); //<--
            PostQuitMessage (0);
            break;
        default: 
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

main.h

#define ID_TOOLBAR     100
#define ID_TB_BUTTON1  101
#define ID_TB_BUTTON2  102
#define ID_COMBOBOX    103

#define ID_ICON1  201
#define ID_ICON2  202

rsrc.rc

#include "main.h"

ID_ICON1 ICON "ikona1.ico"
ID_ICON2 ICON "ikona2.ico"

1 użytkowników online, w tym zalogowanych: 0, gości: 1