IDB_BITMAP1是 “未按下”图片
IDB_BITMAP2是 “被按下”图片
添加了个按钮 Button1 我要做到的功能是 按钮默认是显示“未按下”图片,当按下按钮后通过串口发送一个 联机的信号,收到确认回复后 显示“被按下”图片
我目前是这样做的
按钮添加了变量 CBmpButton m_btn1;
运行后是显示的 “未按下”图片,按下按钮后通过串口发送一个 联机的信号,收到确认回复后 ,
执行了
出现的问题是 按钮图片没有刷新显示成“被按下”图片,而是点击对话框其他按钮后 Button1 的图片才被刷新为“被按下”图片 求指点下简单好实现的方法。!谢谢!
该回答引用GPTᴼᴾᴱᴺᴬᴵ
您可以使用按钮的 SetBitmap() 函数来设置按钮的图片,例如:
m_btn1.SetBitmap(IDB_BITMAP2);
这将把按钮的图片设置为 IDB_BITMAP2,即“被按下”图片。
如果您的按钮在按下后没有立即刷新显示为“被按下”图片,您可以尝试调用按钮的 RedrawWindow() 函数来强制重绘按钮,例如:
m_btn1.SetBitmap(IDB_BITMAP2);
m_btn1.RedrawWindow();
这将立即重绘按钮,以便它显示为“被按下”图片。
如果您在执行上述操作后仍然遇到问题,可能是与您的消息循环有关。在收到串口确认回复后,您可以尝试在主窗口的消息循环中添加一条强制重绘按钮的消息,例如:
// 收到串口确认回复后执行以下代码
m_btn1.SetBitmap(IDB_BITMAP2);
PostMessage(WM_PAINT, 0, 0);
这将向主窗口的消息队列中添加一条 WM_PAINT 消息,以便在消息循环中重绘按钮。
希望这些方法能帮助您解决问题!
直接设置完图片后,调用redrawwindow()
该回答内容部分引用GPT,GPT_Pro更好的解决问题
要实现这个功能,首先要在按钮的消息响应函数中添加代码:
void CMyDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_btn1.SetBitmap(IDB_BITMAP2);
// 发送联机信号
// 接收确认回复
// 其他代码...
}
其中,SetBitmap()函数用于将按钮图片设置为IDB_BITMAP2,也就是"被按下"图片,然后再发送联机信号,最后接收确认回复。这样按钮就可以实现显示两张图片的功能了。
如果回答有帮助,望采纳。
发问题是代码没添加好 这里补充下
m_btn1.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1);//未按下图片
m_btn1.LoadBitmaps(IDB_BITMAP2, IDB_BITMAP2, IDB_BITMAP2, IDB_BITMAP2);//被按下图片
参考gpt和自己的思路,您可以尝试使用 CBmpButton 控件提供的 SetBitmaps() 函数来设置按钮的不同状态下的图片,以实现按钮图片的切换。具体步骤如下:
在资源视图中添加 "未按下" 和 "被按下" 两张位图图片,并为它们分别指定 ID,例如 IDB_BITMAP1 和 IDB_BITMAP2。
在 Dialog 类的 OnInitDialog() 函数中,调用 CBmpButton 控件的 SubclassDlgItem() 函数将 Button1 控件子类化为 CBmpButton 类型,并为其设置默认的位图图片,例如:
m_btn1.SubclassDlgItem(IDC_BUTTON1, this);
m_btn1.SetBitmaps(IDB_BITMAP1, IDB_BITMAP2);
在 Button1 控件的 Click 事件中,先发送串口联机信号,等待确认回复后再切换按钮的图片,例如:
// 发送串口联机信号
// 等待确认回复
// 切换按钮图片
m_btn1.SetBitmaps(IDB_BITMAP2, IDB_BITMAP2);
m_btn1.Invalidate();
m_btn1.UpdateWindow();
其中,SetBitmaps() 函数的第一个参数为按钮未按下状态下的图片 ID,第二个参数为按钮按下状态下的图片 ID。Invalidate() 函数用于使按钮无效,UpdateWindow() 函数用于更新按钮的显示。
请注意,以上代码仅为示例,具体的实现方式可能需要根据您的具体应用场景进行调整。
不知道你这个问题是否已经解决, 如果还没有解决的话: