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

📄 win.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:
			else
				lpwsWndRetv = lpws->lpwsPrev;
		}
		//LeaveCriticalSection( &csWindow );
		UnlockCSWindow();
	}
	if( lpwsWndRetv )
	    return lpwsWndRetv->hThis;
	return NULL;
}

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

HWND WINAPI Win_GetTop( HWND hWnd )
{
    _LPWINDATA lpws = (_LPWINDATA)_GetHWNDPtr( hWnd );
    if( lpws && lpws->lpwsChild )
	{
        return lpws->lpwsChild->hThis;
	}
    return NULL;
}

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

HWND WINAPI Win_Get( HWND hWnd, UINT uCmd )
{
    _LPWINDATA lpws;
	_LPWINDATA lpwsWndRetv = NULL;

    //EnterCriticalSection( &csWindow );
	LockCSWindow();

    lpws = _GetHWNDPtr( hWnd );
    
    if( lpws )
    {
        if( uCmd == GW_CHILD )
            lpwsWndRetv = lpws->lpwsChild;
        else if( uCmd == GW_HWNDFIRST )
        {
            lpwsWndRetv = GET_Z_ORDER_UP( lpws )->lpwsChild;
        }
        else if( uCmd == GW_HWNDLAST )
        {
            while( lpws->lpwsNext )
            {
        // if next window is exist and next window has WS_CHILD style, continue
                lpws = lpws->lpwsNext;
            }
			lpwsWndRetv = lpws;
        }
        else if( uCmd == GW_HWNDNEXT )
        {
            lpwsWndRetv = lpws->lpwsNext;//_NextWindow( hWnd );
        }
        else if( uCmd == GW_HWNDPREV )
        {
            lpwsWndRetv = lpws->lpwsPrev;//_PrevWindow( hWnd );
        }
        else if( uCmd == GW_OWNER )
        {
            lpwsWndRetv = lpws->lpwsOwner;
        }
        else
        {
            ASSERT( 0 );
        }
    }

    //LeaveCriticalSection( &csWindow );
	UnlockCSWindow();
	if( lpwsWndRetv )
        return lpwsWndRetv->hThis;
	return NULL;
}

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

LONG WINAPI Win_GetLong( HWND hWnd, int nIndex )
{
    _LPWINDATA lpws = _GetHWNDPtr( hWnd );
    if( lpws )
    {
		//        WNDCLASS wc;
		
        switch( nIndex )
        {
        case GWL_MAINSTYLE:
            return lpws->dwMainStyle;
        case GWL_EXSTYLE:
            return lpws->dwExStyle;
		case GWL_TEXT_PTR:
			return (LONG)UnMapPtr( lpws->lpWinText );
		case GWL_ID:
			return (LONG)lpws->hMenu;
		case GWL_VSCROLL:
			return (LONG)lpws->lpvScrollBar;
		case GWL_HSCROLL:
			return (LONG)lpws->lphScrollBar;
		case GWL_HICONSM:
			return (LONG)lpws->hSmallIcon;
		case GWL_HICON:
			return (LONG)lpws->hBigIcon;
		case GWL_HWNDPARENT:
			return (LONG)( lpws->lpwsParent ? lpws->lpwsParent->hThis : NULL );
		case GWL_USERDATA:
			return lpws->dwUserData;
		case GWL_HINSTANCE:
			return (LONG)lpws->hinst;
        case GWL_WNDPROC:
			if( lpws->lpfnWndProc == lpws->lpClass->wc.lpfnWndProc )
				return -1;
			else
                return (LONG)(lpws->lpfnWndProc);
		default:
			
			if( lpws->lpClass == NULL )
				return 0;
			if( (int)( nIndex + sizeof( LONG ) ) > lpws->lpClass->wc.cbWndExtra )
				return 0;
			else
				return _GetLong( (LPBYTE)lpws + sizeof( _WINDATA ) + nIndex );
        }
    }
    return 0;
}

