📄 gizmobar.c
字号:
if (!pGB->fTracking)
break;
pGizmo=pGB->pGizmoTrack;
SetRect(&rc, pGizmo->x, pGizmo->y, pGizmo->x+pGizmo->dx
, pGizmo->y+pGizmo->dy);
fTemp=pGB->fMouseOut;
pGB->fMouseOut=!PtInRect(&rc, pt);
//If the mouse went out, change state to the original.
if (!fTemp && pGB->fMouseOut)
{
GizmoPStateSet(hWnd, pGizmo, pGizmo->uStateOrg);
if (NULL!=pGB->hWndAssociate)
{
//Notify that we left the button
if (pGizmo->fNotify)
SendMenuSelect(pGB->hWndAssociate, 0, ~0, 0);
}
}
if (fTemp && !pGB->fMouseOut)
{
GizmoPStateSet(hWnd, pGizmo
, ATTRIBUTEBUTTON_MOUSEDOWN);
if (NULL!=pGB->hWndAssociate)
{
//Notify that we pressed down again
if (pGizmo->fNotify)
{
SendMenuSelect(pGB->hWndAssociate
, pGizmo->uID , 0, 0);
}
}
}
break;
case WM_LBUTTONUP:
if (!pGB->fTracking)
break;
pGB->fTracking=FALSE;
pGizmo=pGB->pGizmoTrack;
ReleaseCapture();
/*
* Repaint if we were actually below the mouse when this
* occurred. For command buttons, pop the button up.
* For attributes, either toggle the state (inclusive
* buttons) or check the selected one (exclusive buttons)
*/
if (!pGB->fMouseOut)
{
//Command buttons always come up.
if (GIZMOTYPE_BUTTONCOMMAND==pGizmo->iType)
GizmoPStateSet(hWnd, pGizmo, COMMANDBUTTON_UP);
//Attribute inclusive buttons toggle
if (GIZMOTYPE_BUTTONATTRIBUTEIN==pGizmo->iType)
{
GizmoPCheck(hWnd, pGizmo, !(BUTTONGROUP_DOWN
& pGizmo->uStateOrg));
}
//Attribure exclusive buttons are always checked.
if (GIZMOTYPE_BUTTONATTRIBUTEEX==pGizmo->iType)
GizmoPCheck(hWnd, pGizmo, TRUE);
//Only send messages if notify is ON.
if (NULL!=pGB->hWndAssociate && pGizmo->fNotify)
{
SendMenuSelect(pGB->hWndAssociate, 0, ~0, 0);
SendCommand(pGB->hWndAssociate, pGizmo->uID
, BN_CLICKED, hWnd);
}
}
break;
case WM_COMMAND:
//Pass control messages on if the gizmo's notify is ON.
if (NULL!=pGB->hWndAssociate)
{
pGizmo=PGizmoFromHwndID(hWnd, wID);
if (NULL!=pGizmo)
{
if (pGizmo->fNotify)
{
SendMessage(pGB->hWndAssociate, iMsg, wParam
, lParam);
}
}
}
break;
default:
return DefWindowProc(hWnd, iMsg, wParam, lParam);
}
return 0L;
}
/*
* GizmoBarPaint
*
* Purpose:
* Handles all WM_PAINT messages for the control and paints either
* the entire thing or just one GizmoBar button if pGB->pGizmoPaint
* is non-NULL.
*
* Parameters:
* hWnd HWND Handle to the control.
* pGB PGIZMOBAR control data pointer.
*
* Return Value:
* None
*/
void GizmoBarPaint(HWND hWnd, PGIZMOBAR pGB)
{
RECT rc;
HDC hDC;
HBRUSH hBr=NULL;
HPEN hPen=NULL;
PAINTGIZMO pg;
hDC=BeginPaint(hWnd, &pg.ps);
GetClientRect(hWnd, &rc);
/*
* The only part of the frame we need to draw is the bottom line,
* so we inflate the rectangle such that all other parts are
* outside the visible region.
*/
hBr=CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
if (NULL!=hBr)
SelectObject(hDC, hBr);
hPen=CreatePen(PS_SOLID, 1, GetSysColor(COLOR_WINDOWFRAME));
if (NULL!=hPen)
SelectObject(hDC, hPen);
Rectangle(hDC, rc.left-1, rc.top-1, rc.right+1, rc.bottom);
/*
* All that we have to do to draw the controls is start through
* the list, ignoring anything but buttons, and calling BTTNCUR's
* UIToolButtonDraw for buttons. Since we don't even have to
* track positions of things, we can just use an enum.
*/
UIToolConfigureForDisplay(&pg.tdd);
GizmoPEnum(&pGB->pGizmos, FEnumPaintGizmos, (DWORD)(LPTSTR)&pg);
//Clean up
EndPaint(hWnd, &pg.ps);
if (NULL!=hBr)
DeleteObject(hBr);
if (NULL!=hPen)
DeleteObject(hPen);
return;
}
/*
* FEnumPaintGizmos
*
* Purpose:
* Enumeration callback for all the gizmos we know about in order to
* draw them.
*
* Parameters:
* pGizmo PGIZMO to draw.
* iGizmo UINT index on the GizmoBar of this gizmo.
* dw DWORD extra data passed to GizmoPEnum, in our
* case a pointer to a PAINTGIZMO structure.
*
* Return Value:
* BOOL TRUE to continue the enumeration, FALSE
* otherwise.
*/
BOOL WINAPI FEnumPaintGizmos(PGIZMO pGizmo, UINT iGizmo, DWORD dw)
{
PPAINTGIZMO ppg=(PPAINTGIZMO)dw;
RECT rc, rcI;
//Only draw those marked for repaint.
if ((GIZMOTYPE_DRAWN & pGizmo->iType))
{
SetRect(&rc, pGizmo->x, pGizmo->y
, pGizmo->x+pGizmo->dx, pGizmo->y+pGizmo->dy);
//Only draw gizmos in the repaint area
if (IntersectRect(&rcI, &rc, &ppg->ps.rcPaint))
{
UIToolButtonDraw(ppg->ps.hdc, pGizmo->x, pGizmo->y
, pGizmo->dx, pGizmo->dy, pGizmo->hBmp
, pGizmo->cxImage, pGizmo->cyImage, pGizmo->iBmp
, (UINT)pGizmo->uState, &ppg->tdd);
}
}
return TRUE;
}
/*
* FEnumChangeFont
*
* Purpose:
* Enumeration callback for all the gizmos we know about in order to
* send a new font to them that's stored in PGIZMOBAR in dw.
*
* Parameters:
* pGizmo PGIZMO to draw.
* iGizmo UINT index on the GizmoBar of this gizmo.
* dw DWORD extra data passed to GizmoPEnum, in our
* case the GizmoBar's pGB.
*
* Return Value:
* BOOL TRUE to continue the enumeration, FALSE otherwise.
*/
BOOL WINAPI FEnumChangeFont(PGIZMO pGizmo, UINT iGizmo, DWORD dw)
{
PGIZMOBAR pGB=(PGIZMOBAR)dw;
//Only need to change fonts in windowed controls using WM_SETFONT
if (NULL!=pGizmo->hWnd)
{
SendMessage(pGizmo->hWnd, WM_SETFONT
, (WPARAM)pGB->hFont, 1L);
}
return TRUE;
}
/*
* FEnumEnable
*
* Purpose:
* Enumeration callback for all the gizmos we know about in order to
* enable or disable them from the WM_ENABLE message.
*
* Parameters:
* pGizmo PGIZMO to draw.
* iGizmo UINT index on the GizmoBar of this gizmo.
* dw DWORD extra data passed to GizmoPEnum, in our
* case the GizmoBar's pGB.
*
* Return Value:
* BOOL TRUE to continue the enumeration, FALSE
* otherwise.
*/
BOOL WINAPI FEnumEnable(PGIZMO pGizmo, UINT iGizmo, DWORD dw)
{
PGIZMOBAR pGB=(PGIZMOBAR)dw;
BOOL fEnable=pGB->fEnabled;
//NOTE: This code is duplicated in GBGizmoEnable in API.C
if (NULL!=pGizmo->hWnd)
EnableWindow(pGizmo->hWnd, fEnable);
else
{
//If we're not down, command and attribute buttons act same.
if (!(BUTTONGROUP_DOWN & pGizmo->uState))
{
GizmoPStateSet(pGB->hWnd, pGizmo, fEnable
? COMMANDBUTTON_UP : COMMANDBUTTON_DISABLED);
}
else
{
/*
* Attribute buttons are a little more sensitive
* with DOWNDISABLED
*/
GizmoPStateSet(pGB->hWnd, pGizmo, fEnable
? ATTRIBUTEBUTTON_DOWN
: ATTRIBUTEBUTTON_DOWNDISABLED);
}
}
return TRUE;
}
/*
* FEnumHitTest
*
* Purpose:
* Enumeration callback for all the gizmos we know about in order to
* hit-test them.
*
* Parameters:
* pGizmo PGIZMO to draw.
* iGizmo UINT index on the GizmoBar of this gizmo.
* dw DWORD extra data passed to GizmoPEnum, in our
* case the hDC on which to draw.
*
* Return Value:
* BOOL TRUE to continue the enumeration, FALSE
* otherwise.
*/
BOOL WINAPI FEnumHitTest(PGIZMO pGizmo, UINT iGizmo, DWORD dw)
{
RECT rc;
POINT pt;
POINTFROMLPARAM(pt, dw);
/*
* Hit tests have to happen on visible, enabled, and drawn
* controls only.
*/
if (GIZMOTYPE_DRAWN & pGizmo->iType && !pGizmo->fHidden
&& !(BUTTONGROUP_DISABLED & pGizmo->uState))
{
SetRect(&rc, pGizmo->x, pGizmo->y
, pGizmo->x+pGizmo->dx, pGizmo->y+pGizmo->dy);
//Stop enumeration if we have a hit.
return !PtInRect(&rc, pt);
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -