您的位置:首页 > 产品设计 > UI/UE

MFC UI按钮多线程

2015-05-31 23:04 477 查看
单线程操作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);
}


参考来源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: