一个超难的问题! 解决后立马给分!
void CProgramView::OnTest()
{
CWnd *pWnd = AfxGetMainWnd()->GetWindow(GW_CHILD);
BOOL bResult = ::CreateCaret(pWnd->m_hWnd,(HBITMAP)NULL,10,22);
//这里bResult == 1;
mHandle = CreateThread(NULL,0,MyFunc,(CWnd *)pWnd,CREATE_SUSPENDED,&mID);
}
DWORD WINAPI MyFunc(LPVOID lpParameter)
{
CWnd *pWnd = (CWnd *)lpParameter;
BOOL bResult = CreateCaret(pWnd->m_hWnd,(HBITMAP)NULL,10,22);
//这里bResult == 0
POINT pt;
pt.x = 100;
pt.y = 100;
pWnd->SetCaretPos(pt);
pWnd->ShowCaret();
return 0;
}
为什么在线程里调用CreateCaret就不成功呢?那么我应该怎样在一个线程中显示一个Caret呢?
问题点数:0、回复次数:4Top
1 楼younggle(洋溢)回复于 2005-06-02 16:11:25 得分 0
CWnd *pWnd = AfxGetMainWnd()->GetWindow(GW_CHILD);
===================================================
确认这个子窗口还存在吗?
也就是说在线程中判断 pWnd->m_hWnd 是否有效
if( ( NULL != pWnd->m_hWnd ) && ::IsWindow(pWnd->m_hWnd) )
{
BOOL bResult = CreateCaret(pWnd->m_hWnd,(HBITMAP)NULL,10,22);
}Top
2 楼orbit(走了走了)回复于 2005-06-02 16:30:25 得分 0
CWnd *pWnd 得到的是临时指针,不能作为线程参数,改成窗口句柄试试
void CProgramView::OnTest()
{
CWnd *pWnd = AfxGetMainWnd()->GetWindow(GW_CHILD);
ASSERT(pWnd != NULL);
HWND hWnd = pWnd->GetSafeHwnd();
BOOL bResult = ::CreateCaret(hWnd,(HBITMAP)NULL,10,22);
//这里bResult == 1;
mHandle = CreateThread(NULL,0,MyFunc,(LPVOID)hWnd,CREATE_SUSPENDED,&mID);
}
DWORD WINAPI MyFunc(LPVOID lpParameter)
{
HWND hWnd = (HWND)lpParameter;
BOOL bResult = CreateCaret(hWnd,(HBITMAP)NULL,10,22);
//这里bResult == 0
POINT pt;
pt.x = 100;
pt.y = 100;
SetCaretPos(hWnd,pt);
ShowCaret(hWnd);
return 0;
}
Top
3 楼EmbraceTM()回复于 2005-06-02 16:36:42 得分 0
改成窗口句柄也不行!
我开个线程从串口读数,把串口数显到dc上,SetCaretPos时,为什么它的位置不变?HideCaret函数也不管用了,这是怎么回事呀?Top
4 楼dongfa(一桶江湖( http://www.codelive.net ))回复于 2005-06-02 17:06:52 得分 0
插入符不用开线程的.Top




