mfc怎样实现按钮中的两幅图片不断循环切换(实现闪烁效果)

德固 2017-12-12 08:33:14
各位坛友 怎样实现按钮中的两幅图片不断循环切换(实现闪烁效果),有没有做过的朋友
...全文
508 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-12-20
  • 打赏
  • 举报
回复
bitmapTrans.LoadBitmap(IDB_BITMAP); 1 要放 初始化中 2 注意 内存泄漏
德固 2017-12-19
  • 打赏
  • 举报
回复
// Text3Dlg.cpp : 实现文件 // #include "stdafx.h" #include "Text3.h" #include "Text3Dlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CText3Dlg 对话框 CText3Dlg::CText3Dlg(CWnd* pParent /*=NULL*/) : CDialog(CText3Dlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CText3Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CText3Dlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON2, &CText3Dlg::OnBnClickedButton2) ON_WM_DRAWITEM() ON_BN_CLICKED(IDC_BUTTON1, &CText3Dlg::OnBnClickedButton1) ON_WM_TIMER() END_MESSAGE_MAP() // CText3Dlg 消息处理程序 BOOL CText3Dlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CText3Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CText3Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); SetTimer(1, 200, NULL); } else { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CText3Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CText3Dlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 } void CText3Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDC buttonDC; BITMAP bmp; CDC mem; CRect rc; buttonDC.Attach(lpDrawItemStruct->hDC);//得到用于绘制按钮的DC mem.CreateCompatibleDC(&buttonDC);//准备向按钮区域传输图形 if (lpDrawItemStruct->CtlID == IDC_BUTTON1) { rc = lpDrawItemStruct->rcItem;//获取按钮所占的矩形大小 UINT state = lpDrawItemStruct->itemState;//获取按钮当前的状态,不同状态绘制不同的按钮 if (state & ODS_FOCUS)//如果按钮已经取得焦点,绘制选中状态下的按钮 { bitmapTrans.LoadBitmap(IDB_BITMAP1); bitmapTrans.GetBitmap(&bmp); CBitmap * old = mem.SelectObject(&bitmapTrans); //向按钮传输位图,使用stretcnblt可以使图片随按钮大小而改变 buttonDC.StretchBlt(rc.left, rc.top, rc.right, rc.bottom, &mem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); mem.SelectObject(old); bitmapTrans.DeleteObject(); } else //如果按钮已经取得焦点,绘制选中状态下的按钮 { bitmapTrans.LoadBitmap(IDB_BITMAP2); CBitmap *old2 = mem.SelectObject(&bitmapTrans); bitmapTrans.GetBitmap(&bmp); CBitmap *old = mem.SelectObject(&bitmapTrans); buttonDC.StretchBlt(rc.left, rc.top, rc.right, rc.bottom, &mem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); mem.SelectObject(old2); bitmapTrans.DeleteObject(); } } CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); } void CText3Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 } void CText3Dlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 // TODO: Add your message handler code here and/or call default TimeBlink++; TimeBlink %= 2; switch (nIDEvent) { case 0: SetTimer(TimeBlink, 3000, NULL); bitmapTrans.LoadBitmap(IDB_BITMAP1); break; case 1: SetTimer(TimeBlink, 3000, NULL); bitmapTrans.LoadBitmap(IDB_BITMAP2); break; } CDialog::OnTimer(nIDEvent); }
引用
德固 2017-12-19
  • 打赏
  • 举报
回复
@ 非常感谢大家
qq_41150510 2017-12-18
  • 打赏
  • 举报
回复
顶顶,woyexiangzhidao
sichuanwww 2017-12-18
  • 打赏
  • 举报
回复
schlafenhamster 2017-12-15
  • 打赏
  • 举报
回复
还有一个 “非同寻常”的 void CAboutDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default UINT RealID=*((UINT*)nIDEvent); switch (RealID) { case 0: afxDump << "0" ; break; case 1: afxDump << "1" ; break; } *((UINT*)nIDEvent)+=1; *((UINT*)nIDEvent)%=2; } 使用 // TODO: Add extra initialization here TimeBlink=0; SetTimer((UINT)&TimeBlink,1000,NULL);// 注意 是 地址 !
schlafenhamster 2017-12-14
  • 打赏
  • 举报
回复
应该是 #else 里的

void CAboutDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
#if 0
	switch (nIDEvent)
	{
	case 0:
		SetTimer(TimeBlink,1000,NULL);
		afxDump << "0" ;
	break;
	case 1:
		SetTimer(TimeBlink,1000,NULL);
		afxDump << "1" ;
	break;
	}
#else
	switch (nIDEvent)
	{// always=1
	case 1: 
		if(TimeBlink==0)
		{
			afxDump << "0" ;
		}
		else
		{
			afxDump << "1" ;
		}
		break;
	}
	TimeBlink ++;
	TimeBlink %=2;
#endif
//	CDialog::OnTimer(nIDEvent);
}
schlafenhamster 2017-12-14
  • 打赏
  • 举报
回复
按你的思路应该是:

void CAboutDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	TimeBlink ++;
	TimeBlink %=2;
	switch (nIDEvent)
	{
	case 0:
		SetTimer(TimeBlink,1000,NULL);
		afxDump << "0" ;
	break;
	case 1:
		SetTimer(TimeBlink,1000,NULL);
		afxDump << "1" ;
	break;
	}
//
//	CDialog::OnTimer(nIDEvent);
}
这里必须 重新 SetTimer(TimeBlink,1000,NULL);
Eleven 2017-12-14
  • 打赏
  • 举报
回复
SetTimer() CButton::SetBitmap();
schlafenhamster 2017-12-14
  • 打赏
  • 举报
回复
for (Blinking=1;;Blinking++) 死循环 ! 在 Timer里 改变 Blinking !
德固 2017-12-14
  • 打赏
  • 举报
回复
定义了一个定时器 SetTimer(TimeBlink,1000,NULL) void XXXDlg::OnTimer(UINT_PTR nIDEvent) switch (nIDEvent) case 1: { //暂停按键 m_btnSysPause.LoadBitmaps(IDB_BITMAP_PAUSE_SELECT); } break; case 2: { m_btnSysPause.LoadBitmaps(IDB_BITMAP_PAUSE_NORMAL); } break; void XXXDlg::OnBnClickedBtnPause() for (Blinking=1;;Blinking++) { if (Blinking%2==0) { TimeBlink=3; } else { TimeBlink=4; } 导致CPU占用100%我知道这个肯定不对但是作为初学者想不到好的方法,不知各位坛友有什么好的方法
sevancheng 2017-12-14
  • 打赏
  • 举报
回复
Picture 控件,重设图像
德固 2017-12-13
  • 打赏
  • 举报
回复
好的我试试,非常感谢
zgl7903 2017-12-13
  • 打赏
  • 举报
回复
从CButton派生新类, 启动一个定时器, 定时器中置图片, WM_PAINT 中绘制
smwhotjay 2017-12-13
  • 打赏
  • 举报
回复
定时器 不断绘制button,

16,472

社区成员

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

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

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