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\n", 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\n", AfxGetThread()->m_nThreadID);
    return 0;
}

int main()
{
    for (int i = 0; i < 10; i++)
    {
        AfxBeginThread(MyFunc, NULL);
    }
    system("pause");
    return 0;
}

结果显示:

 

posted @ 2019-03-07 23:15  平凡_h  阅读(545)  评论(0编辑  收藏  举报