📄 msgbar.c
字号:
: WHITE_BRUSH));
SetBkColor (hDC, ColorBits > 2 ? RGB(192,192,192) : RGB(255,255,255));
SetBkMode (hDC, TRANSPARENT);
if (wID)
wTag |= 1;
if (wID)
{
hOldPen = SelectObject (hDC, GetStockObject (NULL_PEN));
if ((wID = WseGetMsgBarItemID (hMBAR, wID, NULL)) == ERROR_MBARID)
{
SelectObject (hDC, hOldPen);
if (wTag & 2)
ReleaseDC (hWnd, hDC);
return FALSE;
}
pItem = pMBAR->mbars+wID;
rect = &(pItem->rect);
if (rect->bottom > rect->top)
Rectangle (hDC,
(wID && pItem[-1].type != MBAR_LINEBREAK)
? pItem[-1].rect.right+1
: rect->left,
rect->top,
(wID != pMBAR->items-1 && pItem[1].type != MBAR_LINEBREAK)
? pItem[1].rect.left+1
: rect->right+2,
rect->bottom+2);
SelectObject (hDC, hOldPen);
}
else
Rectangle (hDC, -1, -1, pMBAR->rect.right+1, pMBAR->rect.bottom+1);
if (hFont = pMBAR->hfont)
hOldFont = SelectObject (hDC, pMBAR->hfont);
for (pItem = pMBAR->mbars, i = 0; i < pMBAR->items; i++, pItem++)
{
if ((wTag & 1) && i != wID || pItem->type == MBAR_LINEBREAK)
continue;
rect = &(pItem->rect);
if (rect->bottom <= rect->top || rect->right <= rect->left)
continue;
SetTextAlign (hDC, (pItem->tag & MBAR_CENTER) ? TA_CENTER : TA_LEFT);
OldColor = SetTextColor (hDC, pItem->txtcolor);
if (pItem->hfont != hFont)
{
SelectObject (hDC, pItem->hfont);
hFont = pItem->hfont;
}
switch (pItem->type)
{
case MBAR_MESSAGE:
WseDrawButtonBox (hDC,
rect->left, rect->top,
rect->right, rect->bottom,
FALSE);
WseDrawButtonBox (hDC,
rect->left+1, rect->top+1,
rect->right-1, rect->bottom,
TRUE);
if (!(pItem->tag & MBAR_BITMAP))
{
if (pItem->data && *pItem->data)
MLR_ExtTextOut (hDC,
pItem->tag & MBAR_CENTER
? (rect->left+rect->right)/2
: rect->left+2,
rect->top+2,
ETO_CLIPPED, rect,
pItem->data, lstrlen (pItem->data),
NULL);
}
else if (pItem->data)
WseShowBitmap (hDC, (HBITMAP)pItem->data,
rect->left+1, rect->top+2,
rect->right - rect->left-2,
rect->bottom - rect->top-2);
if (pItem->tag & MBAR_PUSHDOWN)
InvertRect (hDC, rect);
break;
case MBAR_TEXT:
if (!(pItem->tag & MBAR_BITMAP))
{
if (pItem->data && *pItem->data)
MLR_ExtTextOut (hDC,
pItem->tag & MBAR_CENTER
? (rect->left+rect->right)/2
: rect->left+3,
rect->top+2,
ETO_CLIPPED, rect,
pItem->data, lstrlen (pItem->data),
NULL);
}
else if (pItem->data)
WseShowBitmap (hDC, (HBITMAP)pItem->data,
rect->left+2, rect->top+2,
rect->right - rect->left-2,
rect->bottom - rect->top-2);
if (pItem->tag & MBAR_PUSHDOWN)
InvertRect (hDC, rect);
break;
case MBAR_CHKBUTTON:
case MBAR_BUTTON:
if (pItem->tag & MBAR_PUSHDOWN)
{
WseDrawButtonBox (hDC,
rect->left, rect->top,
rect->right, rect->bottom,
TRUE);
WseDrawButtonBox (hDC,
rect->left+1, rect->top+1,
rect->right, rect->bottom,
TRUE);
if (!(pItem->tag & MBAR_BITMAP))
{
if (pItem->data && *pItem->data)
MLR_ExtTextOut (hDC, 1 + (
pItem->tag & MBAR_CENTER
? (rect->left+rect->right)/2
: rect->left+2 ),
rect->top+2,
ETO_CLIPPED, rect,
pItem->data,
lstrlen (pItem->data),
NULL);
}
else if (pItem->data)
WseShowBitmap (hDC, (HBITMAP)pItem->data,
rect->left+2, rect->top+2,
rect->right - rect->left-2,
rect->bottom - rect->top-2);
break;
}
WseDrawButtonBox (hDC,
rect->left, rect->top,
rect->right-1, rect->bottom-1,
FALSE);
WseDrawButtonBox (hDC,
rect->left, rect->top,
rect->right, rect->bottom,
FALSE);
if (!(pItem->tag & MBAR_BITMAP))
{
if (pItem->data && *pItem->data)
MLR_ExtTextOut (hDC,
pItem->tag & MBAR_CENTER
? (rect->left+rect->right)/2
: rect->left+2,
rect->top+1,
ETO_CLIPPED, rect,
pItem->data, lstrlen (pItem->data),
NULL);
}
else if (pItem->data)
WseShowBitmap (hDC, (HBITMAP)pItem->data,
rect->left+1, rect->top+1,
rect->right - rect->left-2,
rect->bottom - rect->top-2);
break;
}
SetTextColor (hDC, OldColor);
}
if (pMBAR->hfont)
SelectObject (hDC, hOldFont);
ReleaseDC (hWnd, hDC);
return TRUE;
}
BOOL MyPtInRect (LPRECT rect, POINTS pt)
{
return !(pt.x < rect->left || pt.x > rect->right ||
pt.y < rect->top || pt.y > rect->bottom);
}
UINT WINAPI WseMsgBarItemFromPoint (HMBAR hMBAR, int x, int y, UINT wTag)
{
UINT i;
PMBARHEADER pMBAR;
PMBARITEM pItem;
POINTS pt;
pMBAR = (PMBARHEADER)hMBAR;
pt.x = x;
pt.y = y;
for (i = 0, pItem = pMBAR->mbars; i < pMBAR->items; i++, pItem++)
{
if (MyPtInRect (&(pItem->rect), pt))
return (wTag & MBAR_POSITION) ? i : pItem->id;
}
return ERROR_MBARID;
}
BOOL WINAPI WseProcessMsgBarMsg (
HMBAR hMBAR,
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
PAINTSTRUCT ps;
PMBARHEADER pMBAR;
PMBARITEM pItem;
RECT rect;
UINT i;
static UINT ActButton = (UINT)-1;
static UINT BtnState = NULL;
pMBAR = (PMBARHEADER)hMBAR;
switch (message)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
for (i = 0, pItem = pMBAR->mbars; i < pMBAR->items; i++, pItem++)
{
if (!(pItem->tag & MBAR_NOCMD) &&
(message==WM_LBUTTONDOWN || pItem->tag & MBAR_RBUTTONCMD) &&
MyPtInRect (&(pItem->rect), *((POINTS *)(&lParam))))
{
BtnState = WseCheckMsgBar (hMBAR, i, MBAR_POSITION, TRUE);
if (!BtnState)
WsePaintMsgBarWnd (hWnd, hMBAR, pItem->id);
if (pItem->tag & MBAR_DOWNCMD)
{
SendMessage (hWnd, WM_COMMAND,
message == WM_LBUTTONDOWN ? pItem->id
: pItem->id+MBAR_RBUTTONACTIVE,
lParam);
}
else
{
ActButton = i;
SetCapture (hWnd);
}
return TRUE;
break;
}
}
if (message == WM_LBUTTONDOWN)
{
wParam = (WPARAM)GetFocus ();
SendMessage (hWnd, WM_SYSCOMMAND, SC_MOVEWINDOW, NULL);
SetFocus ((HWND)wParam);
GetWindowRect (hWnd, &rect);
rect.right -= rect.left;
rect.bottom -= rect.top;
lParam = *(LPARAM *)▭
if (rect.left < 0)
rect.left = 0;
else if (rect.right+rect.left >= GetSystemMetrics(SM_CXSCREEN))
rect.left = GetSystemMetrics(SM_CXSCREEN)-rect.right;
if (rect.top < 0)
rect.top = 0;
else if (rect.bottom+rect.top >= GetSystemMetrics(SM_CYSCREEN))
rect.top = GetSystemMetrics(SM_CYSCREEN)-rect.bottom;
WseMoveMsgBar (hMBAR, rect.left, rect.top);
if (lParam != *(LPARAM *)&rect)
MoveWindow (hWnd,
rect.left, rect.top ? rect.top : -1,
rect.right, rect.bottom,
TRUE);
}
break;
case WM_MOUSEMOVE:
if (ActButton == -1 || !(wParam & (MK_LBUTTON | MK_RBUTTON)))
break;
pItem = pMBAR->mbars+ActButton;
i = MyPtInRect (&(pItem->rect), *((POINTS *)(&lParam)));
if ((i || BtnState) ^
WseCheckMsgBar (hMBAR, ActButton, MBAR_POSITION, i || BtnState))
WsePaintMsgBarWnd (hWnd, hMBAR, pItem->id);
if (!i)
{
for (i = 0, pItem = pMBAR->mbars;
i < pMBAR->items;
i++, pItem++)
{
if (!(pItem->tag & MBAR_NOCMD) &&
(wParam & MK_LBUTTON || pItem->tag & MBAR_RBUTTONCMD) &&
MyPtInRect (&(pItem->rect), *((POINTS *)(&lParam))))
{
BtnState = WseCheckMsgBar (hMBAR, i, MBAR_POSITION, TRUE);
if (!BtnState)
WsePaintMsgBarWnd (hWnd, hMBAR, pItem->id);
if (pItem->tag & MBAR_DOWNCMD)
{
SendMessage (hWnd, WM_COMMAND,
wParam & MK_LBUTTON ? pItem->id
: pItem->id+MBAR_RBUTTONACTIVE,
lParam);
}
else
ActButton = i;
break;
}
}
}
return TRUE;
break;
case WM_RBUTTONUP:
case WM_LBUTTONUP:
if (ActButton == -1)
break;
pItem = pMBAR->mbars+ActButton;
if (MyPtInRect (&(pItem->rect), *((POINTS *)(&lParam))))
{
i = pItem->id;
BtnState = (pItem->type == MBAR_CHKBUTTON) && !BtnState;
if (BtnState ^
WseCheckMsgBar (hMBAR, ActButton, MBAR_POSITION, BtnState))
WsePaintMsgBarWnd (hWnd, hMBAR, i);
SendMessage (hWnd, WM_COMMAND,
message == WM_LBUTTONUP ? i
: i+MBAR_RBUTTONACTIVE,
lParam);
}
ActButton = (UINT)-1;
ReleaseCapture ();
return TRUE;
break;
case WM_PAINT:
BeginPaint (hWnd, &ps);
WsePaintMsgBarWnd (hWnd, hMBAR, NULL);
EndPaint (hWnd, &ps);
break;
}
return FALSE;
}
LRESULT CALLBACK MessageBarProc (
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam )
{
HMBAR hMBar;
WNDPROC fpWndProc;
HDC hDC;
RECT rect;
hMBar = (HMBAR)GetWindowLong (hWnd, 4);
if (!hMBar)
return DefWindowProc (hWnd, message, wParam, lParam);
if (WseProcessMsgBarMsg (hMBar, hWnd, message, wParam, lParam))
return 0L;
fpWndProc = (WNDPROC)GetWindowLong (hWnd, 0);
switch (message)
{
case WM_PAINT:
case WM_ACTIVATE:
hDC = GetWindowDC (hWnd);
GetWindowRect (hWnd, &rect);
rect.right -= rect.left;
rect.bottom -= rect.top;
rect.left = rect.top = 0;
WseDrawGrayFrame (hDC, &rect, 1,
GetStockObject (GRAY_BRUSH),
GetStockObject (BLACK_BRUSH));
ReleaseDC (hWnd, hDC);
break;
case WM_MOUSEACTIVATE:
if (LOWORD(lParam) == HTCLIENT)
return MA_NOACTIVATE;
return DefWindowProc (hWnd, message, wParam, lParam);
break;
default:
return fpWndProc (hWnd, message, wParam, lParam);
}
return 0L;
}
HWND WINAPI WseCreateMsgBarWindow (
HINSTANCE hInstance,
HMBAR hMBar,
LPSTR lpStr,
HWND hParent,
FARPROC fpWndProc)
{
HWND hWnd;
RECT rect;
WseGetMsgBarRect (hMBar, NULL, NULL, &rect);
hWnd = CreateWindow (szMsgBar, // Class Name
lpStr, // title Text
WS_POPUP | WS_BORDER | WS_MINIMIZEBOX,
rect.left, rect.top, rect.right, rect.bottom,
hParent, NULL, hInst, NULL);
if (!hWnd)
return NULL;
SetWindowLong (hWnd, GWL_HINSTANCE, (LONG)hInstance);
SetWindowLong (hWnd, 0, (LONG)fpWndProc);
SetWindowLong (hWnd, 4, (LONG)hMBar);
PostMessage (hWnd, WM_INITDIALOG, NULL, NULL);
return hWnd;
}
BOOL far _InitMsgBar ()
{
WNDCLASS wc;
wc.lpszClassName = szMsgBar;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;
wc.lpfnWndProc = (WNDPROC)MessageBarProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 16;
wc.hInstance = hInst;
wc.hIcon = NULL;
wc.hCursor = LoadCursor (hInst, MAKEINTRESOURCE(HANDPOINTER));
wc.hbrBackground = (HBRUSH)GetStockObject (ColorBits > 2 ? LTGRAY_BRUSH
: WHITE_BRUSH);
wc.lpszMenuName = NULL;
RegisterClass (&wc);
return TRUE;
}
BOOL far _ExitMsgBar ()
{
UnregisterClass (szMsgBar, hInst);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -