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

📄 scrlbar.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 4 页
字号:
//	IN dwMsg - 消息
//	IN wParam - 消息附带的 WPARAM 参数
//	IN lParam - 消息附带的 LPARAM 参数
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	向父发送 通知消息
// 引用: 
//	
// ************************************************

static BOOL Scrl_SendScrollMsg( HWND hWnd, int fnBar, UINT dwMsg, WPARAM wParam, LPARAM lParam )
{
    if( fnBar == SB_CTL )
    {
        hWnd = GetParent( hWnd );
        return SendMessage( hWnd, dwMsg, wParam, lParam );
    }
    else
        return SendMessage( hWnd, dwMsg, wParam, 0 );
}

// **************************************************
// 声明:static HDC Scrl_GetScrollDC( HWND hWnd, int fnBar )
// 参数:
// 	IN hWnd - 窗口句柄
//	IN fnBar - 滚动条类型,为下值:
//						SB_VERT - 垂直
//						SB_HORT - 水平
// 返回值:
//	假入成功,返回DC句柄
// 功能描述:
//	得到绘图DC
// 引用: 
//	
// ************************************************

static HDC Scrl_GetScrollDC( HWND hWnd, int fnBar )
{
    if( fnBar == SB_CTL )
        return GetDC( hWnd );
    else
        return GetWindowDC( hWnd );
}

// **************************************************
// 声明:static int Scrl_SetScrollState( HWND hWnd, int fnBar, UINT s, BOOL fEnable )
// 参数:
// 	IN hWnd - 窗口句柄
//	IN fnBar - 滚动条类型,为下值:
//						SB_VERT - 垂直
//						SB_HORT - 水平
//	IN s - 状态值
//	IN fEnable - 设置或清除
// 返回值:
//	假入成功,返回老的状态值;否则,返回0
// 功能描述:
//	设置滚动条状态
// 引用: 
//	
// ************************************************

static int Scrl_SetScrollState( HWND hWnd, int fnBar, UINT s, BOOL fEnable )
{
    //_LPWINDATA lpws = _GetHWNDPtr(hWnd);
	short * p = (short*)_GetWindowScrollBar( hWnd, fnBar );
	if( p )
	{
		//short * p = NULL;
		int pos = OFF_STATE;
		int old;
		
		//if( fnBar == SB_CTL )
		//	p = (short*)(lpws+1);
		//else
		//{
			//2004-09-06- modify
		//	p = (short*)_GetWindowScrollBar( lpws, fnBar );
			//if( fnBar == SB_VERT )
			//	p = (short*)&lpws->vScrollBar;
			//else if( fnBar == SB_HORZ )
			//	p = (short*)&lpws->hScrollBar;
			//
		//}
		// pos is byte pos, but p is short pointer
		//if( p )
		{
			pos >>= 1;
			old = *(p+pos);
			if( fEnable )
				*(p+pos) |= s;
			else
				*(p+pos) &= ~s;
			return old;
		}
	}
	return 0;
}

// **************************************************
// 声明:static void Scrl_SetScrollValue( HWND hWnd, int fnBar, int pos, int v )
// 参数:
// 	IN hWnd - 窗口句柄
//	IN fnBar - 滚动条类型,为下值:
//						SB_VERT - 垂直
//						SB_HORT - 水平
//	int pos - 在结构中的位置偏移值
//	int v - 需要设置的值
// 返回值:
//	无
// 功能描述:
//	设置值
// 引用: 
//	
// ************************************************

static void Scrl_SetScrollValue( HWND hWnd, int fnBar, int pos, int v )
{
    //_LPWINDATA lpws = _GetHWNDPtr(hWnd);
	short * p = (short*)_GetWindowScrollBar( hWnd, fnBar );
	//if( lpws )
	if( p )
	{
		//short * p;
		//
		//if( fnBar == SB_CTL )
		//	p = (short*)(lpws+1);
		//else
		//{	//2004-09-06- modify
		//	p = (short*)_GetWindowScrollBar( lpws, fnBar );
			//if( fnBar == SB_VERT )
			//	p = (short*)&lpws->vScrollBar;
			//else if( fnBar == SB_HORZ )
			//	p = (short*)&lpws->hScrollBar;
		//}
		// pos is byte pos, but p is short pointer
		pos >>= 1;
		*(p+pos) = v;
	}
}

// **************************************************
// 声明:static int Scrl_GetScrollValue( HWND hWnd, int fnBar, int pos )
// 参数:
// 	IN hWnd - 窗口句柄
//	IN fnBar - 滚动条类型,为下值:
//						SB_VERT - 垂直
//						SB_HORT - 水平
//	int pos - 在结构中的位置偏移值
// 返回值:
//	假入成功,返回值
// 功能描述:
//	得到值
// 引用: 
//	
// ************************************************

