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