CRect dc;
GetClientDC(&dc);
试试吧
GetClientDC(&dc);
试试吧
解决方案 »
- 请问工具栏的大小(包括图案与按钮)与窗口的大小而变化?
- 关于位图的一个问题?
- 想弹出u盘,但是把usb鼠标也卸载了?
- 传说中sinffer能抓包 我下了一个sinffer,不知道咋用。哪们帮帮忙。。谢谢啊
- 非模式对话框的数据的取得?
- 请教一个问题(关于帮助文件)
- 关于时间和某密码以星号显示的问题!
- 请问写ActiveX控件是不是必须用Unicode工程?
- 在VC中如何将图片设置为墙纸?
- MFC CButton控件当获得焦点时候按回车键退出,如何重写回车则执行?
- 为什么在一个线程中使用CopyFile函数但还是出现停顿现象,用一个for循环语句就可以,请各位大师赐教。
- 送分!!!!!!!!!!!!!!!!!
你不能够传递对话框的指针,或者对话框绘图设备的CDC
但是你有更很好的办法--传递对话框的句柄HWND,或者直接传递HDC给线程,
具体做法是
HDC Hdc=GetWindowDC()->GetSafeHdc();
传递HDC给线程参数
如果不习惯用API,你可以用CDC::RROMHANDLE()重建立CDC类
就这样,记得给我加分哦。呵呵
LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
{
CRect dc;
GetClientDC(&dc); if (sound1==NULL) return FALSE;
int i,x1,x2,y1,y2;
.
.
.
}
/////////////////////////////////////////////////
error C2065: 'GetClientDC' : undeclared identifier
void CCPsoundDlg::OnButton1()
{
HDC Hdc=GetWindowDC()->GetSafeHdc(); m_DisplayThread->PostThreadMessage(WM_DISPLAY_STARTDISPLAYING, Hdc, 0L);
错误太多,我本来线程也是刚学。。不是太懂
好事做到底,帮我写全吧(加在我的程序中)谢谢!我的概念不是太清楚。
用传递过后的句柄Hdc如何画图line() bar()怎么改。。
CClientDC dc(this);
然后在启动线程的对话框中这样做CDisplay *m_pMsgLogThread=(CDisplay *) AfxBeginThread(
RUNTIME_CLASS(CDisplay),THREAD_PRIORITY_BELOW_NORMAL,
0,CREATE_SUSPENDED);
m_pMsgLogThread->m_dc=dc;
m_pMsgLogThread->ResumeThread();而后:
LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
{
int i,x1,x2,y1,y2;
if (data==NULL) return FALSE;
// 如何获得dc....
bar(&m_dc,90,4,538,225); //bar 和 line 是自己编的函数。
for (i=0;i<490;i++) {
x1=i+110; y1=(short)(120-(140.0*data[2*i])/20000);
x2=i+111; y2=(short)(120-(140.0*data[2*(i+1)])/20000);
line(&m_dc,x1,y1,x2,y2);
}
return TRUE;
}
CClientDC m_dc(this);
然后在启动线程的对话框中这样做
如何象楼上dgb所讲的那样,在我的线程类中声明这个变量:
//CDC,CWindowDC,CClientDC
CClientDC m_dc(this); //此处不需要 "(this)" 吧
具体代码怎么写?为什么编译时出错:
CClientDC' : no appropriate default constructor available
怎么改? 呵呵,由于基础不好,所以,这些都要问~~。 那位大侠可以告诉我。谢谢
pThread=AfxBeginThread((AFX_THREADPROC)ThreadTest,this);
然后:
UINT ThreadTest(LPVOID param)
{
CTest *pDlg=(CTest *)param;
...............
加了一句 CDisplay *m_pMsgLogThread=(CDisplay *) AfxBeginThread((AFX_THREADPROC)CDisplay,this);出错:
E:\Cp\CPsound4\CPsoundDlg.cpp(141) : error C2275: 'CDisplay' : illegal use of this type as an expression
e:\cp\cpsound4\display.h(27) : see declaration of 'CDisplay'
那位高人,可以帮我写详细些(根据我的程序),问题已经问了好几天,但是基础太差所以一直没有掌握大家的方法~~//还有,谁可以回答:
如何象楼上dgb所讲的那样,在我的线程类中声明这个变量:
//CDC,CWindowDC,CClientDC
CClientDC m_dc(this); //此处不需要 "(this)" 吧
具体代码怎么写?为什么编译时出错:
CClientDC' : no appropriate default constructor available
void CProDlg::OnButton1()
{
CClientDC dc(this);
CMyThiread* m_DisplayThread->PostThreadMessage(WM_DISPLAY_STOPDISPLAYING, 0, this);}
////////////////////////////////////////////////////////////////
LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
{
int i,x1,x2,y1,y2;
if (data==NULL) return FALSE;
// 如何获得dc....
HWND hDlg = (CMyThread*)param_->m_hWnd;
CWnd * pWnd = CWnd::FromHandle(hDlg);
//然后使用指针pWnd进行Dlg下的操作
bar(&dc,90,4,538,225); //bar 和 line 是自己编的函数。
for (i=0;i<490;i++) {
x1=i+110; y1=(short)(120-(140.0*data[2*i])/20000);
x2=i+111; y2=(short)(120-(140.0*data[2*(i+1)])/20000);
line(&dc,x1,y1,x2,y2);
}
return TRUE;
}
{
CDC* pDC = ::AfxGetApp()->m_pMainWnd->GetDC();
//以下是自己写的测试绘图..
CRect rect;
::AfxGetApp()->m_pMainWnd->GetClientRect(&rect);
for(int i = rect.left +1 ; i < rect.right ; i = i + 20)
for(int j = rect.top ; j < rect.bottom; j = j + 20)
{
pDC->Ellipse(i,j,i+20,j+20);
Sleep(10);
}
return 1;
}void CProDlg::OnButton1()
{ //开始线程..
CWinThread* pStart1 = (CWinThread*) AfxBeginThread(MyThread,GetSafeHwnd(),
THREAD_PRIORITY_NORMAL,0,0,NULL);
}
//我试过,绝对可以的,不信你新建一个对话框模式的工程试试...
//70分....一定要给...........呵呵........
我画线的线程是:
LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
{
if (sound1==NULL) return FALSE;
int i,x1,x2,y1,y2;
CDC* pDC = ::AfxGetApp()->m_pMainWnd->GetDC(); for (i=0;i<490;i++) {
x1=i+110; y1=(short)(120-(140.0*sound1[2*i])/20000);
x2=i+111; y2=(short)(120-(140.0*sound1[2*(i+1)])/20000);
pDC->MoveTo(x1,y1); pDC->LineTo(x2,y2);
}
return TRUE;
}按钮消息中
void CProDlg::OnButton1()
{ //开始线程..
CWinThread* pStart1 = (CWinThread*) AfxBeginThread
(MyThread,GetSafeHwnd(),THREAD_PRIORITY_NORMAL,0,0,NULL);
///??????该句改成我的线程“CDisplay”,具体怎么变??还是没有掌握~~谢谢
}
//////////////////////////////////////////////////////
CWinThread* pStart1 = (CWinThread*) AfxBeginThread
(CDisplay,GetSafeHwnd(),THREAD_PRIORITY_NORMAL,0,0,NULL);错误信息:
E:\Cp\CPsound4\CPsoundDlg.cpp(146) : error C2275: 'CDisplay' : illegal use of this type as an expression
e:\cp\cpsound4\display.h(27) : see declaration of 'CDisplay' ////////////////////////////////////////////////////
因为类的普通成员函数依赖具体对象的存在。如果对象已经析构而线程尚未结束的话会出
问题的。
每个类的普通成员函数带有一个this指针作为缺省参数,实际上与AfxBeginThread
的要求不符。
所以:
1: 你要么把全局函数作为线程函数..
2: 如果你定义一个类的成员函数作为线程函数,必须把此函数定义为static才行..
这是因为必须是静态的,在内存中有固定地址的才可以..
试试吧,一定可以的,我以前也遇到过你同样的问题,把函数定义为静态就解决了,图方便的话,直接定义为全局函数也行,而且这也是通用的方法.......
GetClientDC(&dc);
这是什么招数?我纳闷...
阿酷的方法比较简单。我最后使用了
请 阿酷 去拿分 http://www.csdn.net/Expert/topic/430/430353.shtmto 阳关故人:
CMyThiread* m_DisplayThread->PostThreadMessage(WM_DISPLAY_STOPDISPLAYING, 0, this);//提示:参数3 无法转换。有机会我再看看再次感谢大家的关注和帮助!!!谢谢!
抱歉,前一段时间不能上网,没有回答,不好意思!
void CProDlg::OnButton1()
{
CClientDC dc(this);
CDisplay *m_pMsgLogThread=(CDisplay *) AfxBeginThread(
RUNTIME_CLASS(CDisplay),THREAD_PRIORITY_BELOW_NORMAL,
0,CREATE_SUSPENDED);
m_pMsgLogThread->m_dc=dc;
m_pMsgLogThread->ResumeThread();
}
而后:
LRESULT CDisplay::OnStartDisplaying(WPARAM wParam, LPARAM lParam)
{
int i,x1,x2,y1,y2;
if (data==NULL) return FALSE;
// 如何获得dc....
bar(&m_dc,90,4,538,225); //bar 和 line 是自己编的函数。
for (i=0;i<490;i++) {
x1=i+110; y1=(short)(120-(140.0*data[2*i])/20000);
x2=i+111; y2=(short)(120-(140.0*data[2*(i+1)])/20000);
line(&m_dc,x1,y1,x2,y2);
}
return TRUE;
}
谢谢你的关注!! 线程类中定义声明 m_dc :
//CDC,CWindowDC,CClientDC
CClientDC m_dc;//编译有错。。不知怎么定义~~