📄 toolbr.c
字号:
SetBkColor(mem2, GetSysColor(COLOR_BTNFACE));
fill.top = 0;
fill.left = 0;
fill.right = bar->button_size.x;
fill.bottom = bar->button_size.y;
FillRect(mem2, &fill, brush);
TB_TransparentBlt( mem2, dst_org.x, dst_org.y,
dst_size.x, dst_size.y,
mem, cr);
if( oldbmp != HNULL ) {
SelectObject( mem, oldbmp );
DeleteObject(bitmap);
}
DeleteDC(mem);
/* Switch new bitmap into vars expected by code below */
mem = mem2;
bitmap = bitmap2;
oldbmp = oldbmp2;
#endif
drawBorder( mem, bar->button_size, BORDER_WIDTH( bar ) );
if( selected ) {
drawTopLeftCorner( mem, bar->button_size, BORDER_WIDTH( bar ),
btnShadowPen );
drawTopLeftInsideCorner( mem, bar->button_size, BORDER_WIDTH( bar ),
btnFacePen );
} else {
drawTopLeftCorner( mem, bar->button_size, BORDER_WIDTH( bar ),
btnHighlightPen );
drawBottomRightCorner( mem, bar->button_size, BORDER_WIDTH( bar ),
btnShadowPen );
drawBottomRightInsideCorner( mem, bar->button_size, BORDER_WIDTH( bar ),
btnShadowPen );
}
BitBlt( hdc, tool->area.left, tool->area.top,
bar->button_size.x, bar->button_size.y,
mem, 0, 0, SRCCOPY ); /* copy it to screen */
if( oldbmp != HNULL ) {
SelectObject( mem, oldbmp );
}
if( got_dc ) {
ReleaseDC( hwnd, hdc );
}
DeleteObject( bitmap );
DeleteDC( mem );
} /* drawButton */
/*
* isPointInToolbar - is the point in the mousemove message in the toolbar
*/
BOOL isPointInToolbar( HWND hwnd, WPARAM wparam, LPARAM lparam )
{
POINT p;
RECT r;
wparam = wparam;
MAKE_POINT( p, lparam );
GetClientRect( hwnd, &r );
if( PtInRect( &r, p ) ) {
return( TRUE );
}
return( FALSE );
} /* isPointInToolbar */
/*
* findToolAtPoint - find a tool at a given point
*/
static tool *findToolAtPoint( toolbar *bar, LPARAM lparam )
{
POINT p;
tool *tool;
p.x = LOWORD( lparam );
p.y = HIWORD( lparam );
for( tool = bar->tool_list; tool != NULL; tool = tool->next ) {
if( PtInRect( &tool->area, p ) ) {
if( tool->flags & ITEM_BLANK ) {
return( NULL );
} else {
return( tool );
}
}
}
return( NULL );
} /* findToolAtPoint */
/*
* HasToolAtPoint - return TRUE if tool exists at a given point
*/
BOOL HasToolAtPoint( struct toolbar *bar, LPARAM lparam )
{
return( findToolAtPoint( bar, lparam ) != NULL );
} /* HasToolAtPoint */
/*
* FindToolIDAtPoint - Find the toolID at a given point, if any. Returns
* TRUE if tool exists at a given point.
*/
BOOL FindToolIDAtPoint( struct toolbar *bar, LPARAM lparam, UINT *id )
{
tool *ctool;
ctool = findToolAtPoint( bar, lparam );
if( ctool != NULL ) {
*id = ctool->id;
return TRUE;
} else {
return FALSE;
}
}
/*
* ToolBarWndProc - callback routine for the tool bar
*/
LONG WINEXP ToolBarWndProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam )
{
CREATESTRUCT __FAR__ *cs;
toolbar *bar;
tool *tool;
RECT inter;
HDC hdc;
PAINTSTRUCT ps;
BOOL posted;
bar = GET_INFO( hwnd );
if( msg == WM_CREATE ) {
cs = MAKEPTR( lparam );
bar = cs->lpCreateParams;
#ifdef __WINDOWS_386__
bar = MapAliasToFlat( (DWORD) bar );
#endif
bar->hwnd = hwnd;
SET_INFO( hwnd, bar );
}
if( bar != NULL && bar->hook != NULL ) {
if( bar->hook( hwnd, msg, wparam, lparam ) && msg != WM_DESTROY ) {
return( 0L );
}
}
switch( msg ) {
case WM_SIZE:
if( bar && bar->tool_list && !bar->is_fixed ) {
createButtonList( hwnd, bar, bar->tool_list );
InvalidateRect( hwnd, NULL, TRUE );
UpdateWindow( hwnd );
}
break;
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
if( bar && bar->tool_list ) {
currTool = NULL;
tool = findToolAtPoint( bar, lparam );
if( tool ) {
if( bar->hook != NULL ) {
bar->hook( hwnd, WM_USER, tool->id, 0L );
}
currTool = tool;
drawButton( (HDC)NULL, hwnd, tool, TRUE );
mouse_captured = TRUE;
SetCapture( hwnd );
currIsDown = TRUE;
if( bar->helphook != NULL ) {
bar->helphook( hwnd, currTool->id, TRUE );
}
}
}
break;
case WM_RBUTTONUP:
case WM_LBUTTONUP:
if( bar && bar->tool_list ) {
tool = findToolAtPoint( bar, lparam );
posted = FALSE;
if( tool != NULL ) {
if( tool == currTool ) {
PostMessage( bar->owner, WM_COMMAND, tool->id, 0 );
posted = TRUE;
drawButton( (HDC)NULL, hwnd, tool, FALSE );
}
}
if( !posted && bar->hook != NULL ) {
if( currTool != NULL ) {
bar->hook( hwnd, WM_USER, currTool->id, 1L );
}
}
if( currTool != NULL ) {
mouse_captured = FALSE;
ignore_mousemove = TRUE; // release_capture generates a
// WM_MOUSEMOVE
ReleaseCapture();
if( bar->helphook != NULL ) {
bar->helphook( hwnd, currTool->id, FALSE );
}
currTool = NULL;
}
}
break;
case WM_MOUSEMOVE:
if( ignore_mousemove ) {
ignore_mousemove = FALSE;
break;
}
tool = findToolAtPoint( bar, lparam );
if( currTool ) {
if( tool == currTool ) {
if( !currIsDown ) {
currIsDown = TRUE;
drawButton( (HDC)NULL, hwnd, currTool, TRUE );
if( bar->helphook != NULL ) {
bar->helphook( hwnd, currTool->id, TRUE );
}
}
} else {
if( currIsDown ) {
drawButton( (HDC)NULL, hwnd, currTool, FALSE );
currIsDown = FALSE;
if( bar->helphook != NULL ) {
bar->helphook( hwnd, currTool->id, FALSE );
}
}
}
} else {
if( bar->helphook != NULL ) {
if( tool ) {
bar->helphook( hwnd, tool->id, TRUE );
lastID = tool->id;
} else if( lastID != (WORD)-1 ) {
bar->helphook( hwnd, lastID, FALSE );
lastID = -1;
}
}
}
break;
#if defined(__NT__) || defined(__WINDOWS__)
case WM_SYSCOLORCHANGE:
ToolBarChangeSysColors((COLORREF)0L, (COLORREF)0L, (COLORREF)0L);
break;
#endif
case WM_PAINT:
#if defined(__NT__) || defined(__WINDOWS__)
if(crButtonFace != GetSysColor( COLOR_BTNFACE )) {
/* WM_SYSCOLORCHANGED: sometimes not received by window.
Have to fake it... */
ToolBarChangeSysColors((COLORREF)0L, (COLORREF)0L, (COLORREF)0L);
}
#endif
hdc = BeginPaint( hwnd, &ps );
FillRect( hdc, &ps.rcPaint, btnFaceBrush );
for( tool = bar->tool_list; tool != NULL; tool = tool->next ) {
if( IntersectRect( &inter, &ps.rcPaint, &tool->area ) ) {
drawButton( hdc, hwnd, tool, FALSE );
}
}
EndPaint( hwnd, &ps );
break;
case WM_DESTROY:
bar->hwnd = HNULL;
break;
}
return( DefWindowProc( hwnd, msg, wparam, lparam ) );
} /* ToolBarWndPproc */
/*
* ChangeToolButtonBitmap - change a bitmap for a toolbar item
*/
void ChangeToolButtonBitmap( toolbar *bar, int id, HBITMAP newbmp )
{
tool *t;
t = findTool( bar->tool_list, id );
if( t != NULL ) {
t->bitmap = newbmp;
InvalidateRect( bar->hwnd, &t->area, TRUE );
UpdateWindow( bar->hwnd );
}
} /* ChangeToolButtonBitmap */
#if defined(__NT__) || defined(__WINDOWS__)
/*
* TB_TransparentBlt
*
* Purpose: Given two DC's and a color to assume as transparent in
* the source, BitBlts the bitmap to the dest DC letting the existing
* background show in place of the transparent color.
* Adapted from an old MS SDK sample.
*
* NOTE: make sure BkColor is set in dest hDC.
*
* Parameters: hDC HDC destination, on which to draw.
* x, y UINT location at which to draw the bitmap
* width UINT width to draw
* height UINT height to draw
* hDCIn HDC source, to draw from
* cr COLORREF to consider as transparent in source.
*
* Return Value: None
*/
#define ROP_DSPDxax 0x00E20746
void TB_TransparentBlt( HDC hDC, UINT x, UINT y, UINT width, UINT height,
HDC hDCIn, COLORREF cr )
{
HDC hDCMid, hMemDC;
HBITMAP hBmpMono, hBmpT;
HBRUSH hBr, hBrT;
COLORREF crBack, crText;
if( NULL == hDCIn )
return;
/* Make two intermediate DC's */
hDCMid = CreateCompatibleDC( hDC );
hMemDC = CreateCompatibleDC( hDC );
/* Create a monochrome bitmap for masking */
hBmpMono = CreateCompatibleBitmap( hDCMid, x + width, y + height );
SelectObject( hDCMid, hBmpMono );
/* Create a mid-stage bitmap */
hBmpT = CreateCompatibleBitmap( hDC, x + width, y + height );
SelectObject( hMemDC, hBmpT );
/* Create a monochrome mask where we have 0's in the image, 1's elsewhere. */
crBack = SetBkColor( hDCIn, cr );
BitBlt( hDCMid, x, y, width, height, hDCIn, x, y, SRCCOPY );
SetBkColor( hDCIn, crBack );
/* Put the unmodified image in the temporary bitmap */
BitBlt( hMemDC, x, y, width, height, hDCIn, x, y, SRCCOPY );
/* Create an select a brush of the background color */
hBr = CreateSolidBrush( GetBkColor( hDC ) );
hBrT = SelectObject( hMemDC, hBr );
/* Force conversion of the monochrome to stay black and white. */
crText = SetTextColor( hMemDC, 0L );
crBack = SetBkColor( hMemDC, RGB( 255, 255, 255 ) );
/*
* Where the monochrome mask is 1, Blt the brush; where the mono
* mask is 0, leave the destination untouched. This results in
* painting around the image with the background brush. We do this
* first in the temporary bitmap, then put the whole thing to the
* screen (avoids flicker).
*/
BitBlt( hMemDC, x, y, width, height, hDCMid, x, y, ROP_DSPDxax );
BitBlt( hDC, x, y, width, height, hMemDC, x, y, SRCCOPY );
SetTextColor( hMemDC, crText );
SetBkColor( hMemDC, crBack );
SelectObject( hMemDC, hBrT );
DeleteObject( hBr );
DeleteDC( hMemDC );
DeleteDC( hDCMid );
DeleteObject( hBmpT );
DeleteObject( hBmpMono );
} /* TansparentBlt () */
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -