凌云窟
南山巅上火麟烈,北海潜深雪饮寒。可怜两锋未缘见,雪刀封隐孤剑鸣。
<2006年5月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

留言簿(0)

随笔分类

随笔档案

文章档案

相册

简历下载

搜索

最新评论

  • 1. re: 很遗憾,minix的阅读计划被我取消了
  • 你可以去死了。
  • --smartly
  • 2. re: 透明文本、位图的实现方案
  • 双缓冲的确不是画在父窗口,之所以透明,是因为内存dc背景为父窗口背景.
  • --yaowei
  • 3. re: 终于启动minix源代码阅读计划了!
  • 我基本上把MINIX3主要的东西看完了。我的BLOG上有两篇文章是关于MINIX3的。有空可以交流。
    http://jnxnj.spaces.live.com
  • --k
  • 4. re: 很遗憾,minix的阅读计划被我取消了
  • 如果是迫于工作压力可以理解,一个人的精力毕竟有限。学MINIX关键是学其中的思想。MINIX3当然没有LINUX成熟,minix3 连分页都没有,关于线程的概念也没有,等等。但是,将MINIX3作为微内核的代表来看,你会发现学了是一个不小的收获。
  • --k
  • 5. 欢迎交流minix3
  • 我在chinaunix上的BLOG
    devahb.cublog.cn
  • --JEFF
  • 6. re: 构造函数调用虚函数追踪
  • vc资料站:http://www.vcmsdn.com/     对学习很有帮助的,可以上去

    看看,或加群46138350,里面有高手可以请教的。
  • --maggie
  • 7. re: x86是满递减堆栈还是空递减堆栈?
  • vc资料站:http://www.vcmsdn.com/     对学习很有帮助的,可以上去

    看看,或加群46138350,里面有高手可以请教的。
  • --maggie
  • 8. re: x86是满递减堆栈还是空递减堆栈?
  • x8086汇编基础课程中的push/pop,有详细介绍。。。。
    注:debug/release下的对应汇编有的存在差异(eg:switch/call),用release中的listfile输出.asm文件~
  • --windowssky
  • 9. re: 构造函数调用虚函数追踪
  • 赞同你的意见,当时这么想是因为看过一本书,那里说在构造函数就要设置好虚函数表,所以自然就想在构造函数中既然虚函数表已经设定好了,那有可能调用虚函数是通过虚函数表来调用哦。
    当然,事实证明这种说法是错的!原因正如你所说。
  • --莫问春秋
  • 10. 没人灌,那我灌吧
  • 虚函数表的作用是什么?
    因为对象的动态类型是什么,必须到运行时才知道,也就是只有到运行到那一步时,才知道应该实际调用哪个virtual函数。

    但在构造函数中,需要到运行时才能知道吗?它本身的类型就是其动态类型,所以根本不需要去查虚函数表。
  • --周星星

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-22 文章-0 评论-36 Trackbacks-0
2006年5月14日
      本来自己的智力商数就不高,平时做人又比较谨慎。这几天面对这两座大山表现出来的无助和吃力着实让我大汉一把,难道我已经到了“江郎才尽”的地步了!!!还记得大2的时候,自己的物理科的解题素质一下子降到了低谷,连以前考不及格的师友都能做的题我竟然不知所谓,虽然嘴巴头说没关系,可能太久没学导致生疏了。可心里头吧!从此钓了一块儿大石头,这不,现在这颗石头遥遥欲坠了!
      透明位图吧,老师看不懂那三个光栅操作是如何完成,只能依样画葫芦,自己一点创新都出不来。
      字幕功能就更悬了,2个父子关系的窗口,因为一个背景色导致表现不同,这里我把它记下来,希望以后能解决,以解此苦!
      sdk的demo示范中,首先会注册一个窗口类,这个窗口类使用一个特定的颜色做他的背景画刷,然后demo创建这个窗口类对应窗口把这个窗口hwnd传递给一个sdk函数,这个函数负责创建一个视频预览窗口负责显示图像,也就是说窗口类创建的窗口是视频预览窗口的父窗口。刚才提到的那个背景画刷如果设定为某个颜色,则视频预览窗口显示图像正常,但是如果设定为其他颜色,则预览窗口不能预览了!!
    
      呜呼哀哉!!
----------------------------------------------------------------------------------------
附资料:
绘制半透明位图以及如何画透明位图
--------------------------------------------------------------------------------

