📄 toolbr.c
字号:
addTool( &bar->tool_list, t );
if( !(info->flags & ITEM_BLANK) && info->bmp != HNULL ) {
createButtonList( bar->hwnd, bar, t );
}
} /* ToolBarAddItem */
void ToolBarSetState( toolbar *bar, WORD id, WORD state )
{
tool *t;
t = findTool( bar->tool_list, id );
t->state = state;
// force the button to be redrawn
InvalidateRect( bar->hwnd, &t->area, FALSE );
}
WORD ToolBarGetState( toolbar *bar, WORD id )
{
tool *t;
t = findTool( bar->tool_list, id );
return( t->state );
}
/*
* ToolBarDeleteItem - delete an item from the tool bar
*/
BOOL ToolBarDeleteItem( toolbar *bar, WORD id )
{
tool *t, *next;
t = findTool( bar->tool_list, id );
if( t != NULL ) {
// need to destroy the window on the tool bar and recreate
// all the other tools after this one
next = t->next;
deleteTool( &bar->tool_list, t );
createButtonList( bar->hwnd, bar, next );
return( TRUE );
}
return( FALSE );
} /* ToolBarDeleteItem */
/*
* ToolBarDisplay - create and show the tool bar
*/
void ToolBarDisplay( toolbar *bar, TOOLDISPLAYINFO *disp )
{
int height, width;
currTool = NULL;
currIsDown = FALSE;
lastID = -1;
mouse_captured = FALSE;
if( bar->bgbrush != NULL ) {
DeleteObject( bar->bgbrush );
bar->bgbrush = NULL;
}
if( disp->background != NULL ) {
bar->bgbrush = CreatePatternBrush( disp->background );
}
if( bar->hwnd != HNULL ) {
DestroyWindow( bar->hwnd );
}
bar->button_size = disp->button_size;
bar->hook = disp->hook;
bar->helphook = disp->helphook;
bar->border = disp->border_size;
bar->background = disp->background;
bar->foreground = disp->foreground;
bar->is_fixed = disp->is_fixed;
width = disp->area.right - disp->area.left;
height = disp->area.bottom - disp->area.top;
#if defined(__NT__)
if ( LOBYTE(LOWORD(GetVersion())) >= 4 &&
(disp->style & TOOLBAR_FLOAT_STYLE) == TOOLBAR_FLOAT_STYLE ) {
CreateWindowEx( WS_EX_TOOLWINDOW, className, NULL, disp->style,
disp->area.left, disp->area.top, width, height,
bar->owner, (HMENU) HNULL, GET_HINSTANCE( bar->owner ), bar );
}
else {
if( LOBYTE(LOWORD(GetVersion())) >= 4 ) {
CreateWindow( className, NULL, WS_CHILD | WS_CLIPSIBLINGS,
disp->area.left, disp->area.top, width, height,
bar->owner, (HMENU) HNULL, GET_HINSTANCE( bar->owner ), bar );
} else {
CreateWindow( className, NULL, disp->style,
disp->area.left, disp->area.top, width, height,
bar->owner, (HMENU) HNULL, GET_HINSTANCE( bar->owner ), bar );
}
}
#else
CreateWindow( className, NULL, disp->style,
disp->area.left, disp->area.top, width, height,
bar->owner, (HMENU) HNULL, GET_HINSTANCE( bar->owner ), bar );
#endif
/*
* Windows ignores the GETMINMAXINFO before the WM_CREATE or
* something so we kluge it.
*/
MoveWindow( bar->hwnd, disp->area.left, disp->area.top,
width, height, TRUE );
} /* ToolBarDisplay */
/*
* ToolBarWindow - return a handle to the toolbar window
*/
HWND ToolBarWindow( toolbar *bar )
{
if( bar == NULL ) {
return( HNULL );
}
return( bar->hwnd );
} /* ToolBarWindow */
/*
* UpdateToolBar - update our tool bar
*/
void UpdateToolBar( toolbar *bar )
{
InvalidateRect( bar->hwnd, NULL, TRUE );
UpdateWindow( bar->hwnd );
} /* UpdateToolBar */
/*
* drawTopLeftCorner - draws the top left corner of a button
*/
static void drawTopLeftCorner( HDC hdc, POINT size, int border, HPEN pen )
{
HPEN old_pen;
old_pen = SelectObject( hdc, pen );
MoveToEx( hdc, border, size.y - 2*border, NULL );
LineTo( hdc, border, border );
LineTo( hdc, size.x - border, border );
SelectObject( hdc, old_pen );
} /* drawTopLeftCorner */
/*
* drawTopLeftInsideCorner - draws the top left corner of a button
*/
static void drawTopLeftInsideCorner( HDC hdc, POINT size, int border, HPEN pen )
{
HPEN old_pen;
old_pen = SelectObject( hdc, pen );
MoveToEx( hdc, border*2, size.y - 2*border, NULL );
LineTo( hdc, border*2, border*2 );
LineTo( hdc, size.x - border, border*2 );
SelectObject( hdc, old_pen );
} /* drawTopLeftCorner */
/*
* drawBottomRightCorner - draws the bottom right corner of a button
*/
static void drawBottomRightCorner( HDC hdc, POINT size, int border, HPEN pen )
{
HPEN old_pen;
size.x -= 2*border;
size.y -= 2*border;
old_pen = SelectObject( hdc, pen );
MoveToEx( hdc, size.x, border, NULL );
LineTo( hdc, size.x, size.y );
LineTo( hdc, border-1, size.y );
SelectObject( hdc, old_pen );
} /* drawBottomRightCorner */
/*
* drawBottomRightInsideCorner - draw the inside corner of a button
*/
static void drawBottomRightInsideCorner( HDC hdc, POINT size, int border, HPEN pen )
{
HPEN old_pen;
size.x -= 3*border;
size.y -= 3*border;
old_pen = SelectObject( hdc, pen );
MoveToEx( hdc, 2*border, size.y, NULL );
LineTo( hdc, size.x, size.y );
LineTo( hdc, size.x, border );
SelectObject( hdc, old_pen );
} /* drawBottomRightInsideCorner */
/*
* drawBorder - draw to border of a button
*/
static void drawBorder( HDC hdc, POINT size, int border )
{
HPEN old_pen;
int y,x;
y = size.y-1;
x = size.x-1;
old_pen = SelectObject( hdc, blackPen );
MoveToEx( hdc, 0, 0, NULL );
LineTo( hdc, x, 0 );
LineTo( hdc, x, y );
LineTo( hdc, 0, y );
LineTo( hdc, 0, 0 );
SelectObject( hdc, btnFacePen );
MoveToEx( hdc, 0, 0, NULL );
LineTo( hdc, border, 0 );
MoveToEx( hdc, x, 0, NULL );
LineTo( hdc, x, border );
MoveToEx( hdc, x, y, NULL );
LineTo( hdc, x-border, y );
MoveToEx( hdc, 0, y, NULL );
LineTo( hdc, 0, y-border );
SelectObject( hdc, old_pen );
} /* drawBorder */
/*
* toolBarDrawBitmap - draw the bitmap on a button
*/
static void toolBarDrawBitmap( HDC hdc, POINT dst_size, POINT dst_org,
HBITMAP bitmap )
{
BITMAP bm;
HDC memdc;
POINT src_org, src_size;
HBRUSH old_brush;
HBITMAP old_bmp;
DPtoLP( hdc, &dst_size, 1 );
DPtoLP( hdc, &dst_org, 1 );
memdc = CreateCompatibleDC( hdc );
old_bmp = SelectObject( memdc, bitmap );
GetObject( bitmap, sizeof( BITMAP ), &bm );
src_size.x = bm.bmWidth;
src_size.y = bm.bmHeight;
DPtoLP( hdc, &src_size, 1 );
src_org.x = 0;
src_org.y = 0;
DPtoLP( hdc, &src_org, 1 );
#if defined(__NT__) || defined(__WINDOWS__)
SetStretchBltMode( hdc, COLORONCOLOR );
#else
SetStretchBltMode( hdc, STRETCH_DELETESCANS );
#endif
/*
* If it's a monochrome bitmap try and do the right thing - I can see
* this pissing off some users, but oh well.
*/
if( bm.bmBitsPixel == 1 && bm.bmPlanes == 1 ) {
old_brush = SelectObject( hdc, blackBrush );
StretchBlt( hdc, dst_org.x, dst_org.y, dst_size.x, dst_size.y,
memdc, src_org.x, src_org.y, src_size.x, src_size.y, 0xb8074a );
if( old_bmp != HNULL ) {
SelectObject( memdc, old_bmp );
}
SelectObject( hdc, old_brush );
} else {
StretchBlt( hdc, dst_org.x, dst_org.y, dst_size.x, dst_size.y,
memdc, src_org.x, src_org.y, src_size.x, src_size.y, SRCCOPY );
if( old_bmp != HNULL ) {
SelectObject( memdc, old_bmp );
}
}
DeleteDC( memdc );
} /* toolBarDrawBitmap */
/*
* drawButton - draw a button on the toolbar
*/
static void drawButton( HDC hdc, HWND hwnd, tool *tool, BOOL down )
{
toolbar *bar;
HBRUSH brush;
int shift;
BOOL selected;
BOOL got_dc;
POINT dst_size;
POINT dst_org;
HBITMAP used_bmp;
HBITMAP bitmap, oldbmp;
HDC mem;
#if defined(__NT__) || defined(__WINDOWS__)
HBITMAP bitmap2, oldbmp2, bmptmp;
HDC mem2;
RECT fill;
COLORREF cr;
#endif
if( tool->flags & ITEM_BLANK ) {
return;
}
/* draw the button */
bar = GET_INFO( hwnd );
if( tool->flags & ITEM_STICKY ) {
selected = (tool->state == BUTTON_DOWN);
} else {
selected = down;
}
shift = 0;
if( selected ) {
shift = 2*BORDER_WIDTH( bar );
}
got_dc = FALSE;
if( hdc == (HDC)NULL ) {
hdc = GetDC( hwnd );
got_dc = TRUE;
}
mem = CreateCompatibleDC( hdc );
bitmap = CreateCompatibleBitmap( hdc,
bar->button_size.x, bar->button_size.y );
oldbmp = SelectObject( mem, bitmap );
#if defined(__NT__) || defined(__WINDOWS__)
mem2 = CreateCompatibleDC( hdc );
bitmap2 = CreateCompatibleBitmap( hdc,
bar->button_size.x, bar->button_size.y );
oldbmp2 = SelectObject( mem2, bitmap2 );
#endif
brush = btnFaceBrush;
if( selected && bar->bgbrush != HNULL ) {
brush = bar->bgbrush;
}
FillRect( mem, &tool->area, brush );
dst_size = bar->button_size;
dst_size.x -= 4 * BORDER_WIDTH( bar );
dst_size.y -= 4 * BORDER_WIDTH( bar );
dst_org.x = (1 * BORDER_WIDTH( bar ))+shift;
dst_org.y = (1 * BORDER_WIDTH( bar ))+shift;
used_bmp = tool->bitmap;
if( selected ) {
// if the button is selected and it has the ITEM_DOWNBMP flag
// then we draw the alternate bitmap instead.
if( tool->flags & ITEM_DOWNBMP ) {
used_bmp = tool->depressed;
}
}
toolBarDrawBitmap( mem, dst_size, dst_org, used_bmp );
#if defined(__NT__) || defined(__WINDOWS__)
/* New, on WIN32 platforms, use TB_TransparentBlt() */
/* Get background color of button bitmap */
bmptmp = SelectObject(mem2, used_bmp);
/* Expects 0,0 pix in original to be in background color */
cr = GetPixel(mem2, 0, 0);
bmptmp = SelectObject(mem2, bmptmp);
/* IMPORTANT: must set required new background color for dest bmp */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -