📄 msgbar.c
字号:
if (!(pItem->tag & MBAR_BITMAP))
LocalFree ((HLOCAL)pItem->data);
}
WseRepMovsb ((LPSTR)(NPSTR)pItem, (LPSTR)(NPSTR)(pItem+1),
(pMBAR->items-wID)*sizeof(MBARITEM));
pMBAR->items --;
pMBAR->mbars[pMBAR->items].type = 0;
if (wTag == MBAR_LINEBREAK)
{
for (i = wID; i < (int)pMBAR->items; i++, pItem++)
{
pItem->rect.top -= pMBAR->lineheight;
pItem->rect.bottom -= pMBAR->lineheight;
}
pMBAR->rect.bottom -= pMBAR->lineheight;
WseRearrangeMsgBar (hMBAR, wID);
}
return TRUE;
}
BOOL WINAPI WseSetMsgBarText (
HMBAR hMBAR,
UINT wID,
UINT wTag,
LPSTR lpStr)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
UINT wCount;
HANDLE hOldFont;
// HFONT hFont;
HDC hDC;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return FALSE;
pItem = &(pMBAR->mbars[wID]);
if (wTag & MBAR_BITMAP)
{
//////////////// It is a Bitmap /////////////////
if (!(pItem->tag & MBAR_BITMAP))
LocalFree ((HLOCAL)pItem->data);
pItem->data = lpStr;
if (lpStr)
pItem->tag |= MBAR_BITMAP;
if (pItem->tag & MBAR_AUTO)
{
if (lpStr)
{
PBITMAP pBmp = (PBITMAP)LocalAlloc (LPTR, sizeof(BITMAP));
GetObject ((HBITMAP)lpStr, sizeof(BITMAP), pBmp);
wCount = pBmp->bmWidth;
LocalFree ((HLOCAL)pBmp);
}
else
wCount = 0;
return WseSetMsgBarWidth (hMBAR, wID, MBAR_POSITION, wCount);
}
return TRUE;
}
else if (!(wCount = lstrlen (lpStr)))
lpStr = "";
if (pItem->tag & MBAR_BITMAP)
{
pItem->tag &= ~MBAR_BITMAP;
pItem->data = (LPSTR)LocalAlloc (LPTR, wCount+3);
}
else if (pItem->data == 0 || LocalSize ((HLOCAL)pItem->data) < wCount+1)
{
if (pItem->data)
LocalFree ((HLOCAL)pItem->data);
pItem->data = (LPSTR)LocalAlloc (LPTR, wCount+3);
}
lstrcpy (pItem->data, lpStr);
if (pItem->tag & MBAR_AUTO)
{
NPSTR pNewStr = (NPSTR)LocalAlloc (LPTR, lstrlen (lpStr)+2);
WseTranslateString (HTRANS_SYSTEM_DEFAULT, lpStr, 0,
pNewStr, LocalSize ((HANDLE)pNewStr));
hDC = CreateIC (szDisplay, NULL, NULL, NULL);
if (pItem->hfont)
{
hOldFont = SelectObject (hDC, pItem->hfont);
wTag = WseSetMsgBarWidth (hMBAR, wID, wTag | MBAR_POSITION,
LOWORD(GetTextExtent (hDC, pNewStr, wCount))+1);
SelectObject (hDC, hOldFont);
}
else
wTag = WseSetMsgBarWidth (hMBAR, wID, wTag | MBAR_POSITION,
LOWORD(GetTextExtent (hDC, pNewStr, wCount))+1);
DeleteDC (hDC);
LocalFree ((HLOCAL)pNewStr);
return wTag;
}
return TRUE;
}
int WINAPI WseGetMsgBarText (
HMBAR hMBAR,
UINT wID,
UINT wTag,
LPSTR lpStr,
int wLen)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
if (lpStr)
*lpStr = 0;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return 0;
pItem = &(pMBAR->mbars[wID]);
if (pItem->tag & MBAR_BITMAP)
{
if (wTag & MBAR_BITMAP)
return (int)pItem->data;
else
return -1;
}
if (wTag & MBAR_BITMAP)
return -1;
if (wLen < 2 || !lpStr)
return NULL;
wLen = min (lstrlen (pItem->data), wLen-1);
WseRepMovsb (lpStr, pItem->data, wLen);
lpStr[wLen] = 0;
return wLen;
}
BOOL WINAPI WseRearrangeMsgBar (HMBAR hMBAR, UINT wID)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
UINT wBeg, wEnd;
UINT i;
UINT wPos, wAdj, wPosLeft;
pMBAR = (PMBARHEADER) hMBAR;
for (i = wID; i > 0; i--)
{
if (pMBAR->mbars[i].type == MBAR_LINEBREAK)
{
i++;
break;
}
}
wBeg = i;
for (i = wID; i < pMBAR->items; i++)
{
if (pMBAR->mbars[i].type == MBAR_LINEBREAK)
break;
}
wEnd = i;
for (wPos = 0, i = wBeg, pItem = pMBAR->mbars+i;
i < wEnd && !(pItem->tag & (MBAR_MAXWIDTH | MBAR_RIGHT));
i++, pItem++)
{
wAdj = wPos - pItem->rect.left;
pItem->rect.left += wAdj;
pItem->rect.right += wAdj;
wPos = pItem->rect.right + pItem->space;
if (pItem->rect.left != pItem->rect.right)
wPos++;
}
wBeg = i;
wPosLeft = wPos;
if (i < wEnd && (pItem->tag & MBAR_MAXWIDTH))
pItem->rect.left = wPos;
for (wPos = pMBAR->rect.right - 2, i = wEnd-1, pItem = pMBAR->mbars+i;
i >= wBeg && (pItem->tag & MBAR_RIGHT) && !(pItem->tag & MBAR_MAXWIDTH);
i--, pItem--)
{
wAdj = wPos - (pItem->rect.right + pItem->space);
if (pItem->rect.left != pItem->rect.right)
wAdj --;
pItem->rect.left += wAdj;
pItem->rect.right += wAdj;
wPos = pItem->rect.left;
}
if (i >= wBeg && (pItem->tag & MBAR_MAXWIDTH))
pItem->rect.right = wPos - pItem->space-1;
return (wPos >= wPosLeft);
}
int WINAPI WseGetMsgBarWidth (HMBAR hMBAR, UINT wID, UINT wTag)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
pMBAR = (PMBARHEADER)hMBAR;
if (wID == NULL && wTag == NULL)
{
UINT i;
int j;
for (i = j = 0, pItem = pMBAR->mbars; i < pMBAR->items; i++, pItem++)
{
if (pItem->rect.right > j && pItem->rect.right != pItem->rect.left)
j = pItem->rect.right;
}
return j+3;
}
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return NULL;
pItem = &(pMBAR->mbars[wID]);
wID = pItem->rect.right - pItem->rect.left+1;
if (wID >= 3)
wID -= 3;
else
wID = 0;
return wID;
}
BOOL WINAPI WseSetMsgBarWidth (HMBAR hMBAR, UINT wID, UINT wTag, int wWidth)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
UINT width, i;
pMBAR = (PMBARHEADER)hMBAR;
if (!wID && !wTag)
{
pMBAR->rect.right = wWidth;
WseRearrangeMsgBar (hMBAR, 0);
for (i = 1, pItem = pMBAR->mbars; i < pMBAR->items; i++, pItem++)
{
if (pItem->type == MBAR_LINEBREAK)
WseRearrangeMsgBar (hMBAR, i);
}
return TRUE;
}
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return FALSE;
pItem = &(pMBAR->mbars[wID]);
if (wTag & MBAR_CHARWIDTH)
wWidth *= pMBAR->lineheight/2;
if (wWidth < pItem->minw)
wWidth = pItem->minw;
if (wWidth > pItem->maxw)
wWidth = pItem->maxw;
if (wWidth)
wWidth += 3;
else
wWidth = 1;
width = wWidth - (pItem->rect.right - pItem->rect.left+1);
if (!(width))
return TRUE;
if (pItem->tag & MBAR_RIGHT)
pItem->rect.left -= width;
else
pItem->rect.right += width;
if (pMBAR->items != 1 && !(wTag & MBAR_NOREARRANGE))
return WseRearrangeMsgBar (hMBAR, wID);
return TRUE;
}
int WINAPI WseSetMsgBarHeight (HMBAR hMBAR, UINT wID, UINT wTag, int wHeight)
{
PMBARHEADER pMBAR;
PMBARITEM pItem;
int wh, iTmp;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return FALSE;
pItem = &(pMBAR->mbars[wID]);
wh = pItem->rect.bottom;
while (wID > 0 && pItem[-1].rect.bottom == wh &&
pItem[-1].type != MBAR_LINEBREAK)
{
wID --;
pItem--;
}
iTmp = pItem->rect.top;
wh -= iTmp+3;
if (wHeight)
wHeight -= wh;
else
wHeight -= wh+4;
do {
pItem->rect.bottom += wHeight;
pItem++;
wID++;
} while (wID <= pMBAR->items && pItem->rect.top == iTmp &&
pItem->type != MBAR_LINEBREAK);
while (wID < pMBAR->items)
{
pItem->rect.top += wHeight;
pItem->rect.bottom += wHeight;
pItem++;
wID++;
}
pMBAR->rect.bottom += wHeight;
return wh;
}
BOOL WINAPI WseCheckMsgBar (HMBAR hMBAR, UINT wID, UINT wTag, BOOL bDown)
{
PMBARHEADER pMBAR;
BOOL bRet;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return FALSE;
bRet = !!(pMBAR->mbars[wID].tag & MBAR_PUSHDOWN);
if (bRet && !bDown)
pMBAR->mbars[wID].tag &= ~MBAR_PUSHDOWN;
else if (!bRet && bDown)
pMBAR->mbars[wID].tag |= MBAR_PUSHDOWN;
return bRet;
}
BOOL WINAPI WseIsMsgBarChecked (HMBAR hMBAR, UINT wID, UINT wTag)
{
PMBARHEADER pMBAR;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return NULL;
return !!(pMBAR->mbars[wID].tag & MBAR_PUSHDOWN);
}
COLORREF WINAPI WseGetMsgBarTextColor (HMBAR hMBAR, UINT wID, UINT wTag)
{
PMBARHEADER pMBAR;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return NULL;
return pMBAR->mbars[wID].txtcolor;
}
COLORREF WINAPI WseSetMsgBarTextColor (HMBAR hMBAR, UINT wID, UINT wTag, COLORREF TxtCo)
{
PMBARHEADER pMBAR;
COLORREF co;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return NULL;
co = pMBAR->mbars[wID].txtcolor;
pMBAR->mbars[wID].txtcolor = TxtCo;
return co;
}
HFONT WINAPI WseSetMsgBarFont (HMBAR hMBAR, UINT wID, UINT wTag, HFONT hFont)
{
PMBARHEADER pMBAR;
HFONT hFnt;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return NULL;
hFnt = pMBAR->mbars[wID].hfont;
pMBAR->mbars[wID].hfont = hFont;
return hFnt;
}
BOOL WINAPI WseGetMsgBarItemInfo (HMBAR hMBAR, UINT wID, UINT wTag, LPMSGBARITEM lpItem)
{
PMBARHEADER pMBAR;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return FALSE;
WseRepMovsb ((LPSTR)lpItem, (LPSTR)(pMBAR->mbars+wID), sizeof(MSGBARITEM));
return TRUE;
}
BOOL WINAPI WseSetMsgBarItemInfo (HMBAR hMBAR, UINT wID, UINT wTag, LPMSGBARITEM lpItem)
{
PMBARHEADER pMBAR;
pMBAR = (PMBARHEADER)hMBAR;
if (!(wTag & MBAR_POSITION) &&
(wID = WseGetMsgBarItemID (hMBAR, wID, wTag)) == ERROR_MBARID)
return FALSE;
WseRepMovsb ((LPSTR)(pMBAR->mbars+wID), (LPSTR)lpItem, sizeof(MSGBARITEM));
return TRUE;
}
BOOL WINAPI WsePaintMsgBarWnd (HWND hWnd, HMBAR hMBAR, UINT wID)
{
UINT wTag;
UINT i;
PMBARHEADER pMBAR;
PMBARITEM pItem;
RECT *rect;
HFONT hOldFont, hFont;
HPEN hOldPen;
COLORREF OldColor;
HDC hDC;
pMBAR = (PMBARHEADER)hMBAR;
wTag = 0;
hDC = GetDC (hWnd);
SelectObject (hDC, GetStockObject (ColorBits > 2 ? LTGRAY_BRUSH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -