MFC UI按钮多线程

单线程操做UI会使窗口假死,因此UI操做须要用到多线程多线程

 

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

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

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

二、ctrl+shift+x,建立类向导中的消息机制线程

三、定义事件函数code

#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);
}

四、定义按钮事件blog

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);
}

参考来源事件