Dialog已经正常显示,然后通过timer,在这个Dialog类中的某个成员函数中,想要获得dialog的DC进行处理。
void CRunDlg::Start()
{
CPaintDC * pdc = (CPaintDC *) GetDC();
...
}
Debug版中没有问题,release版中却过不去了。
而且关键是我在GetDC前插入一个AfxMessageBox,能弹出来,在GetDC之后插入AfxMessageBox,就弹不出来了。就算是GetDC失败也应该是返回NULL啊。
然后尝试了:
CDC * pdc = GetDC();
CPaintDC dc(this);
无一例外……
void CRunDlg::Start()
{
CPaintDC * pdc = (CPaintDC *) GetDC();
...
}
Debug版中没有问题,release版中却过不去了。
而且关键是我在GetDC前插入一个AfxMessageBox,能弹出来,在GetDC之后插入AfxMessageBox,就弹不出来了。就算是GetDC失败也应该是返回NULL啊。
然后尝试了:
CDC * pdc = GetDC();
CPaintDC dc(this);
无一例外……
后来发现是内存泄露搞得鬼,你看看你的程序是不是这方面的原因
但是我建议:
你所有的定时器里面的代码都在WM_PAINT消息函数中写,然后用定时器更新不同的RECT是否可以?
{
CPaintDC * pdc;
try{
pdc = (CPaintDC *) GetDC();
}
catch (CException e) {
char errrr[1024]; e.GetErrorMessage(errrr,1024);
writeLog(errrr);
}
}居然写不出来。faint用过API了,
pdc = (CPaintDC *) ::GetDC(this->GetSafeHwnd());
过是能过,可是bitblt不到dialog的DC上。
只要修改FLAG然后在OnPaint中进行相应
然后InvalidateRect就可以了May you succeed!
HDC hDC = ::GetDC(this->GetSafeHwnd());
if(! hDC){
AfxMessageBox("Can not get a dc, T_T);
return;
}
..........//
....... //
::BitBlt(hDC,0,0,nWidth,nHeight,MemDC.GetSafeHdc(),0,0,SRCCOPY);如果还不行的话..无语 ^o^
窗口句柄Get不到dc..不知何故.(排除ReleaseDC()的问题)
窗口有问题?全都是CWnd的成员函数..
应该是窗口句柄无效导致的,OnInitDialog里把句柄记下来,到GetDC()的时候两个比较一下看是否相等。
CPaintDC * pdc = (CPaintDC *) GetDC();
在OnDestory中释放CDC;
ReleaseDC(pDC);
不要在OnTimer中获取CDC,因为获取DCD相当于是分配一定的内存并将CDC的参数存入此内存,如果在OnTimer中获取,就等于不断的分配内存而不释放已分配的内存会造成内存泄露.
如果以上的方法还不能解决问题,就可能是数组超界的问题,我以前也出过类似的问题,程序在Debug下正常,但在release下出错,检查了一下,也没发现内存泄露的问题,最后发现是数组超界.
因为VC在DEbug方式下会对数组超界采取一定的保护措施,所以有时候在Debug下数组超界没问题而在release下会出问题.
ckp(surge) 在OnInitDialog中获取CDC
我觉得不行。
Identifies the device context for the CWnd client area if successful; otherwise, the return value is NULL. The pointer may be temporary and should not be stored for later use.
MSDN上是这样解释的,这样得到的指针会无效,更加导致程序出错。