📄 scrlbar.c
字号:
// 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 + -