MFC UI按钮多线程

单线程操作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);
}

参考来源

时间: 2024-09-29 02:19:20

MFC UI按钮多线程的相关文章

常见MFC UI界面库[转]

Xtrme toolkit,BCGControlBar,SkinMagic,AppFace,Skin++,Uskin++,SYGUI,LibUIDK,GuiToolkit,GardenUI等等,除了后两种一个是开源,一个是免费的外,其余的都是收费的. The Ultimate Toolbox http://www.codeproject.com/KB/MFC/UltimateToolbox.aspx GuiToolkit(开源,mfc扩展框架,类似Visual Studio 2003风格)htt

MFC笔记之多线程聊天室

新手刚接触,跟着孙鑫老师视频一步一步的做.从VC6.0到VS2010好像并不是那么顺利,下面记录下一点收获. 网络编程的一般步骤: 1声明套接字版本(WSAStartup);2创建套接字(socket);3绑定套接字(bind);4发送接收(sendto/recvfrom);5关闭(closesocket) 第1~3步代码如下: 1 CString error; 2 WORD wver; 3 wver=MAKEWORD(1,1); 4 WSAData data; 5 if(0!=WSAStart

MFC中按钮控件的用法笔记(转)

VC学习笔记1:按钮的使能与禁止 用ClassWizard的Member Variables为按钮定义变量,如:m_Button1:则m_Button1.EnableWindow(true); 使按钮处于允许状态m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示 VC学习笔记2:控件的隐藏与显示 用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件. 例1:CWnd *pWnd;pWnd = GetDlgItem(

转:MFC中创建多线程

MFC中创建多线程 MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员,可以这样实现: 1)全局函数.如   UINT   MyThread(LPVOID   p) 2)类的静态成员函数.如   static   UINT   MyView::MyThread(LPVOID   p) 线程函数是可以带参数的,比如  static __stdcall  workthread

MFC第三节-多线程

一.程序,进程,线程 程序是指令的集合,以文件形式储存在磁盘上.一个程序可以对应多个进程,一个进程代表一个实例. 进程由管理进程的内核对象.地址空间组成.内核对象存放关于进程的统计信息,地址空间包含可执行模块.DLL模块和堆.栈.进程不执行任何东西,它是线程的容器,每个进程至少有一个线程.当创建一个进程时,操作系统自动创建一个线程—主线程.每个进程有4GB的地址空间,进程之间相互独立. 线程由线程的内核对象和线程栈组成.线程只有一个内核对象和栈,只有很少的内存.同一个进程的线程能共享进程的数据.

MFC DialogBar 按钮灰色不响应

在MFC单文档加添加DialogBar,然后在DialogBar上添加按钮,会出现如下情况,单击无响应. 解决方案: 在 CSideDialogBar头文件和CPP文件里添加如下函数 afx_msg void OnUpdateButton(CCmdUI *pCmdUI); ON_UPDATE_COMMAND_UI(IDC_BUTTON_PRINT_GEAR_PARA, OnUpdateButton) void CSideDialogBar::OnUpdateButton(CCmdUI *pCmd

UI进阶 多线程

一.多线程概述 程序.进程.线程 程序:由源代码生成的可执行应用.(例如:QQ.app) 进程:一个正在运行的程序可以看做一个进程.(例如:正在运行的QQ就是一个进程),进程拥有独立运行所需的全部资源. 线程:程序中独立运行的代码段.(例如:接收QQ消息的代码) 一个进程是由一或多个线程组成.进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行. 单线程 每个正在运行的程序(即进程),至少包含一个线程,这个线程叫主线程. 主线程在程序启动时被创建,用于执行main函数. 只有一

常见MFC UI界面库

Xtrme toolkit,BCGControlBar,SkinMagic,AppFace,Skin++,Uskin++,SYGUI,LibUIDK,GuiToolkit,GardenUI等等,除了后两种一个是开源,一个是免费的外,其余的都是收费的. The Ultimate Toolbox http://www.codeproject.com/KB/MFC/UltimateToolbox.aspx GuiToolkit(开源,mfc扩展框架,类似Visual Studio 2003风格)htt

MFC动态按钮的创建及其消息响应(自定义消息)

动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 10000 2.在类的OnInitDialog()函数中动态创建按钮(建立按钮对象时最好建立对象的指针) 3.手动释放对象指针 下面是动态生成多个按钮的例子: CButton* btn = new CButton[5]; DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; for(int i = 0; i < 5; i++) { btn[i]