当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

 ·进来帮忙吧各位大哥    »显示摘要«
    摘要: 本人原来没用vc做过东西,只对windows的消息驱动机制及c++语言了解一些.对mfc还未实现零的突破.老师今日要求用vc做一个工资管理程序,并且很急.请问有没有可能在两三天内学习mfc,完成这个东东.并且我想此类程序应该是表格式的,vc下有没有什么控件可生成表格,请各位侠指点. ......
 ·vc如何删除文件    »显示摘要«
    摘要: rt ......


画位图问题

我要在客户区画一些位图,位图的背景是白色的。这样当我客户区的颜色变了的时候,位图的所有颜色是不变的,也就留下了很多白色小区域。  
  我的问题是:  
  有没有办法让位图中的部分颜色随着客户区的颜色而变?

NO.1   作者: liutang

如果你的位图有调色板,通过修改调色板应该可以作到让指定色想素随着客户区的颜色而变。不过我想假如你花灯泡之类,估计你是想以灯泡的不同亮度来表示不同状态,由于你的图很小,不如搞几个不同状态的灯泡的图片,放在资源里,这样简单的多。

NO.2   作者: wfowler

我想你可以把那结位图变换为图标应该没有这些问题了,加载图标的方法和加载位图的方法差不多。  
  ……  
  HICON hicon;  
  ihcon=AfxGetApp()->LoadIcon(IDI_ICON);  
  ……  
  ClientDC.DrawIcon(,,);  
  _____________________________  
  另外也可以绘制透明区域位图,这样也不会看到后面的矩形区域了。这个代码有时间再给你写了,这二天太忙了。

NO.3   作者: spwnihao╭∩╮鄙视一切)

你可以画透明位图,例如让灯泡的外边白框为透明的,不就行了;  
  透明位图实现也不难。  
  有一种画透明位图的方法,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。  
   
  用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);  
  }  
  详细请见  
  http://download.lycos.com.cn/program/article/vc/vc439.html

NO.4   作者: qindq

还是老老实实直接访问Bitmap中的pixel数据,将pixel数据在内存中重新改写。当然我不知道,您的位图是通过哪一种方法画上去的,最好是通过StretchDIBits(...)。如果是资源中的Bitmap,可以通过GetDIBits()得到StretchDIBits要得到的参数。  
 


    摘要: 对于c++初学者来说,指针、函数指针,引用、传参、传址,历来让人迷惑~关于这些,欢迎大家来讨论~我是没看明白~也是没时间认真看~希望大家说得通俗一些~好让初学者能够明白~ ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE