📄 toolbar.c
字号:
NotifyParent(hwnd, (GETSHIFTED(hwnd) ? BTN_SHIFT : 0)
+ BTN_DBLCLICK + iButton);
else
NotifyParent(hwnd, (GETSHIFTED(hwnd) ? BTN_SHIFT : 0)
+ iButton);
/* Invalidate the Rect of the button being pressed */
toolbarRectFromIndex(hwnd, iBtnPos, &rc);
InvalidateRect(hwnd, &rc, FALSE);
/* Invalidate the Rect of the button losing focus */
toolbarRectFromIndex(hwnd, iOldPos, &rc);
InvalidateRect(hwnd, &rc, FALSE);
/* Force re-paint now */
UpdateWindow(hwnd);
/* Set a timer for repeated mouse downs */
SetTimer(hwnd, TIMER_BUTTONREPEAT,
MSEC_BUTTONREPEAT, NULL);
}
return 0L;
case WM_MOUSEMOVE:
#if 0
/* This should be impossible - it means that the system lost */
/* a mouse up (maybe codeview is up?) We need to force a */
/* mouse up at this point. */
if (GetCapture() == hwnd &&
(wParam & (MK_LBUTTON | MK_RBUTTON) == 0))
SendMessage(hwnd, WM_LBUTTONUP, 0, lParam);
#endif
/* Mouse moving while pressing a button? If not, ignore. */
if (GetCapture() == hwnd) {
int iPrevState, iState, iButton, iType;
BOOL fPressed;
/* Which button is being pressed down? */
iBtnPos = GETWHICH(hwnd);
/* Where is mouse cursor now? */
pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam);
/* where is button being pressed? Are we still on */
/* top of that button or have we moved? */
toolbarRectFromIndex(hwnd, iBtnPos, &rc);
fPressed = PtInRect(&rc, pt);
/* Let go if we move off of the button, but don't */
/* act like it was pressed. */
/* Also, push it back down if we move back on top */
/* of it (while the mouse button is STILL down). */
if (fPressed != GETPRESSED(hwnd)) {
/* update: is this button pressed anymore? */
SETPRESSED(hwnd, fPressed);
iType = toolbarTypeFromIndex(hwnd, iBtnPos);
iButton = toolbarButtonFromIndex(hwnd, iBtnPos);
iState = toolbarFullStateFromButton(hwnd, iButton);
/* The mouse moved back onto the button while */
/* the mouse button was still pressed. */
if (fPressed) {
/* Push the push button back down again */
if (iType == BTNTYPE_PUSH)
toolbarModifyState(hwnd, iButton,
BTNST_DOWN);
/* Push the radio or checkbox button ALL the */
/* way down again. */
if (iType >= BTNTYPE_RADIO ||
iType == BTNTYPE_CHECKBOX)
toolbarModifyState(hwnd, iButton,
BTNST_FULLDOWN);
toolbarModifyActivity(hwnd, iButton,
BTNACT_MOUSEMOVEON);
NotifyParent(hwnd,
(GETSHIFTED(hwnd) ? BTN_SHIFT : 0) +
iButton);
/* We moved the mouse off of the toolbar button */
/* while still holding the mouse button down. */
} else {
/* lift the push button up */
if (iType == BTNTYPE_PUSH)
toolbarModifyState(hwnd, iButton,
BTNST_UP);
/* Restore radio button or checkbox button to */
/* where it was before pressed */
if (iType >= BTNTYPE_RADIO ||
iType == BTNTYPE_CHECKBOX) {
iPrevState = toolbarPrevStateFromButton(hwnd,
iButton);
toolbarModifyState(hwnd, iButton, iPrevState);
}
toolbarModifyActivity(hwnd, iButton,
BTNACT_MOUSEMOVEOFF);
NotifyParent(hwnd,
(GETSHIFTED(hwnd) ? BTN_SHIFT : 0) +
toolbarButtonFromIndex(hwnd, iBtnPos));
}
}
}
return 0L;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
/* If we don't have capture, we aren't expecting this. Ignore */
if (GetCapture() == hwnd) {
int iPrevState, iState, iButton, iType;
/* Who has the focus? */
iBtnPos = GETWHICH(hwnd);
/* Release the mouse */
ReleaseCapture();
/* No more repeats of the mouse button downs */
KillTimer(hwnd, TIMER_BUTTONREPEAT);
/* Everything you wanted to know about the button */
toolbarRectFromIndex(hwnd, iBtnPos, &rc);
iType = toolbarTypeFromIndex(hwnd, iBtnPos);
iButton = toolbarButtonFromIndex(hwnd, iBtnPos);
iState = toolbarFullStateFromButton(hwnd, iButton);
/* Don't do anything if we've moved off the button */
if (GETPRESSED(hwnd)) {
/* No longer down */
SETPRESSED(hwnd, FALSE);
/* Bring the push button up */
if (iType == BTNTYPE_PUSH)
toolbarModifyState(hwnd, iButton, BTNST_UP);
/* Bring the checkbox to the opposite state it was in */
if (iType == BTNTYPE_CHECKBOX) {
iPrevState = toolbarPrevStateFromButton(hwnd,
iButton);
if (iPrevState == BTNST_DOWN)
toolbarModifyState(hwnd, iButton, BTNST_UP);
if (iPrevState == BTNST_UP)
toolbarModifyState(hwnd, iButton, BTNST_DOWN);
}
/* Force a radio button down, and bring all */
/* other radio buttons of this type up */
if (iType >= BTNTYPE_RADIO) {
toolbarModifyState(hwnd, iButton, BTNST_DOWN);
toolbarExclusiveRadio(hwnd, iType, iButton);
}
/* Notify the parent that the mouse button came up */
/* on this button so the app can do something. */
/* Every button should notify the app, not just a */
/* custom button. */
toolbarModifyActivity(hwnd, iButton, BTNACT_MOUSEUP);
NotifyParent(hwnd,
(GETSHIFTED(hwnd) ? BTN_SHIFT : 0) + iButton);
}
}
return 0L;
case WM_TIMER:
/* If we have a tool button down, send a repeat message */
if (GETPRESSED(hwnd)) {
int iButton, iType;
iBtnPos = GETWHICH(hwnd);
iButton = toolbarButtonFromIndex(hwnd, iBtnPos);
iType = toolbarTypeFromIndex(hwnd, iBtnPos);
NotifyParent(hwnd, BTN_REPEAT +
(GETSHIFTED(hwnd) ? BTN_SHIFT : 0) +
toolbarButtonFromIndex(hwnd, iBtnPos));
}
break;
case WM_DESTROY:
if (GETBMPHANDLE(hwnd))
DeleteObject(GETBMPHANDLE(hwnd));
SETBMPHANDLE(hwnd, NULL);
if (GETARRAYBUTT(hwnd))
GlobalFree(GETARRAYBUTT(hwnd));
SETARRAYBUTT(hwnd, NULL);
break;
case WM_SETTEXT:
break;
/* MANY, MANY cases deleted */
case WM_SETFOCUS: // focus comes to toolbar window
{
/* Remember who had the focus and give it back. Of course, */
/* if by some wierdness that button is now grayed, give it */
/* to the next person in line. */
iBtnPos = GETWHICH(hwnd);
if (iBtnPos < 0 || iBtnPos >= toolbarGetNumButtons(hwnd)) {
iBtnPos = 0;
SETWHICH(hwnd, 0);
}
do {
iButton = toolbarButtonFromIndex(hwnd, iBtnPos);
if (toolbarFullStateFromButton(hwnd, iButton)
!= BTNST_GRAYED)
break; // give it here
iBtnPos++;
if (iBtnPos >= toolbarGetNumButtons(hwnd))
iBtnPos = 0; // wrap around
if (iBtnPos == GETWHICH(hwnd))
return 0L; // uh-oh! They're all gray!
} while (iBtnPos != GETWHICH(hwnd));
SETWHICH(hwnd, iBtnPos); // give focus here
/* And redraw! */
toolbarRectFromIndex(hwnd, iBtnPos, &rc);
InvalidateRect(hwnd, &rc, FALSE);
UpdateWindow(hwnd);
return 0;
}
case WM_KILLFOCUS:
/* Send a KEYUP if one is pending */
if (GETKEYPRESSED(hwnd))
SendMessage(hwnd, WM_KEYUP, VK_SPACE, 0L);
/* Redraw the focused button, because now that focus is gone */
/* from our toolbar window, the focused button won't be */
/* focused anymore, although we remember which one it was. */
toolbarRectFromIndex(hwnd, GETWHICH(hwnd), &rc);
InvalidateRect(hwnd, &rc, FALSE);
UpdateWindow(hwnd);
return 0;
case WM_SYSKEYDOWN:
/* Send a KEYUP if one is pending */
if (GETKEYPRESSED(hwnd))
SendMessage(hwnd, WM_KEYUP, VK_SPACE, 0L);
break; // MUST LET DEFWNDPROC RUN!!! (to handle the key)
case WM_GETDLGCODE:
return DLGC_WANTARROWS | DLGC_WANTTAB;
case WM_KEYDOWN:
/* Window disabled or a key is already down */
if (IsWindowEnabled(hwnd) && !GETPRESSED(hwnd)) {
/* Tab forward to next button and move focus there */
if (wParam == VK_TAB && GetKeyState(VK_SHIFT) >= 0 ) {
/* Move Focus forward one. If */
/* we've tabbed off of the toolbar, it's time */
/* to go on to the next control. We need to invldte */
/* because we might be the only control and we need */
/* to repaint to show the new button with highlight */
/* after it wrapped around the end of the toolbar. */
if (!toolbarMoveFocus(hwnd, FALSE)) {
PostMessage(GetParent(hwnd), WM_NEXTDLGCTL, 0, 0L);
toolbarRectFromIndex(hwnd, GETWHICH(hwnd), &rc);
InvalidateRect(hwnd, &rc, FALSE);
}
return 0L;
}
if (wParam == VK_TAB && GetKeyState(VK_SHIFT) < 0 ) {
/* Move focus backward one. If */
/* We've tabbed off of the toolbar, it's time */
/* to go on to the next control. We need to invldte */
/* because we might be the only control and we need */
/* to repaint to show the new button with highlight */
/* after it wrapped around the end of the toolbar. */
if (!toolbarMoveFocus(hwnd, TRUE)) {
PostMessage(GetParent(hwnd), WM_NEXTDLGCTL, 1, 0L);
toolbarRectFromIndex(hwnd, GETWHICH(hwnd), &rc);
InvalidateRect(hwnd, &rc, FALSE);
}
return 0L;
}
if ((wParam == VK_SPACE) && (GetCapture() != hwnd)) {
int iButton, iType, iState;
/* Same as mouse button down -- Press the button! */
iBtnPos = GETWHICH(hwnd);
iType = toolbarTypeFromIndex(hwnd, iBtnPos);
iButton = toolbarButtonFromIndex(hwnd, iBtnPos);
iState = toolbarFullStateFromButton(hwnd, iButton);
/* ignore multiple key downs */
if (!GETKEYPRESSED(hwnd)) {
SETKEYPRESSED(hwnd, TRUE); // a key is pressed
SETSHIFTED(hwnd, FALSE); // NEVER shifted
SETPRESSED(hwnd, TRUE); // a button is pressed
/* Push button goes down - with focus */
if (iType == BTNTYPE_PUSH)
toolbarModifyState(hwnd, iButton, BTNST_DOWN);
/* Radio or checkbox button goes full down */
/* with focus - and remember previous state*/
if (iType >= BTNTYPE_RADIO ||
iType == BTNTYPE_CHECKBOX) {
toolbarModifyPrevState(hwnd, iButton, iState);
toolbarModifyState(hwnd, iButton,
BTNST_FULLDOWN);
}
toolbarModifyActivity(hwnd, iButton,
BTNACT_KEYDOWN);
NotifyParent(hwnd, (GETSHIFTED(hwnd)
? BTN_SHIFT : 0) + iButton);
return 0L;
}
/* If this is another KEYDOWN msg, it's a REPEAT */
/* Notify parent. */
NotifyParent(hwnd, BTN_REPEAT +
(GETSHIFTED(hwnd) ? BTN_SHIFT : 0) +
toolbarButtonFromIndex(hwnd,
GETWHICH(hwnd)));
}
}
break;
case WM_KEYUP:
/* A button was pressed and should come up now */
if ((wParam == VK_SPACE) && (GETKEYPRESSED(hwnd))) {
int iButton, iState, iType, iPrevState;
iBtnPos = GETWHICH(hwnd); // which button?
SETKEYPRESSED(hwnd, FALSE); // let go
SETPRESSED(hwnd, FALSE);
/* Everything about this button */
toolbarRectFromIndex(hwnd, iBtnPos, &rc);
iType = toolbarTypeFromIndex(hwnd, iBtnPos);
iButton = toolbarButtonFromIndex(hwnd, iBtnPos);
iState = toolbarFullStateFromButton(hwnd, iButton);
/* Bring a push button up */
if (iType == BTNTYPE_PUSH)
toolbarModifyState(hwnd, iButton, BTNST_UP);
/* Bring a checkbox to the opposite state it was in */
if (iType == BTNTYPE_CHECKBOX) {
iPrevState = toolbarPrevStateFromButton(hwnd, iButton);
if (iPrevState == BTNST_DOWN)
toolbarModifyState(hwnd, iButton, BTNST_UP);
if (iPrevState == BTNST_UP)
toolbarModifyState(hwnd, iButton, BTNST_DOWN);
}
/* Bring a radio button down, and bring all others in */
/* its group up. */
if (iType >= BTNTYPE_RADIO) {
toolbarModifyState(hwnd, iButton, BTNST_DOWN);
toolbarExclusiveRadio(hwnd, iType, iButton);
}
toolbarModifyActivity(hwnd, iButton, BTNACT_KEYUP);
NotifyParent(hwnd, toolbarButtonFromIndex(hwnd,
(GETSHIFTED(hwnd) ? BTN_SHIFT : 0) +
GETWHICH(hwnd)));
}
break;
case WM_SYSCOLORCHANGE:
/* load the bitmap of what all the buttons look like */
/* and change the colours to the system colours. */
hInst = GETHINST(hwnd);
ibmp = GETBMPINT(hwnd);
hbm = GETBMPHANDLE(hwnd);
if (hbm)
DeleteObject(hbm);
hbm = LoadUIBitmap(hInst, MAKEINTRESOURCE(ibmp),
GetSysColor(COLOR_BTNTEXT),
GetSysColor(COLOR_BTNFACE),
GetSysColor(COLOR_BTNSHADOW),
GetSysColor(COLOR_BTNHIGHLIGHT),
GetSysColor(COLOR_BTNFACE),
GetSysColor(COLOR_WINDOWFRAME));
SETBMPHANDLE(hwnd, hbm);
#ifdef _WIN32
return (long) hbm;
#else
return MAKELONG(hbm, 0);
#endif
case WM_ERASEBKGND:
break;
case WM_PAINT:
/* Call our paint code */
BeginPaint(hwnd, &ps);
toolbarPaintControl(hwnd, ps.hdc);
EndPaint(hwnd, &ps);
return 0L;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -