开发一个公司内部使用的字体工具生成,主要流程是选择字体,加载到dc上在用textout绘制出来,获取上面的数据,再转化成内部需要的数据格式。
现在的问题是把内部使用的数据格式转化成图片格式,加入到CBitMap中,再用dc双缓冲绘制,结果数据越大,越容易出现绘制为黑的情况,多刷新(调用onpaint)几次可以显示正常,再刷新大概率还是黑色。(左边为正常情况,右边为异常情况)
代码流程是按键触发show,show设置bmp图片,调用RedrawWindow 刷新待绘制区域,然后在onpaint里面绘制。相关代码如下:
void CFontDlg::OnPaint()
{
CDialog::OnPaint();
//CPaintDC dc(this); // device context for painting
if (m_bmpF.m_hObject != NULL)
{
// CPaintDC dcClient(this);
CClientDC dcClient(this);
CDC cdc;
// 创建一个内存DC
cdc.CreateCompatibleDC(&dcClient);
HGDIOBJ pOldmap = cdc.SelectObject(&m_bmpF);
//cdc.FillSolidRect(m_rcGraphy,dcClient.GetBkColor());//按原来背景填充客户区,不然会是黑色
dcClient.BitBlt(m_rcGraphy.left,m_rcGraphy.top,m_rcGraphy.Width(),m_rcGraphy.Height(),&cdc,0,0,SRCCOPY); //直接将原DC的图像贴到内存D
// 绘制字体边框
dcClient.MoveTo(m_rcGraphy.left - 1, m_rcGraphy.top - 1);
dcClient.LineTo(m_rcGraphy.left - 1, m_rcGraphy.bottom);
dcClient.LineTo(m_rcGraphy.right , m_rcGraphy.bottom);
dcClient.LineTo(m_rcGraphy.right , m_rcGraphy.top - 1);
dcClient.LineTo(m_rcGraphy.left - 1, m_rcGraphy.top - 1);
cdc.SelectObject(pOldmap);
DeleteObject(&m_bmpF);
// 删除DC
cdc.DeleteDC();
}
}
// 处理字符显示
void CFontDlg::Show(Graphy &graphy )
{
Graphy graphyEnLarge;
// 放大字体
_FontLogic.EnlargeGraphy(graphy ,graphyEnLarge);
// 设定中心点
static CPoint poCenter(720,70);
CRect rcGraphy(poCenter.x - (graphyEnLarge.Width +1) / 2,poCenter.y - (graphyEnLarge.Height +1) / 2,
poCenter.x + graphyEnLarge.Width / 2 ,poCenter.y + graphyEnLarge.Height / 2 );
m_rcGraphy = rcGraphy;
if (m_bmpF.m_hObject != NULL)
{
m_bmpF.DeleteObject();//删除位图
}
CClientDC dcClient(this);
CDC cdc;
cdc.CreateCompatibleDC(&dcClient); //创建一个内存DC
m_bmpF.CreateCompatibleBitmap(&cdc,m_rcGraphy.Width(),m_rcGraphy.Height()); //创建一个内存位图
UINT uCount = m_rcGraphy.Height() * m_rcGraphy.Width();
UINT usize = chCEIL(uCount *4, 8) /8;
Graphy graphyCopy = graphyEnLarge;
_FontLogic.DealGraphy2BmpData(graphyCopy);
m_bmpF.SetBitmapBits(uCount,graphyCopy.p_data);
cdc.DeleteDC(); //删除DC
// 使整个区域失效,系统重画
ClearRectWindows( graphyEnLarge );
}
void CFontDlg::ClearRectWindows( const Graphy &graphy)
{
static int iStWidth = 0 , iStHeitht = 0;
// 设定中心点
static CPoint poCenter(720,70);
if ( iStWidth < graphy.Width)
{
iStWidth = graphy.Width;
}
if ( iStHeitht < graphy.Height)
{
iStHeitht = graphy.Height;
}
// 增加边框的刷新区域// 边框为1个像素宽
CRect rcRedraw(poCenter.x - 1 - (iStWidth + 1) / 2,poCenter.y - 1 - (iStHeitht +1) / 2,
poCenter.x + 1 + iStWidth / 2 ,poCenter.y + 1 + iStHeitht / 2 );
RedrawWindow(rcRedraw);
}