單線程操做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); }
參考來源事件