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! ;-)
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
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"
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.