static int Scrl_GetScrollValue( HWND hWnd, int fnBar, int pos )
{
	short * p = (short*)_GetWindowScrollBar( hWnd, fnBar );
    //_LPWINDATA lpws = _GetHWNDPtr(hWnd);
	//if( lpws )
	if( p )
	{
		//short * p;
		
		//if( fnBar == SB_CTL )
		//	p = (short*)(lpws+1);
		//else
		//{
			//2004-09-06- modify
		//	p = (short*)_GetWindowScrollBar( lpws, fnBar );
			//if( fnBar == SB_VERT )
			//	p = (short*)&lpws->vScrollBar;
			//else if( fnBar == SB_HORZ )
			//	p = (short*)&lpws->hScrollBar;
			//
		//}
		// pos is byte pos, but p is short pointer
		pos >>= 1;
		return *(p+pos);
	}
	return 0;
}

// **************************************************
// 声明:BOOL Scrl_Inital( _LPSCROLLDATA p )
// 参数:
// 	IN p - _SCROLLDATA 结构指针
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	初始化 _SCROLLDATA 结构指针
// 引用: 
//	
// ************************************************

BOOL Scrl_Inital( _LPSCROLLDATA p )
{
	p->nMin = 0;
	p->nMax = 100;
    p->nPage = 0;
    p->nPos = 0;
    p->nTrackPos = 1;
    p->state = 0;
    return TRUE;
}


// **************************************************
// 声明:static LRESULT DoCREATE( HWND hWnd )
// 参数:
// 	IN hWnd - 窗口句柄
// 返回值:
//	假入成功,返回0;否则,返回-1
// 功能描述:
//	处理 WM_CREATE 消息
// 引用: 
//	
// ************************************************

static LRESULT DoCREATE( HWND hWnd )
{
    //_LPWINDATA lpws = _GetHWNDPtr(hWnd);
	//if( lpws )
	{
	//	_LPSCROLLDATA p = (_LPSCROLLDATA)(lpws+1);
		_LPSCROLLDATA p = _GetWindowScrollBar( hWnd, SB_CTL );
		if( p )		
		    Scrl_Inital( p );
		return 0;
	}
	return -1;
}

// **************************************************
// 声明:static LRESULT DoPAINT( HWND hWnd )
// 参数:
// 	IN hWnd - 窗口句柄
// 返回值:
//	假入成功,返回0
// 功能描述:
//	处理 WM_PAINT 消息	
// 引用: 
//	
// ************************************************

static LRESULT DoPAINT( HWND hWnd )
{
	PAINTSTRUCT ps;
	HDC hdc;

	hdc = BeginPaint( hWnd, &ps );
    Scrl_RedrawScrollBar( hWnd, hdc, SB_CTL );

	EndPaint( hWnd, &ps );
	return 0;
}

// **************************************************
// 声明:LRESULT WINAPI ScrollBarWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
// 参数:
//  IN hWnd - 窗口句柄
//	IN message - 消息
//	IN wParam - 第一个消息
//	IN lParam - 第二个消息
// 返回值:
//	依赖于具体的消息
// 功能描述:
//	按钮窗口处理总入口
// 引用: 
//	
// ************************************************
// this all message handle center
static LRESULT CALLBACK ScrollBarWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch( message )
	{
	case WM_PAINT:
		return DoPAINT( hWnd );
	case WM_LBUTTONDOWN:
	case WM_LBUTTONDBLCLK:
		return Scrl_DoLBUTTONDOWN( hWnd, SB_CTL, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
	case SBM_SETSCROLLINFO:
		return Scrl_DoSETSCROLLINFO( hWnd, SB_CTL, (LPSCROLLINFO)lParam, (BOOL)wParam );
	case SBM_GETSCROLLINFO:
		return Scrl_DoGETSCROLLINFO( hWnd, SB_CTL, (LPSCROLLINFO)lParam );
	case SBM_GETPOS:
		return Scrl_DoGETPOS( hWnd, SB_CTL );
	case SBM_SETPOS:
		return Scrl_DoSETPOS( hWnd, SB_CTL, (int)wParam, (BOOL)lParam );
	case SBM_GETRANGE:
		return Scrl_DoGETRANGE( hWnd, SB_CTL, (LPINT)wParam, (LPINT)lParam );
	case SBM_SETRANGE:
		return Scrl_DoSETRANGE( hWnd, SB_CTL, wParam, lParam, FALSE );
	case SBM_SETRANGEREDRAW:
		return Scrl_DoSETRANGE( hWnd, SB_CTL, wParam, lParam, TRUE );
    case SBM_ENABLE_ARROWS:
        return EnableScrollBar( hWnd, SB_CTL, wParam );
	case WM_STYLECHANGING:
		{
			STYLESTRUCT * lpss = (STYLESTRUCT *)lParam;
			lpss->styleOld &= ~(WS_VSCROLL | WS_HSCROLL);
			return DefWindowProc( hWnd, message, wParam, lParam );
		}
		
	case WM_DESTROY:
		_ReleaseWindowScrollBar( hWnd, SB_CTL );
		return 0;
	case WM_CREATE:
		return DoCREATE( hWnd );
	case WM_NCCREATE:
		{
			LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
			lpcs->style &= ~(WS_VSCROLL | WS_HSCROLL);
			return DefWindowProc( hWnd, message, wParam, lParam );
		}
	}

	return DefWindowProc(hWnd,message,wParam,lParam);
}


// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

int WINAPI Wnd_GetScrollInfo(HWND hWnd, int fnBar, LPSCROLLINFO lpsi )
{
	return Scrl_DoGETSCROLLINFO( hWnd, fnBar, lpsi );
//    if( fnBar == SB_CTL )
//	{  
  //      return (int)WinMsg_Send( hWnd, SBM_GETSCROLLINFO, (WPARAM)0, (LONG)lpsi );
	//}
    //else
	//{
//        
//	}
}


// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

int WINAPI Wnd_SetScrollInfo(HWND hWnd, int fnBar, LPCSCROLLINFO lpcsi, BOOL fRedraw)
{
	return Scrl_DoSETSCROLLINFO( hWnd, fnBar, lpcsi, fRedraw );
/*
    if( fnBar == SB_CTL )
	{  //// map lpcsi ??????????????????
        return (int)WinMsg_Send( hWnd, SBM_SETSCROLLINFO, fRedraw, (LPARAM)lpcsi );
	}
    else
	{
//		HANDLE hCallerProcess = GetCallerProcess();
//		if( hCallerProcess )
//			lpcsi = MapPtrToProcess( (LPVOID)lpcsi, hCallerProcess );
        return Scrl_DoSETSCROLLINFO( hWnd, fnBar, lpcsi, fRedraw );
	}
*/
}

// **************************************************
// 声明:BOOL WINAPI EnableScrollBar(HWND hWnd, UINT fnBar, UINT wArrows )
// 参数:
// 	IN hWnd - 窗口句柄
//	IN fnBar - 滚动条
//						SB_VERT - 垂直
//						SB_HORT - 水平
//						SB_BOTH - 垂直和滚动
//	IN wArrows - 箭头类别
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	有效滚动条方向箭头
// 引用: 
//	
// ************************************************

BOOL WINAPI Wnd_EnableScrollBar(HWND hWnd, UINT fnBar, UINT wArrows )
{
    HDC hdc;
	DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
	BOOL bSet = TRUE;
	UINT uiRedraw = 0;

	if( wArrows == ESB_ENABLE_BOTH )
	{
		wArrows = ESB_DISABLE_BOTH;
		bSet = FALSE;
	}	

	if( (fnBar == SB_BOTH || fnBar == SB_VERT) && (dwStyle & WS_VSCROLL) )
	{
	    Scrl_SetScrollState( hWnd, SB_VERT, wArrows, bSet );
		uiRedraw |= 0x01;
	}
	if( (fnBar == SB_BOTH || fnBar == SB_HORZ) && (dwStyle & WS_HSCROLL) )
	{
		Scrl_SetScrollState( hWnd, SB_HORZ, wArrows, bSet );
		uiRedraw |= 0x02;
	}

	if( uiRedraw )
	{	//重绘
		hdc = GetWindowDC( hWnd );

		if( uiRedraw & 0x01 )
			Scrl_RedrawScrollBar( hWnd, hdc, SB_VERT );
		if( uiRedraw & 0x02 )
			Scrl_RedrawScrollBar( hWnd, hdc, SB_HORZ );

		ReleaseDC( hWnd, hdc );
	}
    return TRUE;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

BOOL WINAPI Wnd_ShowScrollBar( HWND hWnd, int fnBar, BOOL bShow )
{
    //_LPWINDATA lpws = _GetHWNDPtr( hWnd );

    if( fnBar == SB_CTL )
        ShowWindow( hWnd, bShow );
    else
    {
        BOOL fAdd;
		DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );//lpws->dwMainStyle;
		DWORD dwOldStyle = dwStyle;
        if( bShow )
        {
            if( fnBar == SB_VERT )
                dwStyle |= WS_VSCROLL;
            else if( fnBar == SB_HORZ )
                dwStyle |= WS_HSCROLL;
            else if( fnBar == SB_BOTH )
                dwStyle |= WS_HSCROLL | WS_VSCROLL;
            fAdd = FALSE;
        }
        else
        {
            if( fnBar == SB_VERT )
                dwStyle &= ~WS_VSCROLL;
            else if( fnBar == SB_HORZ )
                dwStyle &= ~WS_HSCROLL;
            else if( fnBar == SB_BOTH )
                dwStyle &= ~(WS_HSCROLL|WS_VSCROLL);
            fAdd = TRUE;
        }
        if( dwStyle != dwOldStyle )
		{
			SetWindowLong( hWnd, GWL_STYLE, dwStyle );
		}
    }
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -