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

📄 button.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:
	DWORD s, dwStyle;
//    int type;
	HDC hdc;
	PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );// 从窗口私有数据区得到控件属性

	if( pAttrib->btFlag & BTF_DISABLEFOCUS )
		return 0;

	// get current state at extra window bytes
	s = pAttrib->btState;//GetWindowLong( hWnd, OFFSET_STATE );
	s |= BST_FOCUS;  // set focus flag
    // set new state at extra window bytes
	pAttrib->btState = (WORD)s;

	dwStyle = GetWindowLong( hWnd, GWL_STYLE );	// 得到窗口风格

    if( GETTYPE( dwStyle ) != BS_GROUPBOX )	// 组框 ?
    {   // 否 get draw dc
        hdc = GetDC( hWnd );	// 从系统得到显示DC
        if( GETTYPE( dwStyle ) ==  BS_OWNERDRAW )	// 自绘
            DoOwnerDraw( hdc, hWnd, s, ODA_FOCUS );	// 
        else
        {            
            RECT rect, textRect, iconRect;
            GetClientRect( hWnd, &rect );	// 得到客户区
            GetDrawRect( hdc, &rect, &textRect, &iconRect, dwStyle );        
            DrawFocusRect( hdc, &textRect );	// 画焦点
        }
        ReleaseDC( hWnd, hdc );	// 释放DC
    }
	if( dwStyle & BS_NOTIFY )	// 假如可能, 向父发通知消息
	    SendNotify( GetParent(hWnd), GetWindowLong(hWnd, GWL_ID), BN_SETFOCUS, hWnd );
	return 0;
}

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

static LRESULT DoKILLFOCUS( HWND hWnd )
{
	DWORD s, dwStyle;
	HDC hdc;
	PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );// 从窗口私有数据区得到控件属性


	// get current state
	s = pAttrib->btState;
	s &= ~BST_FOCUS;
	// set new state to extra window bytes
	pAttrib->btState = (WORD)s;

    dwStyle = GetWindowLong( hWnd, GWL_STYLE ); // 得到窗口风格

    if( GETTYPE( dwStyle ) != BS_GROUPBOX )	// 组框 ?
    {
        // get draw dc
        hdc = GetDC( hWnd );// 从系统得到显示DC
        // get window style
        if( GETTYPE( dwStyle ) ==  BS_OWNERDRAW )	// 自绘
            DoOwnerDraw( hdc, hWnd, s, ODA_FOCUS );
        else
        {
            RECT rect, textRect, iconRect;
            
            GetClientRect( hWnd, &rect );// 得到客户区
            GetDrawRect( hdc, &rect, &textRect, &iconRect, dwStyle );
            DrawFocusRect( hdc, &textRect );
        }
        ReleaseDC( hWnd, hdc );	// 释放DC
    }
	if( dwStyle & BS_NOTIFY )	// 假如可能, 向父发通知消息
	    SendNotify( GetParent(hWnd), GetWindowLong(hWnd, GWL_ID), BN_KILLFOCUS, hWnd );

	return 0;
 }

// **************************************************
// 声明:static LRESULT DoSETSTATE( HWND hWnd, WARAM wParam )
// 参数:
//	IN hWnd - 窗口句柄
//	IN wParam - 新的状态. 假如为TRUE,设置为选择状态;否则为非选择状态
// 返回值:
//	返回0
// 功能描述:
//	设置按钮状态,也是 BM_SETSTATE 消息的处理函数
// 引用: 
//	
// ************************************************

static LRESULT DoSETSTATE( HWND hWnd, WPARAM wParam )
{
	HDC hdc;
	DWORD dwStyle;
	DWORD state;
	PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );// 从窗口私有数据区得到控件属性

	dwStyle = GetWindowLong( hWnd, GWL_STYLE );// 得到窗口风格

    {
        // get current state
        state = pAttrib->btState;
        if( wParam )
            state |= BST_PUSHED;	//按下状态
        else
            state &= ~BST_PUSHED;
        // set new state
		pAttrib->btState = (WORD)state;
        // get draw dc
        hdc = GetDC( hWnd );		// 从系统得到显示DC

        if( GETTYPE( dwStyle ) ==  BS_OWNERDRAW )	// 自绘
            DoOwnerDraw( hdc, hWnd, state, ODA_SELECT );
        else
            DrawButtonState( hdc, hWnd, dwStyle, state );
        
        ReleaseDC( hWnd, hdc );// 释放DC
    }
    return 0;
}

