当前位置: 代码迷 >> Windows Mobile >> 一个关于GDI画图的有关问题
  详细解决方案

一个关于GDI画图的有关问题

热度:141   发布时间:2016-04-25 08:01:09.0
一个关于GDI画图的问题?
当前我设置了窗口的背景为黑色, 用了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 有道理
------解决方案--------------------
探讨
引用:
楼主的意图是什么?从代码来看,我推测是这样的
1、画文本到memSMSTextHdc。
2、把memSMSTextHdc的内容以底色透明的方式覆盖到bkmemDc。
3、把bkmemDc的内容以半透明的方式覆盖到背景窗口。
如果是这样,1和2实际上可以合并,可以直接把文本画到bkmemDc。
另外,在更新文本前必须调用 FillRect(bkmemDc, &memRect,hbrSEL);从你的代码来看只会执行了一次,所以会有前一次滚动的文本没有被刷掉的现象。

我的意图是,背景是一个内存DC,文本是一个内存DC,然后先半透明的把背景画上去,再画文本,这样不滚动是没问题的,如果滚动,就会有重叠,就是底下那层感觉没刷新掉,我用了你的办法,还是一样。

------解决方案--------------------
帮顶!
关注!!
------解决方案--------------------
探讨
引用:
你下面那層沒有刷新掉,應該是你畫上去是一個半透明層的原因,既然半透明那就會看到你上一次畫的內容
你試試再畫這個 “背景是一个内存DC”之前先把屏幕涂個顏色看看(直接畫hdc),如果沒有重疊情況,那就是這個問題

我想就是这个原因了,你知道怎么解决吗?我不想给屏幕涂颜色,就想这个半透明做背景。。。

------解决方案--------------------
你怎樣備份的? 我覺得應該備份的是 (dc上原有的+透明層), 把畫好的這個dc進行備份

之前你不是說不滾動沒有問題嗎? 那應該備份的是整個背景,不僅是透明層
------解决方案--------------------
你說不滾動是好的,那這個時候畫面應該是正確的啊?(在你畫東西到這個正確的背景之前進行備份)
那就直接備份這個時候的DC,GetDC,把DC取出來備份就可以了吧?
------解决方案--------------------
Invalidate(FALSE) 
 放在画之前
如果是TRUE则会有一个白色闪烁。

------解决方案--------------------
探讨
这样不能备份吧,dc只是个指针 ,下一次再进WM_PAINT,他指向的东西肯定没了或者乱了,还有如何备份下来了,要怎么用,在WM_PAINT开始时,画进去?

------解决方案--------------------
窗口初如化时,多建立一个内存DC
bkmemDc2 = CreateCompatibleDC(hdc);
HBITMAP memBit2 = CreateCompatibleBitmap( hdc,rect.right-rect.left,rect.bottom-rect.top);
SelectObject(bkmemDc2,memBit2); 
然后更新画面前,把这个内存DC画到窗口DC上
------解决方案--------------------
你要做透明窗口吗?

做的话去看刀哥的方法。

不做的话,加一个缓存DC, 将东西都画到缓存DC上,最后再 贴到hdc上。
  相关解决方案