Windows加载位图API(WIN16位)

Windows加载位图API(WIN16位),windows,winapi,assembly,x86,Windows,Winapi,Assembly,X86,当我把文件放入资源(.rc)中时,我知道如何使用函数LoadBitmap(hInstance,idRes),但是我想知道是否可以加载位图并获得这个句柄,放入一个文件,比如LoadIcon LoadIcon, hInstance, 100 OK LoadIcon, hInstance, addr filename OK 它工作得很好,但与LoadBitmap不兼容 Lo

当我把文件放入资源(.rc)中时,我知道如何使用函数LoadBitmap(hInstance,idRes),但是我想知道是否可以加载位图并获得这个句柄,放入一个文件,比如LoadIcon

LoadIcon, hInstance, 100                                      OK
LoadIcon, hInstance, addr filename                            OK
它工作得很好,但与LoadBitmap不兼容

LoadBitmap, hInstance, 200                                    OK
LoadBitmap, hInstance, addr filename                          ERROR
那么,如何从用户的输入加载位图,而不是从资源加载位图呢

您使用的是什么Windows版本或模拟器

我在Windows 3.1下尝试了
LoadIcon
的行为,这是不支持32位代码(以及Watcom编译器工具套件)的最后一个Windows版本之一:

Windows 3.1不接受文件名作为第二个参数;如果第一个参数是有效的
hInstance
值,Windows 3.1始终将第二个参数解释为“资源名称”。示例(
.rc
文件):

。。。当我指定“
c:\test.ico
”时,Windows 3.1加载了图标
example.ico

我还尝试在Linux下使用WINE 3.6。结果是一样的

因此,如果您的Windows版本确实从文件中加载图标(如您所指示),则您的Windows版本的行为与其他Windows版本不同

<>即使有可能加载<代码> .bmp < /c>文件,使用<代码> LoadBitmap < /代码>,您必须考虑到程序在其他Windows版本下不能正常工作。

如果可以加载位图并获得此句柄,请放入一个文件,如LoadIcon

LoadIcon, hInstance, 100                                      OK
LoadIcon, hInstance, addr filename                            OK
当然,在
.rc
文件中指定名称也可用于位图:

"c:\\test.bmp"  BITMAP  mybitmap.bmp
。。。然而,这可能不是你想要的

那么,如何从用户的输入加载位图,而不是从资源加载位图呢

在Windows 3.1(和3.11)下,没有任何函数可以直接从文件加载位图

由于较新的Windows版本支持32位程序,我怀疑微软是否在较新的Windows版本中添加了新的16位函数:使用新函数会使程序与较旧的Windows版本不兼容,因此不使用32位代码的唯一原因就不存在了

在Windows 3.1下加载
.bmp
文件的典型方法是:

  • .bmp
    文件加载到内存中(在16位窗口下,MS-DOS
    int 21h
    调用通常用于文件访问。)
  • 在文件的偏移量10(十进制)处,有一个32位字包含位图数据的偏移量(“位图位”)
  • 在偏移量14(十进制)处,有一个
    BITMAPINFO
    结构
  • BITMAPINFO
    结构中读取图像的大小(宽度和高度)
  • 获取一些
    HDC
    (例如,通过调用
    GetDC
  • 使用
    CreateCompatibleBitmap
  • CreateCompatibleBitmap
    返回的值是
    HBITMAP
    句柄
  • 使用
    SetDIBits
    将实际图像数据写入位图
  • 释放
    HDC
    (例如,通过调用
    ReleaseDC
您使用的是什么Windows版本或模拟器

我在Windows 3.1下尝试了
LoadIcon
的行为,这是不支持32位代码(以及Watcom编译器工具套件)的最后一个Windows版本之一:

Windows 3.1不接受文件名作为第二个参数;如果第一个参数是有效的
hInstance
值,Windows 3.1始终将第二个参数解释为“资源名称”。示例(
.rc
文件):

。。。当我指定“
c:\test.ico
”时,Windows 3.1加载了图标
example.ico

我还尝试在Linux下使用WINE 3.6。结果是一样的

因此,如果您的Windows版本确实从文件中加载图标(如您所指示),则您的Windows版本的行为与其他Windows版本不同

<>即使有可能加载<代码> .bmp < /c>文件,使用<代码> LoadBitmap < /代码>,您必须考虑到程序在其他Windows版本下不能正常工作。

如果可以加载位图并获得此句柄,请放入一个文件,如LoadIcon

LoadIcon, hInstance, 100                                      OK
LoadIcon, hInstance, addr filename                            OK
当然,在
.rc
文件中指定名称也可用于位图:

"c:\\test.bmp"  BITMAP  mybitmap.bmp
。。。然而,这可能不是你想要的

那么,如何从用户的输入加载位图,而不是从资源加载位图呢

在Windows 3.1(和3.11)下,没有任何函数可以直接从文件加载位图

由于较新的Windows版本支持32位程序,我怀疑微软是否在较新的Windows版本中添加了新的16位函数:使用新函数会使程序与较旧的Windows版本不兼容,因此不使用32位代码的唯一原因就不存在了

在Windows 3.1下加载
.bmp
文件的典型方法是:

  • .bmp
    文件加载到内存中(在16位窗口下,MS-DOS
    int 21h
    调用通常用于文件访问。)
  • 在文件的偏移量10(十进制)处,有一个32位字包含位图数据的偏移量(“位图位”)
  • 在偏移量14(十进制)处,有一个
    BITMAPINFO
    结构
  • BITMAPINFO
    结构中读取图像的大小(宽度和高度)
  • 获取一些
    HDC
    (例如,通过调用
    GetDC
  • 使用
    CreateCompatibleBitmap
  • CreateCompatibleBitmap
    返回的值是
    HBITMAP
    句柄
  • 使用
    SetDIBits
    将实际图像数据写入位图
  • 释放
    HDC
    (例如,通过调用
    ReleaseDC

有很多代码示例演示了如何执行此操作。例如,Websearch将带您去那里。虽然我不明白“WIN16位”是什么意思。@IInspectable我想OP是在写一个16位的Windows程序。@IInspectable