• MFC 剪切板的使用、线程介绍


    一、MFC 剪切板
        CListBox *pList = (CListBox*)GetDlgItem(IDC_LIST1);  // 获取ListBox控件句柄
        CString strTmp;
        pList->GetText(pList->GetCurSel(), strTmp);  // 获取当前控件选中的内容
        CString strOutput;
        AfxExtractSubString(strOutput, strTmp, 0, ';'); // 提取字符串
        TRACE("0-------%S
    ", strOutput);                // 日志显示
        ShellExecute(NULL, TEXT("open"), strOutput, NULL, NULL, SW_SHOW);
    
        AfxExtractSubString(strOutput, strTmp, 1, ';');  // 提取字符串
        
        HGLOBAL p = nullptr;  // 定义一个全局变量
        if (OpenClipboard())    // 打开剪切板并判断剪切板是否打开
        {
            EmptyClipboard(); // 清空剪切板
            USES_CONVERSION;
            char szName[256];
            strcpy(szName, T2A(strOutput));  // 将CString类型的字符串拷贝到char [] 类型中
    
            HGLOBAL hMem = GlobalAlloc(GHND, sizeof(szName)); // 分配全局内存
            char *pmen = (char *)GlobalLock(hMem);    // 锁定全局内存
            memcpy(pmen, szName, sizeof(szName));    // 向全局内存中拷贝数据
            SetClipboardData(CF_TEXT, hMem);        // 设置数据到剪切板
            CloseClipboard();                        // 关闭剪切板
            p = GlobalFree(hMem);                    // 释放全局内存
        }

    二、MFC 线程

    MFC中有两类线程,分别称为工作者线程和用户界面线程。二者的区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。

    工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程之外的用户输入,响应用户及系统所产省的事件和消息等。但对于Win32API编程而言,这两种线程是没有区别的,他们都只需要线程的启动地址即可启动线程来执行任务。

    MFC中,一般用于全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程。两种重载函数原型和参数分别说明如下:

    (1)工作者线程

    CWndThread *AfxBeginThread(AFX_THREADPROC pfnThreadProc,
        LPVOID pParam,
        UINT nPriority=THREAD_PRIORITY_NORMAL,
        UINT nStackSize = 0,
        DWORD dwCreateFlags = 0,
        LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

    (2)UI线程(用户界面线程)

    CWndThread *AfxBeginThread(CRuntimeClass *pThreadClass,
        int nPriority=THREAD_PRIORITY_NORMAL,
        UINT nStackSize = 0,
        DWORD dwCreateFlags = 0,
        LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

    简单的线程案例:

    #include <afxwin.h>
    #include <stdio.h>
    
    UINT MyFunc(LPVOID)
    {
        printf("我的线程ID是%d
    ", AfxGetThread()->m_nThreadID);
        return 0;
    }
    
    int main()
    {
        for (int i = 0; i < 10; i++)
        {
            AfxBeginThread(MyFunc, NULL);
        }
        system("pause");
        return 0;
    }

    结果显示:

  • 相关阅读:
    1.2顺序表
    1.1数据结构
    Java 造假数据
    Python造假数据,用这个库
    真香 用这七大Python效率工具
    mybatis 详情
    MySQL 的 INSERT ··· ON DUPLICATE KEY UPDATE
    mysql之case when then 经典用法
    SELECT NOW(),CURDATE(),CURTIME()
    MySQL CONCAT_WS 函数
  • 原文地址:https://www.cnblogs.com/hs-pingfan/p/10493184.html
Copyright © 2020-2023  润新知