📄 button.c
字号:
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 + -