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

📄 msgbar.c

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