// **************************************************
// 声明:static LRESULT DoSETCHECK( HWND hWnd, WARAM wParam )
// 参数:
//	IN hWnd - 窗口句柄
//	IN wParam - 新的状态. 假如为TRUE,设置为选择状态;否则为非选择状态
// 返回值:
//	返回0
// 功能描述:
//	设置按钮状态,也是 BM_SETCHECK 消息的处理函数
// 引用: 
//	
// ************************************************

static LRESULT DoSETCHECK( HWND hWnd, WPARAM wParam )
{
	HDC hdc;
	DWORD dwStyle;
	DWORD state;
	PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );// 从窗口私有数据区得到控件属性

	// get current state
	state = pAttrib->btState;

    if( wParam & BST_CHECKED )
        state |= BST_CHECKED;//选择状态
    else
	    state &= ~BST_CHECKED;
	// set new state
	pAttrib->btState = (WORD)state;

	// get draw dc
	hdc = GetDC( hWnd );// 从系统得到显示DC
	// get window style
	dwStyle = GetWindowLong( hWnd, GWL_STYLE );// 得到窗口风格

	if( GETTYPE( dwStyle ) ==  BS_OWNERDRAW )	// 自绘
		DoOwnerDraw( hdc, hWnd, state, ODA_SELECT );
	else
		DrawButtonState( hdc, hWnd, dwStyle, state );

	ReleaseDC( hWnd, hdc );// 释放DC
	return 0;
}

// **************************************************
// 声明:static VOID _SetButtonColor( PBUTTON_ATTRIB pAttrib )
// 参数:
//	IN pAttrib - 按钮类数据结构
// 返回值:
//	无
// 功能描述:
//	设置窗口显示颜色
// 引用: 
//	
// ************************************************

static VOID _SetButtonColor( PBUTTON_ATTRIB pAttrib )
{
	pAttrib->cl_Text = GetSysColor( COLOR_BTNTEXT );
	pAttrib->cl_TextBk = GetSysColor( COLOR_BTNFACE );
	pAttrib->cl_Disable = GetSysColor( COLOR_GRAYTEXT );
	pAttrib->cl_DisableBk = GetSysColor( COLOR_BTNFACE );
}

// **************************************************
// 声明:static LRESULT DoCreate( HWND hWnd )
// 参数:
//	IN hWnd - 窗口句柄
// 返回值:
//	成功,返回0; 否则,返回-1
// 功能描述:
//	初始化窗口数据。处理 WM_CREATE 消息
// 引用: 
//	
// ************************************************

static LRESULT DoCreate( HWND hWnd )
{
	PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)malloc( sizeof(BUTTON_ATTRIB) );	// 分配控件属性结构
	if( pAttrib )
	{	//初始化
		memset( pAttrib, 0, sizeof(BUTTON_ATTRIB) );
		//pAttrib->cl_Text = GetSysColor( COLOR_BTNTEXT );
		//pAttrib->cl_TextBk = GetSysColor( COLOR_BTNFACE );
		//pAttrib->cl_Disable = GetSysColor( COLOR_GRAYTEXT );
		//pAttrib->cl_DisableBk = GetSysColor( COLOR_BTNFACE );
		_SetButtonColor( pAttrib );

		SetWindowLong( hWnd, 0, (LONG)pAttrib );// 设置控件属性指针到窗口私有数据区
		return 0;  // 成功
	}
	return -1;  // 失败
}

// **************************************************
// 声明:static LRESULT DoDestroy( HWND hWnd )
// 参数:
//	IN hWnd - 窗口句柄
// 返回值:
//	返回0
// 功能描述:
//	破坏窗口数据。处理 WM_DESTROY 消息
// 引用: 
//	
// ************************************************

