Hejsa.
Jeg vil gerne bruge en Rebar (kendt som CoolBar og TCoolBar i Delphi) i min næste applikation, og jeg har derfor valgt at forberede mig med et lille testprogram.
Jeg kan sagtens oprette en ToolBar, give ToolBar'en et par knapper, oprette en ReBar og smide ToolBar'en på ReBar'en... men når jeg fører musen over en af knapperne og fører den væk igen, så er det stykke af ReBar'en, hvor knappen er, forsvundet... eller rettere sagt, det har ikke længere ReBar'ens baggrundsfarve; det har ToolBar'ens baggrundsfarve, og det er overhovedet ikke optimalt eller ønsket.
Jeg prøver lige at indsætte nogle billeder, men der står ikke hvordan man gør, så det tager nok et par forsøg.
Nå, man kan vist ikke indsætte billeder, men I kan se dem her:
http://123login.dk/dexo/rebar1.pnghttp://123login.dk/dexo/rebar2.pnghttp://123login.dk/dexo/rebar3.pngHer er koden:
#include <windows.h>
#include <commctrl.h>
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
HWND hRebar;
HWND hToolbar;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
VOID InitCCEx(void);
VOID CreateRebar(HWND);
// Application entry
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
const TCHAR szClass[] = TEXT("RebarSampleApp");
WNDCLASS wc;
HWND hwnd;
MSG msg;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = szClass;
wc.lpszMenuName = NULL;
wc.style = CS_DBLCLKS;
RegisterClass(&wc);
// Initiate common controls
InitCCEx();
hwnd = CreateWindowEx(0L, szClass, TEXT("Rebar sample application"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
300, 300,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// Init common controls function
void InitCCEx(void)
{
INITCOMMONCONTROLSEX ccex;
ccex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES;
ccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
InitCommonControlsEx(&ccex);
}
// Create rebar control
// This function also creates the toolbar,
// it being a part of the rebar
void CreateRebar(HWND hwnd)
{
hToolbar = CreateWindowEx(0L, TOOLBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | CCS_NODIVIDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0, 0, 0, 0,
hwnd, NULL, NULL, NULL);
SendMessage(hToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
SendMessage(hToolbar, TB_AUTOSIZE, 0, 0);
// Add buttons
TBBUTTON buttons[2];
memset(&buttons, 0, sizeof(buttons));
buttons[0].fsState = TBSTATE_ENABLED;
buttons[0].fsStyle = TBSTYLE_BUTTON;
buttons[1].fsState = TBSTATE_ENABLED;
buttons[1].fsStyle = TBSTYLE_BUTTON;
UINT uNumBtns = sizeof(buttons) / sizeof(TBBUTTON);
SendMessage(hToolbar, TB_ADDBUTTONS, uNumBtns, (LPARAM)buttons);
hRebar = CreateWindowEx(0L, REBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE,
0, 0, 100, 25,
hwnd, NULL, NULL, NULL);
// Get the size of the tool bar
DWORD dwSize = SendMessage(hToolbar, TB_GETBUTTONSIZE, 0, 0);
REBARBANDINFO bandinfo;
memset(&bandinfo, 0, sizeof(REBARBANDINFO));
bandinfo.cbSize = sizeof(REBARBANDINFO);
bandinfo.lpText = "ReBarControl";
bandinfo.cyMinChild = LOWORD(dwSize);
bandinfo.fMask = RBBIM_STYLE | RBBIM_TEXT | RBBIM_CHILDSIZE;
bandinfo.hwndChild = hToolbar;
SendMessage(hRebar, RB_INSERTBAND, -1, (LPARAM)&bandinfo);
}
// Windows procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
CreateRebar(hwnd);
return 0;
case WM_SIZE:
MoveWindow(hRebar, 0, 0, LOWORD(lParam), HIWORD(lParam), false);
InvalidateRect(hRebar, NULL, true);
SendMessage(hRebar, message, wParam, lParam);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
Indlæg senest redigeret d. 22.05.2009 22:52 af Bruger #8985