我想得到一个透明颜色的字体,去覆盖原来颜色的字体,达到“擦除”原来字的效果?
谢谢!

解决方案 »

  1.   

    将CDC的绘图模式设置成R2_NOTXORPEN,并将背景颜色设置成TRANSPARENT,在擦除时在原位置上再绘制一下就清除了。示例代码如下: CDC *pDC = GetDC();
    int nBkMode = pDC->SetBkMode(TRANSPARENT);
    int nDrawMode = pDC->SetROP2(R2_NOTXORPEN);
    //再绘制一下原先的文字,就相当于擦除了
    pDC->TextOut(x, y, m_strPreText); //下面是绘制当前要显示的文字
    pDC->TextOut(x, y, m_strCurText);
    m_strPreText = m_strCurText;

    pDC->SetBkMode(nBkMode);
    pDC->SetROP2(nBkMode);
    ReleaseDC(pDC);/*********************************************/
    //注:在调用上面的代码之前你得有个地方先调用TextOut绘制一下第一次的文字(一定要调用)
    //m_strCurText:是当前要显示的文字内容
    //m_strPreText:是先前显示的文字内容
      

  2.   


    伪代码?  预设的str始终只有一个的,没有Pre和Cur的可能(不知道自己有没有搞错概念)??不知道有没有理解错,方法是在TextOut了新str后,用一个翻转模式的str去覆盖原来的字,变回原来的透明背景模式,然后再往下一个新步长TextOut一个str,再重复...初试用了这个方法去做(貌似要再增加了储存旧步长位置的变量,以供覆写吧?),可能新str和旧str擦除的切换速度太快,形成了画面看不到字(刷新太快?),就跟每步做一下Invalidate差不多了?
    不知道是不是这样...
      

  3.   

    如果只是实现跑马灯的效果,建议楼主把要显示的文字放到一个Static Text控件中,然后在OnTimer里移动这个Static Text控件就好了
      

  4.   


    是的,本来是想问如何获得一个背景色的颜色,RGB?
    关于擦旧字有个问题,是应该先擦了旧字加了步长才来写新字,还是写了新字才去擦旧字?
    谢谢!
      

  5.   

    当然得先擦旧字,然后写新字,这样才不会擦掉新字的部分。
    对话框默认的背景色是RGB(240, 240, 240)
      

  6.   


    因为想平滑一些,所设步长比较短,定时器间隔小,快速反复擦写,肉眼看起来的字也接近透明了
    打算换用移动StaticText的方法,在上面留字的话,还是CDC的TextOut,这样移动的话不也就跟原来差不多情况吗。不知道还有什么方法。