MFC UI按钮多线程
生活随笔
收集整理的這篇文章主要介紹了
MFC UI按钮多线程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
單線程操作UI會使窗口假死,所以UI操作需要用到多線程
?
實現(xiàn)效果:當(dāng)點擊kiss時按鈕閃動3次
原理:自定義一個消息(WM_CHANGE_BUTTON),當(dāng)點擊按鈕"kiss"時,啟動一個新的線程,線程每隔0.5s鐘發(fā)送一次WM_CHANGE_BUTTON消息。程序監(jiān)聽到該消息時調(diào)用消息函數(shù),改變按鈕大小。
1、在界面上添加一個按鈕修改ID為?IDC_KISS??
2、ctrl+shift+x,創(chuàng)建類向?qū)е械南C制
3、定義事件函數(shù)
#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);//上面的函數(shù)獲取的是按鈕相對于整個屏幕的坐標(biāo),需要用下面這個函數(shù)//轉(zhuǎn)化為相對于父窗口的坐標(biāo)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); }參考來源
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/bkycjj/p/4542922.html
總結(jié)
以上是生活随笔為你收集整理的MFC UI按钮多线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 开发工具类 27_多线程
- 下一篇: nginx 入门配置