DuiLib调用Draw3dRect的有关问题
DuiLib调用Draw3dRect的问题
在MFC项目中创建了一个DuiLib界面
class CDuiLogon : public WindowImplBase
CDuiLogon 中有一个继承自CSTATIC的控件m_pWndValidateCode, 用来显示验证码
这是验证码控件绘制验证码图片的函数。
这是显示结果。

如果把这个函数放在oncreate里面, 或者是该界面的show之后都不会正常显示。
如果把这个控件换成cbutton控件的话是可以正常显示的。
而且这个控件还有一个点击触发验证码变化的操作, 这个操作的时候成功的, 也就是点击空白之后会有验证码显示。
--------------------------------------------
我判断应该是draw3drect的响应在showwindow之前所以没有绘制成功, 但是我前面也说道了再show后面紧跟着加上绘制动作也是不行的。请问这种情况是什么原因?
------解决思路----------------------
应该放到OnPaint里面,你需要做的就是一个内存dc成员变量,把验证码的位图画到内存dc。然后每次触发OnPaint时把内存dc画到实际dc中。当接收到鼠标单击消息后,生成新的验证码并画到内存dc里。就可以了
在MFC项目中创建了一个DuiLib界面
class CDuiLogon : public WindowImplBase
CDuiLogon 中有一个继承自CSTATIC的控件m_pWndValidateCode, 用来显示验证码
VOID CWndValidateCode::CreateValidateCode(CImage & ImageValidateCode, INT nWidth, INT nHeight)
{
//销毁图片
if (ImageValidateCode.IsNull()==false)
{
ImageValidateCode.Destroy();
}
//构造图片
ASSERT((nWidth>0)&&((nHeight>0)));
ImageValidateCode.Create(nWidth,nHeight,32);
//创建 DC
CImageDC BufferDC(ImageValidateCode);
CDC * pBufferDC=CDC::FromHandle(BufferDC);
//填充背景
pBufferDC->FillSolidRect(1,1,nWidth-2,nHeight-2,RGB(255,255,255));
pBufferDC->Draw3dRect(0,0,nWidth,nHeight,RGB(255,255,255),RGB(125,125,125));
//随机背景
for (INT nXPos=1;nXPos<nWidth-1;nXPos+=2)
{
for (INT nYPos=1;nYPos<nHeight-1;nYPos+=2)
{
pBufferDC->SetPixel(nXPos,nYPos,RGB(rand()%255,rand()%255,rand()%255));
}
}
//设置 DC
pBufferDC->SetBkMode(TRANSPARENT);
pBufferDC->SetTextColor(RGB(0,0,0));
//变量定义
INT nXSpace=nWidth/CountArray(m_szValidateCode);
//显示内容
for (BYTE i=0;i<CountArray(m_szValidateCode);i++)
{
//位置定义
CRect rcDraw;
rcDraw.SetRect(i*nXSpace,0,(i+1)*nXSpace,nHeight);
//创建字体
CFont DrawFont;
DrawFont.CreateFont(-14,0,0,0,800,0,0,0,134,3,2,ANTIALIASED_QUALITY,2,TEXT("宋体"));
//显示内容
pBufferDC->SelectObject(DrawFont);
pBufferDC->DrawText(&m_szValidateCode[i],1,&rcDraw,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
//清理资源
pBufferDC->SelectObject(CSkinResourceManager::GetInstance()->GetDefaultFont());
}
return;
}
这是验证码控件绘制验证码图片的函数。
这是显示结果。
如果把这个函数放在oncreate里面, 或者是该界面的show之后都不会正常显示。
如果把这个控件换成cbutton控件的话是可以正常显示的。
而且这个控件还有一个点击触发验证码变化的操作, 这个操作的时候成功的, 也就是点击空白之后会有验证码显示。
--------------------------------------------
我判断应该是draw3drect的响应在showwindow之前所以没有绘制成功, 但是我前面也说道了再show后面紧跟着加上绘制动作也是不行的。请问这种情况是什么原因?
------解决思路----------------------
应该放到OnPaint里面,你需要做的就是一个内存dc成员变量,把验证码的位图画到内存dc。然后每次触发OnPaint时把内存dc画到实际dc中。当接收到鼠标单击消息后,生成新的验证码并画到内存dc里。就可以了