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

📄 class.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************
Copyright(c) 版权所有,1998-2005微逻辑。保留所有权利。
******************************************************/


/*****************************************************
文件说明:窗口类管理
版本号:2.0.0
开发时期:1999
作者:李林
修改记录:
	2004-02-21, WinClass_Register 用 hgwmeProcess 代替 GetCurrentProcess
    2003-05-23, 取消对 某些GetCurrentProcess的处理
******************************************************/

#include <eframe.h>
#include <eassert.h>
#include <eapisrv.h>

#include <bheap.h>
#include <gwmeobj.h>
#include <epwin.h>
#include <winsrv.h>
#include <gdisrv.h>

static const COLORREF sysColor[21] = {
    CL_LIGHTGRAY,  //COLOR_SCROLLBAR         0
    CL_BLACK,      //COLOR_BACKGROUND        1
    CL_BLUE,       //COLOR_ACTIVECAPTION     2
    CL_DARKGRAY,   //COLOR_INACTIVECAPTION   3
    CL_LIGHTGRAY,  //COLOR_MENU              4
    CL_LIGHTGRAY,  //COLOR_WINDOW            5
    CL_LIGHTGRAY,  //COLOR_WINDOWFRAME       6
    CL_BLACK,      //COLOR_MENUTEXT          7
    CL_WHITE,      //COLOR_WINDOWTEXT        8
    CL_WHITE,      //COLOR_CAPTIONTEXT       9
    CL_WHITE,      //COLOR_ACTIVEBORDER      10
    CL_LIGHTGRAY,  //COLOR_INACTIVEBORDER    11
    CL_LIGHTGRAY,  //COLOR_APPWORKSPACE      12
    CL_BLUE,       //COLOR_HIGHLIGHT         13
    CL_WHITE,      //COLOR_HIGHLIGHTTEXT     14
    CL_LIGHTGRAY,  //COLOR_BTNFACE           15
    CL_DARKGRAY,   //COLOR_BTNSHADOW         16
    CL_LIGHTGRAY,  //COLOR_GRAYTEXT          17
    CL_BLACK,      //COLOR_BTNTEXT           18
    CL_LIGHTGRAY,  //COLOR_INACTIVECAPTIONTEXT 19
    CL_WHITE      //COLOR_BTNHIGHLIGHT      20
};

/////////////////////////////////////////////////////////////
static _LPPROCESS_CLASS lpProcessClassList = NULL;

static CRITICAL_SECTION csWndClass;

static _LPREGCLASS _FindClass( LPCSTR lpClassName,
							   HANDLE hOwnerProcess,
							   HINSTANCE hInst,
							   _LPPROCESS_CLASS * lppProcessClassList,
							   _LPREGCLASS * lpPrev
							    );


// **************************************************
// 声明:BOOL _InitialWndClassMgr( void )
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	初始化窗口类管理器
// 引用: 
//	被 gwme 开始时加载
// ************************************************

BOOL _InitialWndClassMgr( void )
{
	InitializeCriticalSection( &csWndClass );
#ifdef __DEBUG
	csWndClass.lpcsName = "CS-WC";
#endif
	return TRUE;
}

// **************************************************
// 声明:void _DeInitialWndClassMgr( void )
// 参数:
// 	无
// 返回值:
//	无
// 功能描述:
//	与 _InitialWndClassMgr 相反,系统退出时释放相关的资源
// 引用: 
//	
// ************************************************

void _DeInitialWndClassMgr( void )
{
	DeleteCriticalSection( &csWndClass );
}

// **************************************************
// 声明:static _LPREGCLASS AllocClassStruct( int nClassNameLen, int nClsExtra, LPCWNDCLASS lpWndClass )
// 参数:
// 	IN nClassNameLen - 需要的类名长度
//	IN nClsExtra - 需要的类附加扩展长度
//	IN lpWndClass - 类结构指针
// 返回值:
//	假如成功,返回非NULL的 _LPREGCLASS 指针值;否则,返回NULL
// 功能描述:
//	分配类结构
// 引用: 
//	
// ************************************************
static _LPREGCLASS AllocAndInitClassStruct( int nClassNameLen, int nClsExtra, LPCWNDCLASS lpWndClass, HANDLE hCallerProcess )
{
	_LPREGCLASS lpMemClass;
	nClsExtra = (nClsExtra + 3) & (~3);  // 对齐4
    lpMemClass = (_LPREGCLASS)BlockHeap_AllocString( hgwmeBlockHeap, BLOCKHEAP_ZERO_MEMORY, sizeof( _REGCLASS ) + nClsExtra );
	
	if( lpMemClass )
	{
		LPTSTR lpszClassName = BlockHeap_AllocString( hgwmeBlockHeap, 0, nClassNameLen );
		if( lpszClassName )
		{
			lpMemClass->objType = OBJ_CLASS;
			lpMemClass->nRefCount = 0;
			lpMemClass->hOwnerProcess = hCallerProcess;
			lpMemClass->wc = *lpWndClass;
			lpMemClass->wc.lpszClassName = lpszClassName;
			strcpy( lpszClassName, lpWndClass->lpszClassName );

			if( lpMemClass->wc.hbrBackground && (ULONG)lpMemClass->wc.hbrBackground <= SYS_COLOR_NUM )
			{
				lpMemClass->wc.hbrBackground = WinSys_GetColorBrush( (ULONG)lpMemClass->wc.hbrBackground - 1 );
			}

			return lpMemClass;
		}
		BlockHeap_FreeString( hgwmeBlockHeap, 0, lpMemClass );
	}
	return NULL;
}

// **************************************************
// 声明:static VOID FreeClassStruct( _LPREGCLASS lpMemClass )
// 参数:
// 	IN lpMemClass - 类结构指针
// 返回值:
//	无
// 功能描述:
//	释放类结构
// 引用: 
//	
// ************************************************
static VOID FreeClassStruct( _LPREGCLASS lpMemClass )
{
	BlockHeap_FreeString( hgwmeBlockHeap, 0, (LPVOID)lpMemClass->wc.lpszClassName );
	BlockHeap_FreeString( hgwmeBlockHeap, 0, lpMemClass );
}


// **************************************************
// 声明:ATOM WINAPI WinClass_Register( LPCWNDCLASS lpWndClass )
// 参数:
// 	IN lpWndClass - WNDCLASS 结构指针,包含类信息
// 返回值:
//	假如成功,返回非0的ID值;否则,返回0
// 功能描述:
//	注册窗口类
// 引用: 
//	系统API
// ************************************************

#define DEBUG_CLASS_REGISTER 0
ATOM WINAPI WinClass_Register( LPCWNDCLASS lpWndClass )
{
    _LPREGCLASS lpMemClass;
	_LPPROCESS_CLASS lpProcessList;
	WNDCLASS wc;
	HANDLE hCallerProcess;
	DEBUGMSG( DEBUG_CLASS_REGISTER, ( "WinClass_Register:Entry.\r\n" ) );
	//检查参数	
	if( ( lpWndClass->hInstance == 0 && 
		  lpWndClass->lpfnWndProc == NULL &&
		  lpWndClass->lpszClassName == NULL ) || 
		  lpWndClass->cbClsExtra > 40 ||
		  (lpWndClass->cbClsExtra & 3) ||
		  lpWndClass->cbWndExtra > 40 ||
		  (lpWndClass->cbWndExtra & 3) )
	{
		ASSERT( 0 );
		SetLastError( ERROR_INVALID_PARAMETER );
		return 0;
	}
	//	得到呼叫者进程
	hCallerProcess = GetCallerProcess();

	if( hCallerProcess )
	{
		wc = *lpWndClass;
		wc.lpszClassName = MapPtrToProcess( (LPVOID)wc.lpszClassName, hCallerProcess );
		wc.lpszMenuName = MapPtrToProcess( (LPVOID)wc.lpszMenuName, hCallerProcess );
		lpWndClass = &wc;
	}
	else
		hCallerProcess = hgwmeProcess;
	//	进入冲突段
    EnterCriticalSection( &csWndClass );

	DEBUGMSG( DEBUG_CLASS_REGISTER, ( "WinClass_Register:_FindClass.\r\n" ) );
	//查找当前是否已经存在该类
	lpMemClass = _FindClass( lpWndClass->lpszClassName, hCallerProcess, lpWndClass->hInstance, &lpProcessList, NULL );
	
	if( lpMemClass == NULL )
	{	//类不存在
//		LOGBRUSH logBrush;
		int len;
		int clsLen = lpWndClass->cbClsExtra;

		DEBUGMSG( DEBUG_CLASS_REGISTER, ( "WinClass_Register: class not exist.\r\n" ) );
		len = strlen( lpWndClass->lpszClassName ) + sizeof( TCHAR );		
		if( lpProcessList == NULL )
		{	//该进程类链表未初始化,现在去初始化
			DEBUGMSG( DEBUG_CLASS_REGISTER, ( "WinClass_Register: alloc _PROCESS_CLASS struct.\r\n" ) );
			lpProcessList = (_LPPROCESS_CLASS)BlockHeap_Alloc( hgwmeBlockHeap, 0, sizeof(_PROCESS_CLASS) );
			
			if( lpProcessList )
			{
				DEBUGMSG( DEBUG_CLASS_REGISTER, ( "WinClass_Register: init lpProcessList.\r\n" ) );
				memset( lpProcessList, 0, sizeof( _PROCESS_CLASS ) );
				lpProcessList->hProcess = hCallerProcess;
				lpProcessList->lpNext = lpProcessClassList;
				lpProcessClassList = lpProcessList;
			}
			else
			{
				WARNMSG( DEBUG_CLASS_REGISTER, ( "WinClass_Register: alloc _PROCESS_CLASS failure.\r\n" ) );
				LeaveCriticalSection( &csWndClass );
				return 0;
			}
		}
		//分配一个类结构
		DEBUGMSG( DEBUG_CLASS_REGISTER, ( "WinClass_Register: alloc string.\r\n" ) );
		lpMemClass = (_LPREGCLASS)AllocAndInitClassStruct( len, clsLen, lpWndClass, hCallerProcess );
		
		if( lpMemClass )
		{	//初始化类对象
			//连接到进程类链表
			lpMemClass->lpNext = lpProcessList->lpRegClass;
			lpProcessList->lpRegClass = lpMemClass;
			DEBUGMSG( DEBUG_CLASS_REGISTER, ( "RegisterClass(%s) success,hCallerProcess=%x.\r\n", lpMemClass->wc.lpszClassName, hCallerProcess ) );
		}
	}
	//离开冲突段
	LeaveCriticalSection( &csWndClass );
    return (int)lpMemClass;
}

