⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgbar.c

📁 windows环境下的一套汉字处理引擎,可以对汉字进行相应的处理
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -