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

📄 static.c

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

/*****************************************************
文件说明:静态类 static class
版本号:1.0.0
开发时期:2000
作者:李林
修改记录:
******************************************************/

#include <eframe.h>
#include <estatic.h>
//#include <gwmesrv.h>

// 类名

typedef struct _STATIC_ATTRIB
{
	HANDLE   hImage;
    COLORREF cl_Text;//正常文本的前景
    COLORREF cl_TextBk;     //正常文本的前景与背景色
	COLORREF cl_Disable;    // 无效文本的前景色
	COLORREF cl_DisableBk;    // 无效文本的背景色
}STATIC_ATTRIB, * PSTATIC_ATTRIB;

static const char strClassStatic[]="STATIC";

static LRESULT CALLBACK StaticWndProc( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
static void DoPAINT( HWND hwnd );
static VOID _SetStaticColor( PSTATIC_ATTRIB pAttrib );


// **************************************************
// 声明:ATOM RegisterButtonClass(HINSTANCE hInst)
// 参数:
//		IN hInst - 实例句柄
// 返回值:
//		假如成功,返回非0值;失败,返回0
// 功能描述:
//		注册按钮类
// 引用: 
//		被sysclass.c 调用
// ************************************************
ATOM RegisterStaticClass( HINSTANCE hInst )
{
    WNDCLASS wc;

    wc.style = CS_DBLCLKS;
    wc.lpfnWndProc = StaticWndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = sizeof( PSTATIC_ATTRIB );
    wc.hInstance = hInst;
    wc.hIcon = 0;//LoadIcon(NULL, IDI_APPLICATION );
    wc.hCursor = 0;//LoadCursor(NULL, IDC_ARROW );
    wc.hbrBackground = NULL;//GetStockObject( LTGRAY_BRUSH );
    wc.lpszMenuName = 0;
    wc.lpszClassName = strClassStatic;

    return (BOOL)(RegisterClass( &wc ));
}

// **************************************************
// 声明:static void FillSolidRect( HDC hdc, RECT * lprc, COLORREF clr )
// 参数:
//	IN hdc - 显示设备句柄
//	IN lprc - RECT 结构指针,指向需要填充的矩形
//	IN clr - RGB颜色值
// 返回值:
//	无
// 功能描述:
//	用固定颜色填充举行矩形
// 引用: 
//	
// ************************************************
static void FillSolidRect( HDC hdc, RECT * lprc, COLORREF clr )
{
	SetBkColor( hdc, clr );
	ExtTextOut( hdc, 0, 0, ETO_OPAQUE, lprc, NULL, 0, NULL );
}

// **************************************************
// 声明:static void DoDraw( HWND hwnd, HDC hdc, DWORD dwStyle )
// 参数:
//	IN hwnd - 窗口句柄
//	IN hdc - 显示设备句柄
//	IN dwStyle - 窗口风格
// 返回值:
//	无
// 功能描述:
//	用固定颜色填充举行矩形
// 引用: 
//	
// ************************************************
static void DoDraw( HWND hwnd, HDC hdc, DWORD dwStyle )
{
	HBITMAP hBitmap;
	RECT rect;
	HDC hMemDC;
	HPEN hPen;
    BITMAP bitmap;
    int i;
    DWORD dwDrawStyle;//prefix;
	PSTATIC_ATTRIB pAttrib = (PSTATIC_ATTRIB)GetWindowLong( hwnd, 0 );// 从窗口私有数据区得到控件属性

	if( (dwStyle & 0x1f) == SS_OWNERDRAW  )
    {	// 自绘风格
	    DRAWITEMSTRUCT di;
        di.CtlID = (WORD)GetWindowLong( hwnd, GWL_ID );
        di.CtlType = ODT_STATIC;
        di.hDC = hdc;
        di.hwndItem = hwnd;
        di.itemAction = ODA_DRAWENTIRE;
        di.itemData = 0;
        di.itemID = 0;
        di.itemState = ODS_DEFAULT;
        GetClientRect( hwnd, &di.rcItem );	// 得到窗口客户区矩形坐标
		// 向父窗口发送通知消息
        SendMessage( GetParent( hwnd ), WM_DRAWITEM, (WPARAM)di.CtlID, (LPARAM)&di );
        return;
    }
	GetClientRect( hwnd, &rect );// 得到窗口客户区矩形坐标
    
    if( dwStyle & SS_NOPREFIX )	// 控件包含前缀字符吗 ?例如:"&Hello" 的'&'
        dwDrawStyle = DT_NOPREFIX;	// 没有前缀字符
    else
        dwDrawStyle = 0;
	dwDrawStyle |= DT_END_ELLIPSIS;	// 用省略号表示无法显示部分,例如:"Hello,W..."

	switch( (dwStyle & 0x1f) )
	{
	case SS_CENTER:			// 文本居中
	    dwDrawStyle |= DT_CENTER | DT_WORDBREAK;
		break;
	case SS_LEFT:			// 文本左对齐
        dwDrawStyle	|= DT_LEFT | DT_WORDBREAK;
		break;
	case SS_RIGHT:			// 文本右对齐
		dwDrawStyle	|= DT_RIGHT | DT_WORDBREAK;
		break;
	case SS_LEFTNOWORDWRAP:		// 
		dwDrawStyle	|= DT_LEFT;
	}

	switch( dwStyle & 0x1f )
	{
	case SS_BITMAP:			// 位图风格
		hBitmap = pAttrib->hImage;
        GetObject( hBitmap, sizeof(bitmap), &bitmap );
		hMemDC =  CreateCompatibleDC( hdc );
		hBitmap = SelectObject( hMemDC, hBitmap );
        BitBlt( hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hMemDC, 0, 0, SRCCOPY );
        hBitmap = SelectObject( hMemDC, hBitmap );
		DeleteDC( hMemDC );
		break;
    case SS_ICON:			// 图标风格
        DrawIcon( hdc, 0, 0, pAttrib->hImage );
        break;
	case SS_BLACKFRAME:		// 黑色边框
		SelectObject( hdc, GetStockObject( NULL_BRUSH ) );
		Rectangle( hdc, rect.left, rect.top, rect.right, rect.bottom );
		break;
	case SS_BLACKRECT:		// 黑色矩形
        FillRect( hdc, &rect, GetStockObject( BLACK_BRUSH ) );
        break;
	case SS_WHITEFRAME:		// 白色边框
		SelectObject( hdc, GetStockObject( WHITE_PEN ) );
        SelectObject( hdc, GetStockObject( NULL_BRUSH ) );
		Rectangle( hdc, rect.left, rect.top, rect.right, rect.bottom );
        break;
	case SS_WHITERECT:		// 白色矩形
		FillRect( hdc, &rect, GetStockObject( WHITE_BRUSH ) );
        break;
	case SS_GRAYFRAME:		// 灰色边框
        hPen = CreatePen( PS_SOLID, 1, CL_LIGHTGRAY );
        hPen = SelectObject( hdc, hPen );
        SelectObject( hdc, GetStockObject( NULL_BRUSH ) );
		Rectangle( hdc, rect.left, rect.top, rect.right, rect.bottom );
        hPen = SelectObject( hdc, hPen );
        DeleteObject( hPen );
        break;
	case SS_GRAYRECT:		// 灰色矩形
        FillRect( hdc, &rect, GetStockObject( GRAY_BRUSH ) );
		break;
	case SS_CENTER:
    case SS_LEFT:
	case SS_RIGHT:
	case SS_LEFTNOWORDWRAP:
		SetBkMode( hdc, TRANSPARENT );		// 设置文本的背景为透明模式
		i = GetWindowTextLength(hwnd);
		i += sizeof(TCHAR); //+0结束符
		if( i )
		{
			TCHAR szText[128];
			LPTSTR lpstr;
			if( i <= sizeof(szText) )
				lpstr = szText;
		    else
			    lpstr = (LPSTR)malloc( i );   // 需要以后改进
			if( lpstr )
			{
				i = GetWindowText( hwnd, lpstr, i );	// 得到文本
				// 设置需要显示的文本颜色
				if( dwStyle & WS_DISABLED )			// 
					SetTextColor( hdc, pAttrib->cl_Disable );
				else
				    SetTextColor( hdc, pAttrib->cl_Text );
				// 画文本
				DrawText( hdc,
					lpstr,
					i,
					&rect,
					dwDrawStyle );
				if( lpstr != szText )
				    free(lpstr);	//用malloc分配的
			}
		}
		break;
	}
}

// **************************************************
// 声明:static LRESULT DoLButtonDown( HWND hWnd ) //, short x, short y )
// 参数:
//	IN hWnd - 窗口句柄
// 返回值:
//	返回0
// 功能描述:
//	处理 WM_LBUTTONDOWN 消息
// 引用: 
//	
// ************************************************

static LRESULT DoLButtonDown( HWND hWnd ) //, short x, short y )
{
	HWND hParent = GetParent( hWnd );
	if( hParent )
	{	// 得到控件风格
		DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
		if( dwStyle & SS_NOTIFY )	// 是否发通知消息 ?
		{	// 是
			WPARAM wParam = (WPARAM)GetWindowLong( hWnd, GWL_ID ); // 控件ID
			wParam = MAKELONG( wParam, STN_CLICKED );		// 通知消息类型
			//	向父窗口发通知消息
			return SendMessage( hParent, WM_COMMAND, wParam, (LPARAM)hWnd );
		}
	}
	return 0;
}

// **************************************************
// 声明:static LRESULT DoEnable( HWND hWnd, BOOL bEnable )
// 参数:
//	IN hWnd - 窗口句柄
//	IN bEnable - 控件是否处于有效状态
// 返回值:
//	返回0
// 功能描述:
//	处理 WM_ENABLE 消息
// 引用: 
//	
// ************************************************

static LRESULT DoEnable( HWND hWnd, BOOL bEnable )
{
	HWND hParent = GetParent( hWnd );
	if( hParent )
	{	// 得到控件风格
		DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
		HDC hdc = GetDC( hWnd );
		DoDraw( hWnd, hdc, dwStyle );
		ReleaseDC( hWnd, hdc );
		if( dwStyle & SS_NOTIFY )	// 是否发通知消息 ?
		{
			WPARAM wParam = (WPARAM)GetWindowLong( hWnd, GWL_ID );// 控件ID
			// 通知消息类型
			if( bEnable )
				wParam = MAKELONG( wParam, STN_ENABLE );
			else
				wParam = MAKELONG( wParam, STN_DISABLE );
			//	向父窗口发通知消息
			return SendMessage( hParent, WM_COMMAND, wParam, (LPARAM)hWnd );
		}
	}
	return 0;
}

// **************************************************
// 声明:static LRESULT SetImage( HWND hwnd, UINT dwStyle, HANDLE hImage )
// 参数:
//	IN hWnd - 窗口句柄
//	IN dwStyle - 窗口风格
//	IN hImage - 图形句柄
// 返回值:
//	返回之前的图形句柄
// 功能描述:
//	设置控件显示映象
// 引用: 
//	
// ************************************************

static LRESULT SetImage( HWND hwnd, DWORD dwStyle, HANDLE hImage )
{
    HANDLE handle;
    //DWORD dwStyle;
	PSTATIC_ATTRIB pAttrib;

    pAttrib = (PSTATIC_ATTRIB)GetWindowLong( hwnd, 0 );// 从窗口私有数据区得到控件属性

	handle = pAttrib->hImage;
	pAttrib->hImage = hImage;

	//dwStyle = GetWindowLong( hwnd, GWL_STYLE ); // 得到窗口风格 
	// 假如可能,重新绘制
	if( (dwStyle & WS_VISIBLE) == WS_VISIBLE )	// 可视吗 ?
	{	// 可视,绘制窗口客户区
		HDC hdc;
		// 
        hdc = GetDC( hwnd );	// 得到显示设备DC
		DoDraw( hwnd, hdc, dwStyle );	// 实际的绘制
		ReleaseDC( hwnd, hdc );	// 释放DC
	}
    return (LRESULT)handle;
}

// **************************************************
// 声明:static LRESULT DoSetImage( HWND hwnd, UINT uiType, HANDLE hImage )
// 参数:
//	IN hwnd - 窗口句柄
//	IN uiType - 图形对象的类型
//	IN hImage - 图形句柄
// 返回值:
//	假如成功,返回之前的图形句柄;否则,返回NULL
// 功能描述:
//	设置控件显示映象,处理 STM_SETICON 和 STM_SETIMAGE 消息
// 引用: 
//	
// ************************************************

static LRESULT DoSetImage( HWND hwnd, UINT uiType, HANDLE hImage )
{
	DWORD dwStyle;

	dwStyle = GetWindowLong( hwnd, GWL_STYLE );// 得到窗口风格
	switch( uiType )
	{
	case IMAGE_BITMAP:
		if( dwStyle & SS_BITMAP )	// 映象类型与窗口风格是否一致 ?
		{	// 是
			return SetImage( hwnd, dwStyle, hImage );

⌨️ 快捷键说明

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