zoukankan      html  css  js  c++  java
  • MFC UI按钮多线程

    单线程操作UI会使窗口假死,所以UI操作需要用到多线程

    实现效果:当点击kiss时按钮闪动3次

    原理:自定义一个消息(WM_CHANGE_BUTTON),当点击按钮"kiss"时,启动一个新的线程,线程每隔0.5s钟发送一次WM_CHANGE_BUTTON消息。程序监听到该消息时调用消息函数,改变按钮大小。

    1、在界面上添加一个按钮修改ID为 IDC_KISS  

    2、ctrl+shift+x,创建类向导中的消息机制

    3、定义事件函数

    #define WM_CHANGE_BUTTON WM_USER+1
    #define SLEEP_TIMES 200
    void Change(LPVOID pParam)
    {//下面的消息使得按钮闪烁三次 
        ::SendMessageA(AfxGetThread()->m_pMainWnd->m_hWnd, WM_CHANGE_BUTTON, 0, (LPARAM)pParam);
        Sleep(SLEEP_TIMES);
        ::SendMessageA(AfxGetThread()->m_pMainWnd->m_hWnd, WM_CHANGE_BUTTON, 1, (LPARAM)pParam);
        Sleep(SLEEP_TIMES);
        ::SendMessageA(AfxGetThread()->m_pMainWnd->m_hWnd, WM_CHANGE_BUTTON, 0, (LPARAM)pParam);
        Sleep(SLEEP_TIMES);
        ::SendMessageA(AfxGetThread()->m_pMainWnd->m_hWnd, WM_CHANGE_BUTTON, 1, (LPARAM)pParam);
        Sleep(SLEEP_TIMES);
        ::SendMessageA(AfxGetThread()->m_pMainWnd->m_hWnd, WM_CHANGE_BUTTON, 0, (LPARAM)pParam);
        Sleep(SLEEP_TIMES);
        ::SendMessageA(AfxGetThread()->m_pMainWnd->m_hWnd, WM_CHANGE_BUTTON, 1, (LPARAM)pParam);
        Sleep(SLEEP_TIMES);
    }

    4、定义按钮事件

    afx_msg LRESULT CMFCThreadButtonTest1Dlg::OnChangeButton(WPARAM wParam, LPARAM lParam)
    {
        CButton *pBtn = (CButton*)GetDlgItem((int)lParam);
        int x = 100;
        int y = 80;
        CRect rect;
        pBtn->GetWindowRect(&rect);
        //上面的函数获取的是按钮相对于整个屏幕的坐标,需要用下面这个函数
        //转化为相对于父窗口的坐标
        ScreenToClient(&rect);
        //改变CRect并重新赋值给button  
        if(wParam)  
        {   
            rect.left-=5; 
            rect.top-=5; 
            rect.bottom+=5;  
            rect.right+=5; 
        }  else  {  
            rect.left+=5; 
            rect.top+=5;  
            rect.bottom-=5; 
            rect.right-=5;
        }
        //MoveWindow不仅仅是“移动”他还可以改变窗口大小
        pBtn->MoveWindow(&rect);
        return 0; 
    }
    
    void CMFCThreadButtonTest1Dlg::OnBnClickedKiss()
    {
        // TODO:  在此添加控件通知处理程序代码
        AfxBeginThread((AFX_THREADPROC)Change,(LPVOID)IDC_KISS,0,0,0,0);
    }

    参考来源

     

     

     

     

     

  • 相关阅读:
    43、生鲜电商平台-你应该保留的一些学习态度与学习方法
    44、生鲜电商平台-Java后端生成Token架构与设计详解
    42、生鲜电商平台-商品的spu和sku数据结构设计与架构
    Bag of features:图像检索
    立体视觉—计算视差图
    三维重建——对极几何与基础矩阵
    计算机视觉——相机参数标定
    图像的拼接融合
    Unity Hub安装异常的解决方案
    针对“需要管理权限才能删除文件夹”的解决方案
  • 原文地址:https://www.cnblogs.com/bkycjj/p/4542922.html
Copyright © 2011-2022 走看看