一个关于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 有道理
[解决办法]
[解决办法]帮顶!
关注!!
[解决办法][解决办法]你怎樣備份的? 我覺得應該備份的是 (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上。
[解决办法]
需求总算明确。
实现如下:
一;处理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~
[解决办法]
[解决办法]路过,学习下