怎样刷新子对话框上的按钮

sunyim 2012-02-28 11:44:38
我在主对话框上先弹出子对话框
CKeyTestDlg KeyTestdlg;
KeyTestdlg.DoModal();

然后子对话框中的按钮根据串行通讯读取数值检测对应的按键,如果按键按下,则子对话框中的按钮修改背景颜色
我在子对话框的PreTranslateMessage(MSG* pMsg) 函数中做判断
如果得到的 键值=对应按下的按键,则子对话框上的按钮执行背景重绘

不过只有我鼠标滑到子对话框上,才能实现背景变色,也就是子对话框的按钮不能自动刷新

如何实现子对话框按钮的刷新(根据主对话框传来的按键值)
...全文
185 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
kyotrue 2012-02-29
  • 打赏
  • 举报
回复
子对话框中,哪个控件需要刷新,就使用InvalideRect或者CWnd::Invalide
shn521 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sunyim 的回复:]
引用 17 楼 lang14 的回复:
写个Cbutton类吧,想做什么都行

我就是用的 CButtonST类,难道我表述的这么不清楚吗
[/Quote]
是你不明白我们说的
CButtonST类也可以写自己的继承类,可以在继承类里响应多个消息响应,你自己不去试,永远都不知道。
chel 2012-02-29
  • 打赏
  • 举报
回复
KeyTestdlg调用该窗口按钮句柄, 然后Invalidate
lgstudyvc 2012-02-29
  • 打赏
  • 举报
回复
实在不行就sendmessage
forget0915 2012-02-28
  • 打赏
  • 举报
回复
定义按钮子窗口的窗口过程地址WNDPROC ProChildButton[5] //假设你有5个按钮

在响应父窗口WM_INITDIALOG或者WM_CREATE消息中设置按钮子窗口的回调函数
for(int i=0;i<5;i++)
ProChildButton[i] = (WNDPROC)SetWindowLong(hBtn,GWL_WNDPROC,(LONG)BtnWndProc);

你创建按钮时应该用的是自绘风格吧,那么要在BtnWndProc中响应WM_DRAWITEM消息,WM_CHAR消息
LRESULT CALLBACK BtnWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int id = GetWindowLong(hwnd,GWL_ID);
switch (message)
{
case WM_DRAWITEM:
...;
case WM_CHAR:
...;
}
return CallWindowProc (BtnWndProc[id], hwnd, message, wParam, lParam) ;
}
强烈建议把API/SDK的实现原理搞清楚,相关知识可以参看Charles Petzold大师的<Windows程序设计>第九章
MFC仅仅是拿Ctrl+W向导用惯了,会丧失很多知识和能力的。。。。
gold_water 2012-02-28
  • 打赏
  • 举报
回复
Invalidate(TRUE);//使客户区无效
shn521 2012-02-28
  • 打赏
  • 举报
回复
我觉得可以自己写个CMyButton类,然后在OnPaint里绘图,当鼠标滑到子对话框上时让按钮重绘。
罗平 2012-02-28
  • 打赏
  • 举报
回复
不能自动刷新,就强制刷新试试。InvalidateRect
sunyim 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lang14 的回复:]
写个Cbutton类吧,想做什么都行
[/Quote]
我就是用的 CButtonST类,难道我表述的这么不清楚吗
lang14 2012-02-28
  • 打赏
  • 举报
回复
写个Cbutton类吧,想做什么都行
sunyim 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 g6785654 的回复:]

将改颜色的代码放到OnPaint中,然后发送PostMessage(WM_PAINT,0,0);强制刷新试试
[/Quote]

我将子对话框类里的按钮绑定了CButtonST类
m_ok.SetColor(2,clour,1);//IDC_BUTTON_OK CButtonST m_ok
m_ok.Invalidate();

那么PostMessage(WM_PAINT,0,0);由谁来发,发给谁?
Ginie 2012-02-28
  • 打赏
  • 举报
回复
将改颜色的代码放到OnPaint中,然后发送PostMessage(WM_PAINT,0,0);强制刷新试试
shn521 2012-02-28
  • 打赏
  • 举报
回复
错了,是4楼
shn521 2012-02-28
  • 打赏
  • 举报
回复
“我觉得可以自己写个CMyButton类,然后在OnPaint里绘图,当鼠标滑到子对话框上时让按钮重绘。”
这个是我在2楼得回复,3楼的是自己填写函数消息及实现代码,自己写的继承类,是直接填写实现消息的代码。
你看不懂,我也没办法了。

sunyim 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 shn521 的回复:]

引用 10 楼 sunyim 的回复:
引用 2 楼 shn521 的回复:

我觉得可以自己写个CMyButton类,然后在OnPaint里绘图,当鼠标滑到子对话框上时让按钮重绘。

我现在鼠标到子对话框上也能使背景变色,现在关键是我不想动鼠标也叫对话框上的按钮刷新

你可以开个定时器,定时检查鼠标是否在对话框里,然后继续刷新。
[/Quote]
我说鼠标移动只是一种情况,我现在想要子对话框根据按键值刷新,与鼠标没有关系……
shn521 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sunyim 的回复:]
引用 2 楼 shn521 的回复:

我觉得可以自己写个CMyButton类,然后在OnPaint里绘图,当鼠标滑到子对话框上时让按钮重绘。

我现在鼠标到子对话框上也能使背景变色,现在关键是我不想动鼠标也叫对话框上的按钮刷新
[/Quote]
你可以开个定时器,定时检查鼠标是否在对话框里,然后继续刷新。
sunyim 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shn521 的回复:]

我觉得可以自己写个CMyButton类,然后在OnPaint里绘图,当鼠标滑到子对话框上时让按钮重绘。
[/Quote]
我现在鼠标到子对话框上也能使背景变色,现在关键是我不想动鼠标也叫对话框上的按钮刷新
sunyim 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shn521 的回复:]

我在2楼说的方法不行吗,3楼明显就是麻烦的方法。
[/Quote]
强制刷对话框的区域?
shn521 2012-02-28
  • 打赏
  • 举报
回复
我在2楼说的方法不行吗,3楼明显就是麻烦的方法。
sunyim 2012-02-28
  • 打赏
  • 举报
回复
void CSCCKeyTestDlg::ShowKeyState(short KeyTest)
{
COLORREF clour = RGB(0,255,0);
switch(KeyTest)
{
case 0X0001: m_menu.SetColor(2,clour,0);m_menu.Invalidate();break;
case 0X0002: m_reset.SetColor(2,clour,0);m_reset.Invalidate();break;
case 0X0004: m_ok.SetColor(2,clour,1);m_ok.Invalidate();break;
default:
break;
}
UpdateData(FALSE);
}

BOOL CSCCKeyTestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
ShowKeyState(test.KeyTest);
return CDialog::PreTranslateMessage(pMsg);
}
程序代码是这样的,test.KeyTest是全局变量,不断得到按键的值
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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