请问画在HDC上的图像转换成位图呢?

VBProFans 2009-07-10 04:00:49
用DrawIcon 画在 Picture1.hdc 上的图像怎么才能转换成位图呢
...全文
130 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Soyokaze 2009-07-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 vbprofans 的回复:]
谢谢各位的热心帮助  Soyokaze大哥能不能说清楚点呢  位图的祛病是不是用GetObject函数来获得的呢
获得了具体应该怎么做  能不能说清楚点呢  谢谢
[/Quote]

下面的代码用来演示怎样由图标获得位图句柄,并在窗口上显示。
附图是实际效果。左边是直接画出的效果,右边显示的是生成的位图。
注意:因为普通24位的BMP是不带透明通道的,因此直接用图标生成的位图,再显示出来,是不能有透明效果的。
窗口的AutoRedraw设置为True,ScaleMode为3。源图标文件路径:C:\sample.ico



Option Explicit

Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Private Const IMAGE_ICON = 1
Private Const LR_LOADFROMFILE = 16
Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long

Private Declare Function GetIconInfo Lib "user32" (ByVal hIcon As Long, piconinfo As ICONINFO) As Long
Private Type ICONINFO
fIcon As Long
xHotspot As Long
yHotspot As Long
hbmMask As Long
hbmColor As Long
End Type
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Type BITMAP '14 bytes
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type


Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long


Private Sub Form_Load()
Dim hIcon As Long
hIcon = LoadImage(App.hInstance, "C:\sample.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE)

Dim ii As ICONINFO
Call GetIconInfo(hIcon, ii)
Dim bmp As BITMAP
Call GetObject(ii.hbmColor, Len(bmp), bmp)

Dim hdc As Long
hdc = CreateCompatibleDC(Me.hdc)
Dim hBmp As Long, hBmpOld1 As Long
hBmp = CreateCompatibleBitmap(Me.hdc, bmp.bmWidth, bmp.bmHeight)
hBmpOld1 = SelectObject(hdc, hBmp)

Dim hDCMem As Long
hDCMem = CreateCompatibleDC(Me.hdc)
Dim hBmpOld2 As Long
hBmpOld2 = SelectObject(hDCMem, ii.hbmMask)
Call BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCMem, 0, 0, vbSrcAnd)
Call BitBlt(Me.hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCMem, 0, 0, vbSrcAnd)
Call SelectObject(hDCMem, hBmpOld2)
hBmpOld2 = SelectObject(hDCMem, ii.hbmColor)
Call BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCMem, 0, 0, vbSrcInvert)
Call BitBlt(Me.hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCMem, 0, 0, vbSrcInvert)
Call SelectObject(hDCMem, hBmpOld2)

Call BitBlt(Me.hdc, bmp.bmWidth + 16, 0, bmp.bmWidth, bmp.bmHeight, hdc, 0, 0, vbSrcCopy)

Call SelectObject(hdc, hBmpOld1)
Call DeleteObject(hBmp)
Call DeleteDC(hdc)
Call DeleteDC(hDCMem)
Call DestroyIcon(hIcon)

Set Me.Picture = Me.Image
End Sub
VBProFans 2009-07-14
  • 打赏
  • 举报
回复
打错字了 不是“祛病” 是“句柄” 不好意思哈
VBProFans 2009-07-14
  • 打赏
  • 举报
回复
谢谢各位的热心帮助 Soyokaze大哥能不能说清楚点呢 位图的祛病是不是用GetObject函数来获得的呢
获得了具体应该怎么做 能不能说清楚点呢 谢谢
嗷嗷叫的老马 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 vbprofans 的回复:]
能不能直接画到菜单栏上 不经过PictureBox 这样好像速度有点慢 我试了一下  菜单栏没有HDC这属性啊
到底怎样才能直接画到菜单栏上呢  谢谢
[/Quote]
速度再慢也影响有限啊,你不可能有成千上万的菜单吧.......
东方之珠 2009-07-13
  • 打赏
  • 举报
回复
看看这个,窗体上的图片、按钮、文字、图形等统统保存:
http://topic.csdn.net/u/20090419/19/e20a8208-c9e7-4c29-a5ea-927e54aeba9d.html?2098442212

下面这个也行:
http://topic.csdn.net/u/20080331/19/6c605dcc-2f22-4de7-a7f2-c6c122a615f7.html?1759399285
Soyokaze 2009-07-13
  • 打赏
  • 举报
回复
的确,想要给菜单上加左边的图标,需要传一个位图句柄(API的规定),但是其实一般用的是图标,这个可以自己转换。
给菜单加图标的函数是SetMenuItemInfo
怎样转换呢?
首先根据图标尺寸建立一个位图,选入DC。
然后载入你的那个图标,调用GetIconInfo函数,在其ICONINFO参数中,有两个成员hbmMask和hbmColor,它们就是组成这个图标的两个位图句柄(注意一个图标是由两个位图组成的)。
有了这两个位图句柄,就好说了。之后就是调用BitBlt,配合合适的RO2参数,进行绘制。hbmMask用AND,hbmColor用XOR。
VBProFans 2009-07-12
  • 打赏
  • 举报
回复
能不能直接画到菜单栏上 不经过PictureBox 这样好像速度有点慢 我试了一下 菜单栏没有HDC这属性啊
到底怎样才能直接画到菜单栏上呢 谢谢
嗷嗷叫的老马 2009-07-12
  • 打赏
  • 举报
回复
http://www.m5home.com/blog/article.asp?id=292



Set Picture1.Picture = Picture1.Image

这是关键一句.
VBProFans 2009-07-11
  • 打赏
  • 举报
回复
myjian大哥 其实我想用 SetMenuItemBitmaps 这个函数把picture1.hdc里画的图标添加到菜单栏里去 但是这个函数要的是位图 请问怎么把Hdc上画的图标转换成位图然后添加到菜单栏里去呢 谢谢!
这几天都在折腾这东西 没找到办法
嗷嗷叫的老马 2009-07-11
  • 打赏
  • 举报
回复
.............I是你要保存的文件名(全路径)
贝隆 2009-07-10
  • 打赏
  • 举报
回复
学习
VBProFans 2009-07-10
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim Ihwnd As Long
Dim FHwnd As Long
FHwnd = FindWindow(vbNullString, "我的电脑")
Debug.Print FHwnd
Ihwnd = GetClassLong(FHwnd, -14)
Debug.Print Ihwnd
DrawIcon Picture1.hdc, 0, 0, Ihwnd
SavePicture Picture1.Image, I
End Sub

怎么是文件未找到呢
嗷嗷叫的老马 2009-07-10
  • 打赏
  • 举报
回复
DrawIcon tmpPic.hdc, 0, 0, hIcon
SavePicture tmpPic.Image, I

tmpPic是个图片框,AutoSize属性要设置为True.

测试通过.

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