📄 msgbar.c
字号:
/***********************************************************************
File name:
MsgBar.c
Module name:
WSENGINE
Description:
Support a default Message Bar Processing
Version:
1.00.1
Created By:
Wang Zhi-dong
Date:
1993 Sep.
Functions:
MessageBarProc
_InitMsgBar
_ExitMsgBar
Exports:
WseCreateMsgBar
WseCreateMsgBarIndirect
WseMergeMsgBar
WseDestroyMsgBar
WseMoveMsgBar
WseGetMsgBarRect
WseGetMsgBarItemID
WseAppendMsgBar
WseInsertMsgBar
WseInsertMsgBarIndirect
WseDeleteMsgBar
WseSetMsgBarText
WseGetMsgBarText
WseRearrangeMsgBar
WseGetMsgBarWidth
WseSetMsgBarWidth
WseSetMsgBarHeight
WseCheckMsgBar
WseIsMsgBarChecked
WseGetMsgBarTextColor
WseSetMsgBarTextColor
WseSetMsgBarFont
WseGetMsgBarItemInfo
WseSetMsgBarItemInfo
WsePaintMsgBarWnd
WseMsgBarItemFromPoint
WseProcessMsgBarMsg
WseCreateMsgBarWindow
***********************************************************************/
#include <Windows.h>
#include <Mate.h>
#ifndef SC_MOVEWINDOW
#define SC_MOVEWINDOW 0xF012
#endif
#define UINTMAXVAL (((UINT)-1)>>1)
extern HINSTANCE hInst;
extern UINT ColorBits;
extern char szDisplay[];
extern char szMsgBar[];
#define HANDPOINTER 100
#define ERROR_MBARID ((UINT)-1)
typedef struct {
UINT id;
UINT type;
UINT tag;
int minw;
int maxw;
int space;
LPSTR data;
RECT rect;
COLORREF txtcolor;
HFONT hfont;
} MBARITEM;
typedef MBARITEM * PMBARITEM;
typedef MBARITEM FAR * LPMBARITEM;
typedef struct {
RECT rect;
UINT maxitem;
UINT items;
HFONT hfont;
int lineheight;
MBARITEM mbars[];
} MBARHEADER;
typedef MBARHEADER * PMBARHEADER;
typedef MBARHEADER FAR * LPMBARHEADER;
LRESULT CALLBACK MessageBarProc (HWND, UINT, WPARAM, LPARAM);
BOOL MLR_ExtTextOut (
HDC hDC,
int wX,
int wY,
UINT wOption,
LPRECT lpRect,
LPSTR lpStr,
UINT cbStr,
LPINT lpDX )
{
NPSTR pStr;
HTRANS hTransSystemDefault = WseMakeTranslateTag (HCODE_SYSTEM, HCODE_DEFAULT, NULL);
if (cbStr <= 0 ||
hTransSystemDefault == HTRANS_NULL ||
hTransSystemDefault == HTRANS_ERROR)
return ExtTextOut (hDC, wX, wY, wOption, lpRect, lpStr, cbStr, lpDX);
pStr = (NPSTR)LocalAlloc (LPTR, cbStr+2);
WseTranslateString (hTransSystemDefault, lpStr, cbStr, pStr, cbStr);
wX = ExtTextOut (hDC, wX, wY, wOption, lpRect, pStr, cbStr, lpDX);
LocalFree ((HANDLE)pStr);
return wX;
}
//////////////////////////////////////////////////////////////////////////
// Create a new Message Bar
//
HMBAR WINAPI WseCreateMsgBar (
RECT FAR *rect,
UINT MaxItems,
HFONT hFont )
{
PMBARHEADER pMBAR;
TEXTMETRIC tm;
HDC hDC;
HFONT hOldFont;
pMBAR = (PMBARHEADER)LocalAlloc (LPTR,
(sizeof(MBARHEADER)+MaxItems*sizeof(MBARITEM)));
if (!pMBAR)
return NULL;
hDC = CreateIC (szDisplay, NULL, NULL, NULL);
if (hFont)
hOldFont = SelectObject (hDC, hFont);
GetTextMetrics (hDC, &tm);
if (hFont)
SelectObject (hDC, hOldFont);
DeleteDC (hDC);
pMBAR->hfont = hFont;
pMBAR->maxitem = MaxItems;
pMBAR->lineheight = tm.tmHeight + 3;
pMBAR->rect.bottom = rect->bottom ? rect->bottom
: pMBAR->lineheight+2;
pMBAR->rect.top = (rect->top != -1) ? rect->top
: GetSystemMetrics (SM_CYSCREEN) - pMBAR->rect.bottom;
pMBAR->rect.right = (rect->right != -1) ? rect->right
: GetSystemMetrics (SM_CXSCREEN);
pMBAR->rect.left = (rect->left != -1) ? rect->left
: GetSystemMetrics (SM_CXSCREEN) - pMBAR->rect.right;
return (HMBAR)pMBAR;
}
HMBAR WINAPI WseCreateMsgBarIndirect (
LPMSGBAR lpMBARs,
HINSTANCE hInstance )
{
HMBAR hMBAR;
LPMSGBARITEM lpItem;
int i;
hMBAR = WseCreateMsgBar (&(lpMBARs->rect), lpMBARs->maxitem, lpMBARs->hfont);
if (!hMBAR)
return NULL;
for (i = 0, lpItem = lpMBARs->mbars;
i < (int)lpMBARs->items;
i++, lpItem ++)
{
if (HIWORD(lpItem->data) || lpItem->data == NULL)
WseAppendMsgBar (hMBAR,
lpItem->id, lpItem->type,
lpItem->data, lpItem->tag,
lpItem->minw, lpItem->maxw, lpItem->space);
else
WseAppendMsgBar (hMBAR,
lpItem->id, lpItem->type,
(LPSTR)LoadBitmap (hInstance, lpItem->data),
lpItem->tag | MBAR_BITMAP,
lpItem->minw, lpItem->maxw, lpItem->space);
}
return hMBAR;
}
HMBAR WINAPI WseMergeMsgBar (
HMBAR hMB1,
UINT wID,
UINT wTag,
HMBAR hMB2 )
{
int i;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMB1, wID, wTag)) == ERROR_MBARID)
return NULL;
for (i = 0; i < (int)((PMBARHEADER)hMB2)->items; i++)
{
WseInsertMsgBarIndirect (hMB1, wID, MBAR_POSITION,
(PMSGBARITEM)(((PMBARHEADER)hMB2)->mbars+i));
WseSetMsgBarTextColor (hMB1, wID, MBAR_POSITION,
WseGetMsgBarTextColor (hMB2, i, MBAR_POSITION));
if (wID != ERROR_MBARID)
wID ++;
}
return hMB1;
}
BOOL WINAPI WseDestroyMsgBar (HMBAR hMBAR)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
int i;
pMBAR = (PMBARHEADER)hMBAR;
for (i = 0, pItem = pMBAR->mbars;
i < (int)pMBAR->items; i++, pItem ++)
{
if (LOWORD(pItem->data))
{
if (HIWORD(pItem->data))
LocalFree ((HANDLE)LOWORD(pItem->data));
else
DeleteObject ((HANDLE)LOWORD(pItem->data));
}
}
LocalFree ((HANDLE)hMBAR);
return TRUE;
}
BOOL WINAPI WseMoveMsgBar (HMBAR hMBAR, int x, int y)
{
PMBARHEADER pMBAR;
pMBAR = (PMBARHEADER)hMBAR;
pMBAR->rect.left = (x != -1) ? x
: GetSystemMetrics(SM_CXSCREEN) - pMBAR->rect.right;
pMBAR->rect.top = (y != -1)
? (y == 0 ? -1 : y)
: GetSystemMetrics(SM_CYSCREEN) - pMBAR->rect.bottom;
return TRUE;
}
BOOL WINAPI WseGetMsgBarRect (HMBAR hMBAR, UINT wID, UINT wTag, RECT FAR *rect)
{
if (!wTag && !wID) // Get Bar Rect
{
rect->left = ((PMBARHEADER)hMBAR)->rect.left;
rect->top = ((PMBARHEADER)hMBAR)->rect.top;
rect->right = ((PMBARHEADER)hMBAR)->rect.right;
rect->bottom = ((PMBARHEADER)hMBAR)->rect.bottom;
return TRUE;
}
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return FALSE;
rect->left = ((PMBARHEADER)hMBAR)->mbars[wID].rect.left;
rect->top = ((PMBARHEADER)hMBAR)->mbars[wID].rect.top;
rect->right = ((PMBARHEADER)hMBAR)->mbars[wID].rect.right;
rect->bottom = ((PMBARHEADER)hMBAR)->mbars[wID].rect.bottom;
return TRUE;
}
UINT WINAPI WseGetMsgBarItemID (HMBAR hMBAR, UINT wID, UINT wTag)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
int i;
pMBAR = (PMBARHEADER)hMBAR;
if (wTag & MBAR_POSITION)
{
if (wID < pMBAR->items)
return pMBAR->mbars[wID].id;
else
return (UINT)ERROR_MBARID;
}
else
{
for (i = 0, pItem = pMBAR->mbars; i < (int)pMBAR->items; i++, pItem++)
{
if (pItem->id == wID)
return i;
}
return (UINT)ERROR_MBARID;
}
}
BOOL WINAPI WseAppendMsgBar (
HMBAR hMBAR, // The MessageBar append to
UINT id,
UINT type,
LPSTR lpstr,
UINT tag,
int minw,
int maxw,
int space)
{
return WseInsertMsgBar (hMBAR, (UINT)ERROR_MBARID, MBAR_POSITION, id, type, lpstr, tag,
minw, maxw, space);
}
BOOL WINAPI WseInsertMsgBar (
HMBAR hMBAR,
UINT wID,
UINT wTag,
UINT id,
UINT type,
LPSTR lpstr,
UINT tag,
int minw,
int maxw,
int space )
{
MSGBARITEM mbi;
mbi.id = id;
mbi.type = type;
mbi.data = lpstr;
mbi.tag = tag;
mbi.minw = minw;
mbi.maxw = maxw;
mbi.space = space;
return WseInsertMsgBarIndirect (hMBAR, wID, wTag, &mbi);
}
BOOL WINAPI WseInsertMsgBarIndirect (
HMBAR hMBAR,
UINT wID,
UINT wTag,
MSGBARITEM FAR *lpMBAR)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
int i;
pMBAR = (PMBARHEADER)hMBAR;
if (pMBAR->items >= pMBAR->maxitem)
return NULL;
if (!(wTag & MBAR_POSITION))
{
if ((wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return FALSE;
}
else if (wID == ERROR_MBARID)
wID = pMBAR->items;
if (wID > pMBAR->items)
return FALSE;
pItem = &(pMBAR->mbars[wID]);
WseRepMovsb (((NPSTR)pItem) + sizeof(MBARITEM),
((NPSTR)pItem),
(pMBAR->items-wID)*sizeof(MBARITEM));
WseRepMovsb ((LPSTR)(NPSTR)pItem, (LPSTR)lpMBAR, sizeof(MBARITEM));
pItem->data = NULL;
if (lpMBAR->tag & MBAR_RIGHT)
{
if (wID == pMBAR->items)
{
pItem->rect.left =
pItem->rect.right = pMBAR->rect.right - 4 - lpMBAR->space;
}
else
{
pItem->rect.left =
pItem->rect.right = pItem[1].rect.left - lpMBAR->space;
}
}
else
{
if (!wID)
pItem->rect.left = pItem->rect.right = 0;
else
{
pItem->rect.left =
pItem->rect.right = pItem[-1].rect.right +
pItem[-1].space;
}
}
pItem->rect.top = wID ? pItem[-1].rect.top : 0;
pItem->rect.bottom = pItem->rect.top + pMBAR->lineheight-1;
pItem->minw = pItem->type == MBAR_LINEBREAK ? 0 : lpMBAR->minw;
pItem->maxw = lpMBAR->maxw == 0 ? UINTMAXVAL : lpMBAR->maxw;
pItem->txtcolor = RGB(0,0,0);
pItem->hfont = pMBAR->hfont;
pMBAR->items ++;
// To Insert a Line Break
if (pItem->type == MBAR_LINEBREAK)
{
for (i = wID; i < (int)pMBAR->items; i++)
{
pMBAR->mbars[i].rect.top += pMBAR->lineheight+lpMBAR->minw;
pMBAR->mbars[i].rect.bottom += pMBAR->lineheight+lpMBAR->minw;
}
pMBAR->rect.bottom += pMBAR->lineheight+lpMBAR->minw;
if (wID)
WseRearrangeMsgBar (hMBAR, wID-1);
if (wID < pMBAR->items-1)
WseRearrangeMsgBar (hMBAR, wID+1);
}
if (pItem->minw)
WseSetMsgBarWidth (hMBAR, wID, MBAR_POSITION, pItem->minw);
WseSetMsgBarText (hMBAR, wID,
MBAR_POSITION | (lpMBAR->tag & MBAR_BITMAP),
lpMBAR->data);
return pMBAR->items;
}
BOOL WINAPI WseDeleteMsgBar (HMBAR hMBAR, UINT wID, UINT wTag)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
int i;
pMBAR = (PMBARHEADER)hMBAR;
if (!(pMBAR->items))
return FALSE;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == (UINT)ERROR_MBARID)
return FALSE;
pItem = &(pMBAR->mbars[wID]);
wTag = pItem->type; // Temp to save type of this item
if (pItem->data)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -