自绘button后 ,按钮点不了了

maomao85 2013-12-20 03:12:37
我写了个CMyButton类,继承CButton.
设置了BS_OWNERDRAW后,需要自己绘制按钮,不如按钮显示不出来。于是我在CMyButton类里重载DrawItem函数来绘制按钮,代码如下:

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
assert(lpDrawItemStruct->CtlType==ODT_BUTTON);
DrawFrameControl(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,DFC_BUTTON,DFCS_BUTTONPUSH);

}

可是我用DrawFrameControl绘制的按钮,运行是发现按钮无法点击,是个死按钮,请问是什么原因
...全文
204 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
maomao85 2013-12-22
  • 打赏
  • 举报
回复
我自己已经解决了,结贴~
maomao85 2013-12-21
  • 打赏
  • 举报
回复
引用 4 楼 SXJIAKE 的回复:
按钮自绘时判断参数大概是这样,仅供参考:
if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE) {
    if (lpDrawItemStruct->itemState & ODS_SELECTED) {
        // 按下
    } else if (lpDrawItemStruct->itemState & ODS_DISABLED) {
        // 禁用
    } esle {
        // 常规
    }
}
if (lpDrawItemStruct->itemAction & ODA_FOCUS) {
    if (lpDrawItemStruct->itemState & ODS_FOCUS) {
        // 获得焦点
    }
}
而鼠标经过和离开在这里是没办法获知的,可能是因为按钮自绘这个功能出现时还没有 XP 主题,当时 Windows 2000 的经典主题下并没有鼠标经过效果,这个需要自己判断。
没有获取焦点不算离开啊?我认为鼠标悬浮在按钮上方就是获取焦点,不知道我这种理解对不对? 还有就是我看很多人都直接用if (lpDrawItemStruct->itemState & ODS_FOCUS),没有用外面那层lpDrawItemStruct->itemAction & ODA_FOCUS
「已注销」 2013-12-21
  • 打赏
  • 举报
回复
按钮自绘时判断参数大概是这样,仅供参考:
if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE) {
    if (lpDrawItemStruct->itemState & ODS_SELECTED) {
        // 按下
    } else if (lpDrawItemStruct->itemState & ODS_DISABLED) {
        // 禁用
    } esle {
        // 常规
    }
}
if (lpDrawItemStruct->itemAction & ODA_FOCUS) {
    if (lpDrawItemStruct->itemState & ODS_FOCUS) {
        // 获得焦点
    }
}
而鼠标经过和离开在这里是没办法获知的,可能是因为按钮自绘这个功能出现时还没有 XP 主题,当时 Windows 2000 的经典主题下并没有鼠标经过效果,这个需要自己判断。
maomao85 2013-12-21
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
不是死按钮,只是显示状态没有改变而已,点击状态需要你自绘,但应该还是有点击的事件的
确实是每个状态都需要自己画,悬浮在按钮上方的状态、按下按钮的状态,松口按钮的状态,离开按钮的状态~~ 自绘按钮原来是这个意思,终于清楚的了解了~~
worldy 2013-12-21
  • 打赏
  • 举报
回复
不是死按钮,只是显示状态没有改变而已,点击状态需要你自绘,但应该还是有点击的事件的
maomao85 2013-12-21
  • 打赏
  • 举报
回复
引用 7 楼 SXJIAKE 的回复:
打错了,ODS_FOCUS 这个确实不用判断也行,据我观察这个标志位几乎始终有。
我刚刚也测试了下,lpDrawItemStruct->itemAction和lpDrawItemStruct->itemState的各种状态真是把我搞晕了,完全看不懂了
「已注销」 2013-12-21
  • 打赏
  • 举报
回复
引用 8 楼 maomao85 的回复:
[quote=引用 6 楼 SXJIAKE 的回复:] ODA_FOCUS 这个确实不用判断也行,据我观察这个标志位几乎始终有。这个焦点与鼠标焦点不一样,你只能去自己检测鼠标消息判断鼠标悬浮状态。
那这个焦点是什么意思呢?是代表按钮被按下?[/quote] 我不知道微软搞这个什么意思,反正除了禁用状态几乎一直都有。
maomao85 2013-12-21
  • 打赏
  • 举报
回复
引用 6 楼 SXJIAKE 的回复:
ODA_FOCUS 这个确实不用判断也行,据我观察这个标志位几乎始终有。这个焦点与鼠标焦点不一样,你只能去自己检测鼠标消息判断鼠标悬浮状态。
那这个焦点是什么意思呢?是代表按钮被按下?
「已注销」 2013-12-21
  • 打赏
  • 举报
回复
打错了,ODS_FOCUS 这个确实不用判断也行,据我观察这个标志位几乎始终有。
「已注销」 2013-12-21
  • 打赏
  • 举报
回复
ODA_FOCUS 这个确实不用判断也行,据我观察这个标志位几乎始终有。这个焦点与鼠标焦点不一样,你只能去自己检测鼠标消息判断鼠标悬浮状态。
qjgdftxmu 2013-12-20
  • 打赏
  • 举报
回复
自绘按钮的意思就是鼠标按下的的显示样式也是需要自己绘制的。。。。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