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

📄 msgbar.c

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