static LRESULT DoDestroy( HWND hWnd )
{
	PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );// 从窗口私有数据区得到控件属性
	free( pAttrib );	//释放
	return 0;
}

// **************************************************
// 声明:static LRESULT DoSetCtlColor( HWND hWnd, LPCTLCOLORSTRUCT lpccs )
// 参数:
//	IN hWnd - 窗口句柄
//	IN lpccs - 控件结构,包含颜色值
// 返回值:
//	成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//	设置控件颜色
// 引用: 
//	
// ************************************************

static LRESULT DoSetCtlColor( HWND hWnd, LPCTLCOLORSTRUCT lpccs )
{
	if( lpccs )
	{
		PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );// 从窗口私有数据区得到控件属性

		if( lpccs->fMask & CLF_TEXTCOLOR )	// 文本
			pAttrib->cl_Text = lpccs->cl_Text;
		if( lpccs->fMask & CLF_TEXTBKCOLOR )	// 文本背景
			pAttrib->cl_TextBk = lpccs->cl_TextBk;
		if( lpccs->fMask & CLF_DISABLECOLOR )	// 无效文本
			pAttrib->cl_Disable = lpccs->cl_Disable;
		if( lpccs->fMask & CLF_DISABLEBKCOLOR )	// 无效文本背景
			pAttrib->cl_DisableBk = lpccs->cl_DisableBk;
        RefreshButton( hWnd, pAttrib );	// 重绘
		return TRUE;
	}
	return FALSE;
}

// **************************************************
// 声明:static LRESULT DoGetCtlColor( HWND hWnd, LPCTLCOLORSTRUCT lpccs )
// 参数:
//	IN hWnd - 窗口句柄
//	IN lpccs - 控件结构,包含颜色值
// 返回值:
//	成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//	得到控件颜色
// 引用: 
//	
// ************************************************

static LRESULT DoGetCtlColor( HWND hWnd, LPCTLCOLORSTRUCT lpccs )
{
	if( lpccs )
	{
		PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );// 从窗口私有数据区得到控件属性

		if( lpccs->fMask & CLF_TEXTCOLOR )	// 文本
			lpccs->cl_Text = pAttrib->cl_Text;
		if( lpccs->fMask & CLF_TEXTBKCOLOR )	// 文本背景
			lpccs->cl_TextBk = pAttrib->cl_TextBk;
		if( lpccs->fMask & CLF_DISABLECOLOR )	// 无效文本
			lpccs->cl_Disable = pAttrib->cl_Disable;
		if( lpccs->fMask & CLF_DISABLEBKCOLOR )	// 无效文本背景
			lpccs->cl_DisableBk = pAttrib->cl_DisableBk;

		return TRUE;
	}
	return FALSE;	
}

// **************************************************
// 声明:static LRESULT DoSysColorChange( HWND hWnd )
// 参数:
// 	IN hWnd - 窗口句柄
// 返回值:
//	返回 0
// 功能描述:
//	处理系统颜色改变
// 引用: 
// ************************************************

static LRESULT DoSysColorChange( HWND hWnd )
{
    PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );// 从窗口私有数据区得到控件属性

	_SetButtonColor( pAttrib );
	return 0;
}


static LRESULT DoEnableFocus( HWND hWnd, BOOL bEnable )
{
	PBUTTON_ATTRIB pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );// 从窗口私有数据区得到控件属性
	if( bEnable )
	{	//enable
		pAttrib->btFlag &= ~BTF_DISABLEFOCUS;
	}
	else
	{	//disbale
		pAttrib->btFlag |= BTF_DISABLEFOCUS;
	}
	return 0;
}

// **************************************************
// 声明:LRESULT WINAPI ButtonWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
// 参数:
//  IN hWnd - 窗口句柄
//	IN message - 消息
//	IN wParam - 第一个消息
//	IN lParam - 第二个消息
// 返回值:
//	依赖于具体的消息
// 功能描述:
//	按钮窗口处理总入口
// 引用: 
//	
// ************************************************

