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、定义事件函数
4、定义按钮事件
参考来源
实现效果:当点击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); }
参考来源
相关文章推荐
- UITouch事件处理机制
- 使用Autolayout实现UITableView的Cell动态布局和高度动态改变
- MQTT mosquitto 单向SSL认证的配置方式
- uC/OS-II uC/GUI 程序卡死在WM_ExecIdle();
- Hue(六)集成HBase
- 自定义UITableViewCell(registerNib: 与 registerClass: 的区别)
- Hue(五)集成Zookeeper
- StringBuilder常用方法
- STL源码剖析---deque
- android UI取消标题栏及状态栏
- Codeforces 336C Vasily the Bear and Sequence (暴力)
- Android中UI线程Looper,Handler的关系
- iOS7/8 UIButton高亮状态延迟有关问题全解
- 更新UI的四种方式
- build-root-2012编译时遇到的问题
- URAL 1183.Brackets Sequence ( DP+记录路径)
- iOS通过CAShapeLayer和UIBezierPath画环形进度条
- 3种特殊流程控制语句
- PHP中include和require的区别详解
- 快排(QuickSort)的java语言的实现