// **************************************************
// 声明:LONG WINAPI _Win_SetLong( HWND hWnd, int nIndex, LONG dwNewLong )
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static LONG WINAPI Win_SetLongWithProcess( HWND hWnd, int nIndex, LONG dwNewLong, HANDLE hCallerProcess )
{
    _LPWINDATA lpws = _GetHWNDPtr( hWnd );
    if( lpws )
    {
        LONG oldLong = 0;
// check valid
    
        switch( nIndex )
        {
            case GWL_MAINSTYLE:
				{
					STYLESTRUCT ss, * lpss;

					if( lpws->dwMainStyle != (DWORD)dwNewLong )
					{
						ss.styleNew = lpws->dwExStyle;
						ss.styleOld = dwNewLong;
						
						lpss = (STYLESTRUCT*)MapPtrToProcess( &ss, hgwmeProcess );
						
						WinMsg_Send( hWnd, WM_STYLECHANGING, GWL_STYLE, (LPARAM)lpss );
						
						oldLong = lpws->dwMainStyle;
						lpws->dwMainStyle = ss.styleOld;
						WinMsg_Send( hWnd, WM_STYLECHANGED, GWL_STYLE, (LPARAM)lpss );

						if( (oldLong & 0xffff0000) != (lpws->dwMainStyle & 0xffff0000) )
							Win_SetPos( hWnd, NULL, 0, 0, 0, 0, 
								          SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |SWP_NOACTIVATE | SWP_FRAMECHANGED );

					}
					else
						oldLong = lpws->dwMainStyle;
				}
                break;
			case GWL_VSCROLL:
				oldLong = (LONG)lpws->lpvScrollBar;
				lpws->lpvScrollBar = (LPVOID)dwNewLong;
				break;
			case GWL_HSCROLL:
				oldLong = (LONG)lpws->lphScrollBar;
				lpws->lphScrollBar = (LPVOID)dwNewLong;
				break;
            case GWL_USERDATA:
                oldLong = lpws->dwUserData;
                lpws->dwUserData = dwNewLong;
                break;
            case GWL_ID:
                oldLong = (long)lpws->hMenu;
                lpws->hMenu = (HMENU)dwNewLong;
                break;
            case GWL_EXSTYLE:
				{
					STYLESTRUCT ss, *lpss;
					
					if( lpws->dwExStyle != (DWORD)dwNewLong )
					{
						ss.styleNew = dwNewLong;
						ss.styleOld = lpws->dwMainStyle;
						
						lpss = (STYLESTRUCT*)MapPtrToProcess( &ss, hgwmeProcess );
						
						WinMsg_Send( hWnd, WM_STYLECHANGING, GWL_EXSTYLE, (LPARAM)lpss );
						
						oldLong = lpws->dwExStyle;
						lpws->dwExStyle = ss.styleNew;						
						WinMsg_Send( hWnd, WM_STYLECHANGED, GWL_EXSTYLE, (LPARAM)lpss );

						if( (DWORD)oldLong != lpws->dwExStyle )
							Win_SetPos( hWnd, NULL, 0, 0, 0, 0, 
								          SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |SWP_NOACTIVATE | SWP_FRAMECHANGED );

					}
					else
						oldLong = lpws->dwExStyle;
				}
                break;
		    case GWL_TEXT_PTR:
				if( hCallerProcess == lpws->hOwnerProcess )
				{
					oldLong = (LONG)UnMapPtr( lpws->lpWinText );
					
					lpws->lpWinText = MapPtrToProcess( (LPVOID)dwNewLong, hCallerProcess );
				}
				else
				{
					ASSERT( 0 );
				}
				break;
			case GWL_HICONSM:
				oldLong = (LONG)lpws->hSmallIcon;
				lpws->hSmallIcon = (HICON)dwNewLong;
				break;
			case GWL_HICON:
				oldLong = (LONG)lpws->hBigIcon;
				lpws->hBigIcon = (HICON)dwNewLong;
				break;
            case GWL_WNDPROC:
				if( lpws->hOwnerProcess == hCallerProcess ||
					hCallerProcess == hgwmeProcess	//2004-10-13 必定是内部的调用,否则就是错的
					)
				//2004-10-13-end
				{
                    oldLong = (LONG)(lpws->lpfnWndProc);
					// EnterCS  ???? same thread ????
					if( dwNewLong == -1 ) // LN, 2003.05.30
					{
						lpws->uState &= ~WINS_INUSERPROC;// LN, 2003.05.30
						dwNewLong = (LONG)lpws->lpClass->wc.lpfnWndProc;
					}
					else
						lpws->uState |= WINS_INUSERPROC;// LN, 2003.05.30

                    lpws->lpfnWndProc = (WNDPROC)dwNewLong;
					//LeaveCS

				}
				//else if( hCallerProcess == hgwmeProcess )
				//{  
				//}
                break;
            case GWL_HINSTANCE:
                oldLong = (LONG)lpws->hinst;
                lpws->hinst = (HINSTANCE)dwNewLong;
                break;
            default:
				if( lpws->lpClass == NULL )
                    return 0;
                if( (int)(nIndex + sizeof( LONG )) > (int)(lpws->lpClass->wc.cbWndExtra) )
                    return 0;
                else
                {
                    oldLong = _GetLong( (LPBYTE)lpws + sizeof( _WINDATA ) + nIndex );
                    _SetLong( (LPBYTE)lpws + sizeof( _WINDATA ) + nIndex, dwNewLong );
                }

        }   
        return oldLong;
    }
    return 0;
}