// **************************************************
// 声明:DWORD WINAPI WinClass_GetLong( HWND hWnd, int nIndex )
// 参数:
//	IN hwnd-窗口句柄
//	IN nIndex-索引值,包含:
//   GCL_MENUNAME-菜单名
//   GCL_HBRBACKGROUND-背景刷
//   GCL_HCURSOR-光标
//   GCL_HICON-位图
//   GCL_CBWNDEXTRA-窗口扩展尺寸
//   GCL_WNDPROC-窗口过程地址
//  	GCL_STYLE-类风格
// 返回值:
//	成功:返回要求的32bit值
//	否则:返回0
// 功能描述:
//	得到类信息
// 引用: 
//	系统API
// ************************************************

DWORD WINAPI WinClass_GetLong( HWND hWnd, int nIndex )
{
    _LPREGCLASS lpwc;
	_LPWINDATA lpws = _GetHWNDPtr( hWnd );
	
	SetLastError( ERROR_SUCCESS );
	if( lpws )
	{
		lpwc = lpws->lpClass;
		if( lpwc && lpwc->objType == OBJ_CLASS )
		{
			switch( nIndex )
			{
            case GCL_MENUNAME:
                return (DWORD)lpwc->wc.lpszMenuName;
            case GCL_HBRBACKGROUND:
                return (DWORD)lpwc->wc.hbrBackground;
            case GCL_HCURSOR:
                return (DWORD)lpwc->wc.hCursor;
            case GCL_HICON:
                return (DWORD)lpwc->wc.hIcon;
            case GCL_CBWNDEXTRA:
                return (DWORD)lpwc->wc.cbWndExtra;
            case GCL_WNDPROC:
                return (DWORD)lpwc->wc.lpfnWndProc;
            case GCL_STYLE:
                return (DWORD)lpwc->wc.style;
            default:
				if( nIndex >= 0 && (nIndex & 3) && (nIndex + 4) <= lpwc->wc.cbClsExtra )
				{
					LPDWORD lpExtra = (LPDWORD)(&lpwc->wc + 1);
					return lpExtra[nIndex/4];
				}
                ASSERT( 0 );
			}
		}
	}
	SetLastError( ERROR_INVALID_PARAMETER );
    return 0;
}

// **************************************************
// 声明:DWORD WINAPI WinClass_SetLong( HWND hWnd, int nIndex, LONG lNewValue )
// 参数:
//	IN hWnd-窗口句柄
//	IN nIndex-索引值,包含:
//   GCL_MENUNAME-菜单名
//   GCL_HBRBACKGROUND-背景刷
//   GCL_HCURSOR-光标
//   GCL_HICON-位图
//   GCL_CBWNDEXTRA-窗口扩展尺寸
//   GCL_WNDPROC-窗口过程地址
//  	GCL_STYLE-类风格
//	IN lNewValue-新的类值
// 返回值:
//	假如成功,返回之前的值;否则,返回0
// 功能描述:
//	设置类信息
// 引用: 
//	系统API
// ************************************************

#define DEBUG_CLASS_SETLONG 0
DWORD WINAPI WinClass_SetLong( HWND hWnd, int nIndex, LONG lNewValue )
{
    _LPREGCLASS lpwc;
	_LPWINDATA lpws = _GetHWNDPtr( hWnd );
	DWORD dwOldValue = 0;
	DWORD dwErrorCode = ERROR_SUCCESS;

	if( lpws )
	{
		lpwc = lpws->lpClass;

		if( lpws->hOwnerProcess == lpwc->hOwnerProcess
			&& lpwc->objType == OBJ_CLASS )
		{
			switch( nIndex )
			{
            case GCL_HBRBACKGROUND:
				dwOldValue = (DWORD)lpwc->wc.hbrBackground;
				lpwc->wc.hbrBackground = (HBRUSH)lNewValue;
				break;
            case GCL_HCURSOR:
				dwOldValue = (DWORD)lpwc->wc.hCursor;
				lpwc->wc.hCursor = (HCURSOR)lNewValue;
				break;
            case GCL_HICON:
				dwOldValue = (DWORD)lpwc->wc.hIcon;
				lpwc->wc.hIcon = (HICON)lNewValue;
				break;
            default:
				if( nIndex >= 0 && (nIndex & 3) && (nIndex + 4) <= lpwc->wc.cbClsExtra )
				{

⌨️ 快捷键说明

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