当前我设置了窗口的背景为黑色, 用了AlphaBlend,调成100透明度,可以看见底下的一个界面,界面是用createwindow,然后我需要在这个背景上面滚动的画文本,如果背景没有透明度,只是黑色的话,没有问题,文字正常滚动,但是如果背景有透明度的话,我每滚动一次文本,透明度变大,而且前一次滚动的文本没有被刷掉,造成重叠,最终,透明度变最大,变成实体的黑色。 顺便说下,我是在一个内存DC上先画好文本,再画到界面上,在内存DC 中给文本设置了背景颜色,到界面上的时候,用TransparentBlt去掉背景,将文本画上,有高手知道这是怎么回事么,刚开始接触 GDI,可能一些原理还没弄清楚,希望高手指导。
------解决方案--------------------
文字重叠,怀疑是内存DC没有清空,又画了滚动后的文字导致的。
在内存DC中,不能用TransparentBlt去掉背景么?
建议楼主还是把描画实现的代码贴上来吧。
------解决方案--------------------
这很正常,你必须每次贴透明位图前先贴上背景图才行,把背景图保存在DC里面,需要时贴上对应的部分就行
------解决方案--------------------
重叠的原因是原背景没有被刷掉
处理WM_ERASEBKGND,或者Invalidate(TRUE),但是后者可能造成窗口闪烁,如果你不处理WM_ERASEBKGND的话.
------解决方案--------------------
7楼可能是
WM_ERASEBKGND:
return TRUE;
------解决方案--------------------
TransparentBlt( hdc,disRect.left,smsTextTarCy,(disRect.right-disRect.left),
这一句应该是画到bkmemDc吧?
------解决方案--------------------
楼主的意图是什么?从代码来看,我推测是这样的
1、画文本到memSMSTextHdc。
2、把memSMSTextHdc的内容以底色透明的方式覆盖到bkmemDc。
3、把bkmemDc的内容以半透明的方式覆盖到背景窗口。
如果是这样,1和2实际上可以合并,可以直接把文本画到bkmemDc。
另外,在更新文本前必须调用 FillRect(bkmemDc, &memRect,hbrSEL);从你的代码来看只会执行了一次,所以会有前一次滚动的文本没有被刷掉的现象。
------解决方案--------------------
ls 有道理
------解决方案--------------------
------解决方案--------------------
帮顶!
关注!!
------解决方案--------------------
------解决方案--------------------
你怎樣備份的? 我覺得應該備份的是 (dc上原有的+透明層), 把畫好的這個dc進行備份
之前你不是說不滾動沒有問題嗎? 那應該備份的是整個背景,不僅是透明層
------解决方案--------------------
你說不滾動是好的,那這個時候畫面應該是正確的啊?(在你畫東西到這個正確的背景之前進行備份)
那就直接備份這個時候的DC,GetDC,把DC取出來備份就可以了吧?
------解决方案--------------------
Invalidate(FALSE)
放在画之前
如果是TRUE则会有一个白色闪烁。
------解决方案--------------------
------解决方案--------------------
窗口初如化时,多建立一个内存DC
bkmemDc2 = CreateCompatibleDC(hdc);
HBITMAP memBit2 = CreateCompatibleBitmap( hdc,rect.right-rect.left,rect.bottom-rect.top);
SelectObject(bkmemDc2,memBit2);
然后更新画面前,把这个内存DC画到窗口DC上
------解决方案--------------------
你要做透明窗口吗?
做的话去看刀哥的方法。
不做的话,加一个缓存DC, 将东西都画到缓存DC上,最后再 贴到hdc上。