// **************************************************
// 声明:LONG WINAPI Win_SetLongInside( HWND hWnd, int nIndex, LONG dwNewLong )
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	内部调用
// 引用: 
//	
// ************************************************
LONG WINAPI Win_SetLongInside( HWND hWnd, int nIndex, LONG dwNewLong )
{
	return Win_SetLongWithProcess( hWnd, nIndex, dwNewLong, hgwmeProcess );
}

// **************************************************
// 声明:LONG WINAPI Win_SetLongInside( HWND hWnd, int nIndex, LONG dwNewLong )
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	系统调用
// 引用: 
//	
// ************************************************
LONG WINAPI Win_SetLong( HWND hWnd, int nIndex, LONG dwNewLong )
{
	return Win_SetLongWithProcess( hWnd, nIndex, dwNewLong, GetCallerProcess() );
}

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

BOOL WINAPI Win_GetWindowRect( HWND hWnd, LPRECT lpRect )
{
    _LPWINDATA lpws  = _GetHWNDPtr( hWnd );
    if( lpws )
    {
        *lpRect = lpws->rectWindow;
        return TRUE;
    }
    return FALSE;
}

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

int WINAPI Win_GetText( HWND hWnd, LPSTR lpstr, int nMaxCount )
{
    _LPWINDATA lpws = _GetHWNDPtr( hWnd );
    int retv = 0;
    *lpstr = 0;
	if( lpws )
    {
		if( lpws->hOwnerProcess == GetCallerProcess() )  
		{
			WinMsg_SendTimeout( hWnd, WM_GETTEXT, nMaxCount, (LPARAM)lpstr, SMTO_BLOCK, 5000, &retv );
		}
		else if( lpws->lpWinText )
		{
			DWORD dwOldPerm;
			dwOldPerm = SetProcPermissions( ~0 );  //得到对进程的存取权限
			strncpy( lpstr, lpws->lpWinText, nMaxCount );
			retv = strlen( lpstr );
			SetProcPermissions( dwOldPerm );  //恢复对进程的存取权限
		}
    }
    return retv;
}

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

int WINAPI Win_GetTextLength( HWND hWnd )
{
    return (int)WinMsg_Send( hWnd, WM_GETTEXTLENGTH, 0, 0 );
}

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

BOOL _AddPaintRegion( HRGN hrgnUpdate )
{
    extern int CALLBACK __PutPaintRgn( HRGN hrgn );
    __PutPaintRgn( hrgnUpdate );
    return TRUE;
}

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

void _AddPaintWndRgn( _LPWINDATA lpws, HRGN hrgnUpdate, BOOL fUpdateChild, DWORD uiThreadID )
{
    HRGN hrgn;
    int retv;    

    if( lpws && !(lpws->dwMainStyle & WS_CHILD) )
    {
        HRGN hsys;
		if( lpws->dwThreadID == uiThreadID )
		{
			int xOffset = lpws->rectWindow.left;
			int yOffset = lpws

⌨️ 快捷键说明

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