大家好!本人是一名刚学MFC的新手,如有一些描述不清的地方请大家多多包涵,谢谢!
一般来说MFC编程时在子线程中是无法直接使用控件变量的,而在子线程中在使用:
CAddThreadDlg *pDlgWnd = (CAddThreadDlg*)pParam;
就可以解决这一问题,如:
UINT ThreadProcA(LPVOID pParam) //线程的实现
{
CAddThreadDlg *pDlgWnd = (CAddThreadDlg*)pParam;//此功能可以调用主对话框定义的类成员函数
CRect rect;//声明一个CRect类的对象(一个矩形框)
pDlgWnd->m_picture.GetWindowRect(rect);//m_picture是Picture Control添加的变量
CWnd*pwnd = pDlgWnd->GetDlgItem(IDC_PICTURE);
CClientDC dc(pwnd);
...
}
但是,像我之前一样,很多人在开始调试时会出现程序中断的现象!!!
而且在编译时在代码:
**pDlgWnd->m_picture.GetWindowRect(rect);//m_picture是Picture Control添加的变量**
处会发生编译中断。我在网上找了许久,一直没有解决这个问题。后来是在一个视频里面看到的解决办法!
解决办法
在MSDN中 AfxBeginThread()函数的定义如下:
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
后来得知问题是出在创建线程函数时参数的传递:
1.错误的实例:
g_pThread = AfxBeginThread(ThreadProcA, NULL);
2.正确的方法是在第二个参数传递this指针,指向Dlg对话框:
g_pThread = AfxBeginThread(ThreadProcA, this);
通过这样就得到了完美的解决!!!
本人第一次写文章,如有不对的地方希望大家多多指出!如果觉得有帮助的话请给我点个赞,谢谢大家!
如需完整的代码请查看:https://download.youkuaiyun.com/download/a909988197/12549599
这是我昨天上次的,谢谢大家的支持!