// this all message handle center
LRESULT WINAPI ButtonWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	DWORD s;
	PBUTTON_ATTRIB pAttrib;
	switch( message )
	{
	case WM_PAINT:			// 系统绘制消息
		return DoPAINT( hWnd );
	case WM_LBUTTONDBLCLK:			// 左鼠标双击消息
	case WM_LBUTTONDOWN:			// 左鼠标按下消息
		return DoLBUTTONDOWN( hWnd );
    case WM_MOUSEMOVE:				// 鼠标移动消息
        if( wParam & MK_LBUTTON )
            return DoMouseMove( hWnd, LOWORD( lParam ), HIWORD( lParam ) );
         else
             break;
	case WM_LBUTTONUP:				// 左鼠标释放消息
		return DoLBUTTONUP( hWnd, LOWORD( lParam ), HIWORD( lParam ) );
	case WM_SETFOCUS:				// 设置焦点
		return DoSETFOCUS( hWnd );
	case WM_KILLFOCUS:				// 释放焦点
		return DoKILLFOCUS( hWnd );
	case BM_GETCHECK:					// 得到选择状态
		s = GetWindowLong( hWnd, GWL_STYLE );
		s &= 0x0f;
		if( s == BS_RADIOBUTTON ||
			s == BS_CHECKBOX || 
			s == BS_AUTOCHECKBOX ||
			s == BS_AUTORADIOBUTTON ||
			s == BS_AUTO3STATE ||
			s == BS_3STATE )
		{
			pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );
			return pAttrib->btState & 0x03;//return (GetWindowLong( hWnd, OFFSET_STATE ) & 0x03 );
		}
		// if this is pushbutton
		return 0;
	case BM_SETCHECK:				// 设置选择状态
		return DoSETCHECK( hWnd, wParam );
	case BM_GETSTATE:				
		pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );
		return pAttrib->btState;
	case BM_SETSTATE:
		return DoSETSTATE( hWnd, wParam );
	case BM_SETSTYLE:				// 设置风格
		s = GetWindowLong( hWnd, GWL_STYLE );
		s &= 0xffff0000l;
		s |= LOWORD( wParam );
		SetWindowLong( hWnd, GWL_STYLE, s );
		if( lParam )
		{  // to redraw button, I invalidate entire client
			//InvalidateRect( hWnd, 0, TRUE );
			RefreshButton( hWnd, NULL );
		}
		return 0;
    case BM_SETIMAGE:			// 设置显示图片
		pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );
        s = (DWORD)pAttrib->hImage;
        pAttrib->hImage = (HANDLE)lParam;
		RefreshButton( hWnd, NULL );	//重绘
        return s;     
    case BM_GETIMAGE:
		pAttrib = (PBUTTON_ATTRIB)GetWindowLong( hWnd, 0 );
        return (DWORD)pAttrib->hImage;
	case WM_SETTEXT:
		s = DefWindowProc(hWnd,message,wParam,lParam);
		RefreshButton( hWnd, NULL );	//重绘
		return s;
	case WM_ENABLE:
		RefreshButton( hWnd, NULL );	//重绘
		return 0;
    case WM_SETCTLCOLOR:		// 设置显示颜色
		return DoSetCtlColor( hWnd, (LPCTLCOLORSTRUCT)lParam );
    case WM_GETCTLCOLOR:
		return DoGetCtlColor( hWnd, (LPCTLCOLORSTRUCT)lParam );
	case BM_ENABLEFOCUS:		//关闭或打开按钮的焦点功能
		return DoEnableFocus( hWnd, wParam );
	case WM_SYSCOLORCHANGE:
		return DoSysColorChange( hWnd );
    case WM_CREATE:				// 窗口创建初始化
		return DoCreate( hWnd );
    case WM_DESTROY:			// 破坏
		return DoDestroy( hWnd );

	}
	// It's important to do this
	// if your do'nt handle message, you must call DefWindowProc
	// 重要提示:假如你不需要处理消息,将该消息交由系统窗口默认处理函数去处理
	// 
	return DefWindowProc(hWnd,message,wParam,lParam);
}

⌨️ 快捷键说明

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