首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

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

2012-02-12 
一个关于GDI画图的问题?当前我设置了窗口的背景为黑色, 用了AlphaBlend,调成100透明度,可以看见底下的一个

一个关于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上。


[解决办法]
需求总算明确。
实现如下:

一;处理WM_CREATE
通过GetDC(NULL)获得屏幕hdcScreen,并将其内容拷到一个内存DC中(假设为hdcScreenBk,全局的哦,后面有用)

二;处理WM_PAINT
(1)创建缓冲DC - hdcMem;
(2)将 hdcScreenBk BitBlt 到 hdcMem; //别的窗口做背景。
//透明窗口就是这样实现的
(3)将 bkmemDc(黑底背景) AlphaBlend 到 hdcMem; //透明的黑色条条
(4)将 memSMSTextHdc(文字) TransparentBlt 到 hdcMem; //透明文字
(5)将 hdcMem Bitblt 到 原始DC上。

试试吧。
[解决办法]
- - 结果什么反应都没 

这种话太抽象了吧。

你试了后的效果是怎么样的,代码贴出来。

透明窗口我就是这么做得。刀哥的书里也是这么做得。
[解决办法]

探讨
需求总算明确。
实现如下:

一;处理WM_CREATE
  通过GetDC(NULL)获得屏幕hdcScreen,并将其内容拷到一个内存DC中(假设为hdcScreenBk,全局的哦,后面有用)

二;处理WM_PAINT
  (1)创建缓冲DC - hdcMem;
  (2)将 hdcScreenBk  BitBlt 到 hdcMem;                //别的窗口做背景。
                                                        //透明窗口就是这样实现的
  (3)将 bkmemDc(黑底背景) AlphaBlend 到 hdcMem;      //透明的黑色条条
  (4)将 memSMSTextHdc(文字) TransparentBlt 到 hdcMem; //透明文字
  (5)将 hdcMem  Bitblt 到 原始DC上。                 

试试吧。

[解决办法]
探讨
需求总算明确。
实现如下:

一;处理WM_CREATE
  通过GetDC(NULL)获得屏幕hdcScreen,并将其内容拷到一个内存DC中(假设为hdcScreenBk,全局的哦,后面有用)

二;处理WM_PAINT
  (1)创建缓冲DC - hdcMem;
  (2)将 hdcScreenBk  BitBlt 到 hdcMem;                //别的窗口做背景。
                                                        //透明窗口就是这样实现的
  (3)将 bkmemDc(黑底背景) AlphaBlend 到 hdcMem;      //透明的黑色条条
  (4)将 memSMSTextHdc(文字) TransparentBlt 到 hdcMem; //透明文字
  (5)将 hdcMem  Bitblt 到 原始DC上。                 

试试吧。

[解决办法]
再實現不了 你直接把code全貼上來吧
[解决办法]
关注,学习
[解决办法]


[解决办法]
ding
[解决办法]
关注中,谢谢了
[解决办法]
每次要把原图绘制在背景上,而不是把上次绘制完成的图绘制上去。
[解决办法]
memSMSTextHdc = CreateCompatibleDC(hdc);
HBITMAP memTextBitmap = CreateCompatibleBitmap( hdc,disRect.right-disRect.left,nSMSTextHight);
int nOldMode = SetBkMode(memSMSTextHdc,TRANSPARENT );
SelectObject(memSMSTextHdc,memTextBitmap); 
RECT memRect = {0,0,disRect.right-disRect.left,nSMSTextHight};

HBRUSH hbrSEL = CreateSolidBrush (RGB(30,144,255 ));
FillRect(memSMSTextHdc, &memRect,hbrSEL);
DeleteObject( hbrSEL );

SetTextColor(memSMSTextHdc, RGB(255,255,255));


DrawText(memSMSTextHdc, smsDisplayText, -1 ,&memRect, DT_EDITCONTROL|DT_WORDBREAK );
SetBkMode(memSMSTextHdc,nOldMode);
DeleteObject( memTextBitmap );
[解决办法]
文字重叠,怀疑是内存DC没有清空,又画了滚动后的文字导致的。 
在内存DC中,不能用TransparentBlt去掉背景么? 
建议楼主还是把描画实现的代码贴上来吧。 

[解决办法]
刷背景!
[解决办法]

[解决办法]
[Quote=引用:]
上午有些事,现在贴出全部代码,各位看看有什么问题。
C/C++ codecase WM_CREATE:
。。。

BitBlt( tempMemDc,0,0,rect.right-rect.left,
rect.bottom-rect.top,
hdc,rect.right-rect.left,
rect.bottom-rect.top,SRCCOPY);
。。。


BitBlt的倒数第2和第3个参数赋错了.
怎么能从目标区域的右下角开始拷贝图像?应该是拷贝区域的left-top点。

检查一下你所有的BitBlt的使用
[解决办法]
WM_ERASEBKGND 下做些什么处理,只是 刷新下屏幕吗? 

[解决办法]
GXGX~
[解决办法]

探讨
成功了!!!不过并不是bitblt的问题,其实我只需要把tempMemDc 保存下来,然后每次画之前刷新一下就可以了,然后还是照常 半透明画背景,然后滚动文本,哈哈,问题解决了真开心。不过sevenzhy你的方法应该也是可行的,只是多了一步先画进内存DC,但是tempMemDc 不能画进内存DC,需要直接就画进当前DC。非常感谢大家热心的解答!!!!

[解决办法]
路过,学习下

热点排行