一、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中有两类线程,分别称为工作者线程和用户界面线程。二者的区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。
工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程之外的用户输入,响应用户及系统所产省的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,他们都只需要线程的启动地址即可启动线程来执行任务。
在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; }
结果显示: