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