按钮凸出状态
时间: 2023-08-31 13:13:33 浏览: 48
如果你想要在按钮被按下时实现凸出的效果,可以使用OwnerDraw属性,并重载WM_DRAWITEM消息来自定义按钮的绘制。
下面是一个简单的示例代码:
首先在资源文件中将按钮的Style属性设置为OwnerDraw,然后在窗口类的消息处理函数中添加下面的代码:
```c++
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
if (lpdis->hwndItem == hButton) // hButton是按钮的句柄
{
// 绘制按钮的背景
if (lpdis->itemState & ODS_SELECTED)
SetBkColor(lpdis->hDC, RGB(255, 0, 0)); // 设置选中状态的背景颜色为红色
else if (lpdis->itemState & ODS_FOCUS)
SetBkColor(lpdis->hDC, RGB(0, 255, 0)); // 设置获取焦点状态的背景颜色为绿色
else
SetBkColor(lpdis->hDC, RGB(0, 0, 255)); // 设置普通状态的背景颜色为蓝色
ExtTextOut(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, ETO_OPAQUE, &lpdis->rcItem, NULL, 0, NULL); // 填充背景
// 绘制按钮的文本
TCHAR szText[256];
GetWindowText(lpdis->hwndItem, szText, 256);
SetTextColor(lpdis->hDC, RGB(255, 255, 255)); // 设置文本颜色为白色
DrawText(lpdis->hDC, szText, -1, &lpdis->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // 居中绘制文本
// 绘制按钮凸出的效果
if (lpdis->itemState & ODS_SELECTED)
{
RECT rc = lpdis->rcItem;
rc.left += 2; rc.top += 2; rc.right -= 2; rc.bottom -= 2; // 缩小按钮的矩形区域
DrawEdge(lpdis->hDC, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST); // 绘制凸出的边框
}
}
break;
}
```
在上面的代码中,我们在绘制按钮的背景和文本之后,判断按钮是否被按下,如果是的话就在按钮的矩形区域内绘制凸出的边框。
需要注意的是,这只是一个简单的示例代码,实际使用时可能需要根据具体情况进行调整。