绘制半透明位图
有的时侯,我们希望显示一幅半透明的位图。也就是说我们将一幅位图B
显示到A位图上,又希望透过B位图看到A位图的一部分图像但不是全部。比如A位
图是一幅曲线图,B是一幅提示位图,我们想在显示提示的同时看到已显示的曲
线,但不需要曲线的背景
,就需有用到半透明位图。曲线看上去就象从B位图中渗
透过来,其实半透明技术就是一种渗透技术,渗透公式我们可选用多种,在这里
我们选用(A AND 0x7F)OR B。注意,白色不能产生渗透。
//参数说明:
//hDIB -位图句柄
//pPal -位图调色板
//xDest -显示位图的左上角x坐标
//yDest -显示位图的左上角y坐标
void DrawSemiTransparentBitmap(CDC *pDC, int nXDest, int nYDest, HGLOBAL hDIB,CPalette *pPal)
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :
1 << bmInfo.bmiHeader.biBitCount;
int nWidth = bmInfo.bmiHeader.biWidth;
int nHeight = bmInfo.bmiHeader.biHeight;
LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
CDC memDC;
memDC.CreateCompatibleDC( pDC );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE&&nColors<256)
CPalette *pOldMemPalette = memDC.SelectPalette(pPal, FALSE);
memDC.RealizePalette();
::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0, nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
CDC maskDC;
CBitmap mbm;
maskDC.CreateCompatibleDC(pDC);
mbm.CreateCompatibleBitmap(pDC, nWidth, nHeight);
maskDC.SelectObject(&mbm);
maskDC.FillSolidRect(CRect(0, 0, nWidth, nHeight), RGB(0x7F, 0x7F, 0x7F));
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC, 0, 0, SRCPAINT);
memDC.SelectObject(pOldBitmap);
} 
如何画透明位图
  画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和
要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,
而不透明的是白色的,白色的部分就是透明的部分。
假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背
景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。
比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我
们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。
用VC++ MFC实现的代码如下:
void CDemoDlg::OnPaint()
CPaintDC dc(this);
Cbitmap BmpBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB;
BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图
BmpA.LoadBitmap(IDB_BITMAPA); //载入图A
BmpB.LoadBitmap(IDB_BITMAPB); //载入图B
CDC dcBack,dcA,dcB; //声明三个内存DC用于画图
dcBack.CreateCompatibleDC(&dc);
dcA.CreateCompatibleDC(&dc);
dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC
pOldBack=dcBack.SelectObject(&BmpBack);
pOldA=dcA.SelectObject(&BmpA);
pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC
dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A
dcBack.SelectObject(pOldBack);
dcBack.SelectObject(pOldA);
dcBack.SelectObject(pOldB); //从内存DC中删除位图
你会看到红色的字母A透明地画在背景上了。
用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,
比较浪费。还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好
遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,
凡是这个透明色的地方则画成透明的。
用VC++ MFC实现的代码如下:
/*
这是一个用来画透明位图的函数
CDC *pDC 需要画位图的CDC指针
UINT IDImage 位图资源ID
Crect &rect 指定位图在pDC中的位置
COLORREF rgbMask 位图的透明色
*/
void DrawTransparentBitmap(CDC *pDC, UINT IDImage,Crect &rect, COLORREF rgbMask)
CDC ImageDC,MaskDC;
Cbitmap Image,*pOldImage;
Cbitmap maskBitmap,*pOldMaskDCBitmap ;
Image.LoadBitmap(IDImage);
ImageDC.CreateCompatibleDC(pDC);
pOldImage=ImageDC.SelectObject(&Image);
MaskDC.CreateCompatibleDC(pDC);
maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );
ImageDC.SetBkColor(rgbMask);
MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );
ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,255,255));
ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);
MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
void CDemoDlg::OnPaint()
CPaintDC dc(this);
Cbitmap BmpBack,*pOldBack,;
BmpBack.LoadBitmap(IDB_BACKGROUND);
CDC dcBack;
dcBack.CreateCompatibleDC(&dc);
pOldBack=dcBack.SelectObject(&BmpBack);
dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
DrawTransparentBitmap(&dc,IDB_BITMAPA,Crect(0,0,48,48),RGB(192,192,0));
dcBack.SelectObject(pOldBack);
发表于 2006-05-14 18:10 莫问春秋 阅读(1216) | 评论 (0)编辑 收藏