2018年7月10日

几个非常好的Opencv网站

posted @ 2018-07-10 05:49 wrh 阅读(11568) | 评论 (0)编辑 收藏

2014年9月18日

解决方法:

ShowDropDown();之后SetCursor(LoadCursor(NULL, IDC_ARROW));即可
posted @ 2014-09-18 19:12 wrh 阅读(1303) | 评论 (0)编辑 收藏

2013年3月17日

http://www.cvchina.info/codes/

http://www.tuicool.com/topics/11020052?st=0&lang=1&pn=1



OpenCV_基于局部自适应阈值的图像二值化


http://www.tuicool.com/articles/Mvqeui


一个很好的快速小波变换(FWT)源码 C++的 http://www.codeproject.com/KB/graphics/2D_FWT_lib.aspx

很好用哦




posted @ 2013-03-17 20:53 wrh 阅读(556) | 评论 (0)编辑 收藏

2013年2月27日

有时候下拉框(MFC标准叫组合框,CComboBox)中条目文本很多,超过了下拉框的宽度,如果不加设置的话,超过的部分文本将无法显示,查找MSDN,发现解决方法,代码如下:


代码

// The pointer to my combo box.
    extern CComboBox* pmyComboBox;

    // Set the height of every item so the item
    // is completely visible.
    CString str;
    CSize   sz;
    int     dx=0;
    CDC*    pDC = pmyComboBox->GetDC();
    for (int i=0;i < pmyComboBox->GetCount();i++)
    {
        pmyComboBox->GetLBText( i, str );
        sz = pDC->GetTextExtent(str);

        // Only want to set the item height if the current height
        // is not big enough.
        if (pmyComboBox->GetItemHeight(i) < sz.cy)
            pmyComboBox->SetItemHeight( i, sz.cy );

        // Only want to set the item width if the current width
        // is not big enough.
        if (pmyComboBox->GetDroppedWidth() < sz.cx)
        {
            pmyComboBox->SetDroppedWidth(sz.cx + 20);
        }
    }
    pmyComboBox->ReleaseDC(pDC);

效果图:



posted @ 2013-02-27 22:21 wrh 阅读(1294) | 评论 (0)编辑 收藏

2012年7月15日

一、准备工作
        这里我用到的平台是 Microsoft Visual Studio 2008 和OpenCV2.0
        OpenCV2.0下载地址 http://www.opencv.org.cn/index.php/Download。安装OpenCV2.0,假定安装目录为:D:Program FilesOpenCV2.0
        CMake下载地址 http://www.cmake.org/cmake/resources/software.html (选择 Win32 Installer 安装版本)。

二、编译OpenCV
1. 用CMake导出VC++ 项目文件
■ 运行cmake-gui,设置路径为OpenCV安装路径(例如:D:\Program Files\OpenCV2.0),并创建子目录 D:\Program Files\OpenCV2.0\vc2008,用于存放编译结果。
■ 然后点 configure,在弹出的对话框内选择 Visual Studio 9 2008。
■ Microsoft Visual Studio 2008 正式版支持OpenMP,所以ENABLE_OPENMP这个选项要勾上;如果是Express版本,则不支持OpenMP,所以需要取消ENABLE_OPENMP选项。
■ 最后再点击Generate。



2. 编译 OpenCV Debug 和 Release版本库
完成上一步骤后,将在D:\Program Files\OpenCV2.0\vc2008目录下生成OpenCV.sln的VC Solution File,请用VC++ 2008 Express打开OpenCV.sln,然后执行如下操作:
■ 在Debug下,选择Solution Explorer里的 Solution OpenCV,点右键,运行"Rebuild Solution";如编译无错误,再选择INSTALL项目,运行"Build"。
■ 在Release下,选择Solution Explorer里的 Solution OpenCV,点右键,运行"Rebuild Solution";如编译无错误,再选择INSTALL项目,运行"Build"。
此时,OpenCV的*d.dll文件(for debug)和*.dll文件(for release)将出现在D:\Program Files\OpenCV2.0\vc2008\bin目录中;OpenCV的*d.lib文件(for debug) 和*.lib文件(for release)将出现在D:\Program Files\OpenCV2.0\vc2008\lib目录;头文件*.h出现在D:\Program Files\OpenCV2.0\vc2008\include\opencv中。
至此Microsoft Visual Studio 2008 调用的OpenCV动态库生成完毕。






三、配置Windows环境变量Path
将D:\Program Files\OpenCV2.0\vc2008\bin加入Windows系统环境变量Path中。
加入后,必须注销当前用户或者重新启动才能生效。


四、为Microsoft Visual Studio 2008 配置OpenCV环境
打开Microsoft Visual Studio 2008,菜单 Tools -> Options -> Projects and Solutions -> VC++ Directories。
■ Show directories for选择include files,加入目录 D:\Program Files\OpenCV2.0\vc2008\include\opencv
■ Show directories for选择library files,加入目录 D:\Program Files\OpenCV2.0\vc2008\lib

五、使用OpenCV 2.0 编程
以后每创建一个OpenCV 的Win32 控制台程序,都需要添加依赖的库
■ 选择Solution Explorer里的 “项目名称”,点击鼠标右键,选择Properties;
■ 为项目的Debug配置增加依赖的库:cxcore200d.lib cv200d.lib highgui200d.lib;
■ 为项目的Release配置增加依赖的库:cxcore200.lib cv200.lib highgui200.lib

posted @ 2012-07-15 13:59 wrh 阅读(702) | 评论 (0)编辑 收藏

2012年4月25日

1. 把你的虚拟网卡VMnet8(Win系统的网上邻居里)设置为自动获得IP、自动获得DNS服务器,启用。

 

 

2.

把你虚拟机中操作系统的Editing Auto Ethernet->IPV4 Setting 设置成如上图所示。

有些Linux可以如下设置:“本地连接”也设置为自动获得IP、自动获得DNS服务器(在虚拟机中,右键“本地连接”-双击“Internet 协议”,看看是不是自动的吧!固定IP的也在这里改!)

 

 

3.当然是将虚拟机的上网方式选为NAT咯。

 

 

右键你要设置的虚拟机选“设置”(因为有的不止虚拟一台),在“硬件”中选“以太网”, 将右边的网络连接改为NAT-确定。

 

 

4.点菜单栏里的“编辑”-选“虚拟网络设置”,先将“自动桥接”给去掉(去掉钩钩),再选“DHCP”开启DHCP服务,点“开始”-应用,再按同样的方法开启“NAT”的功能。

 

 

5.最重要的是你的两个服务必须开启:VMware DHCP ServiceVMware NAT Service

 

 

具体操作如下: 开始---设置--控制面板---管理工具---服务,确保 VMware DHCP ServiceVMware NAT Service 服务已经启动

 

 

 

 

 

//====================================另外的方法

 

Ubuntu虚拟机共享主机上网
WinXP+VMware WorkStation+Ubuntu7.10

一.Bridged方式共享上网

1.设置Ubuntu的网络连接方式为Bridged

2.共享ADSL连接
ADSL连接属性中选中“Internet连接共享”,下拉列表中然后选择“本地连接”,系统会自动把“本地连接”设置为192.168.0.1。注意此设置会在断开连接并重启后才生效

3.Ubuntu网络设置

IP:192.168.0.X
网关:192.268.0.1
DNS:192.168.0.1(系统->系统管理->网络->DNS)

二.NAT方式共享上网

1.设置Ubuntu的网络连接方式为NAT
2.开启VMware DHCP Service和VMware NAT Service两个服务
3.Ubuntu中网络设置为自动配置(DHCP)或者手动设置IP及DNS

手动设置方法:

1.XP中ipconfig,得到VMnet8的IP为192.168.93.1

2.Ubuntu中设置网络IP为192.168.93.X(X为3-254,网上很多人说只能是128-254,自动分配时一般也是128,但经验证3-254都行,DNS设置为192.168.93.2

以上方法均经验证,绝无多余步骤。

posted @ 2012-04-25 22:36 wrh 阅读(679) | 评论 (0)编辑 收藏

2012年1月10日

1、 Dump文件放在哪里?

Dump文件不用非要放在你编译出来的位置,你完全可以建立一个新的文件夹来放它。但若不是存放在编译出来的位置,需要将编译生成的PDB文件拷贝到Dump文件目录,或是利用VS2005打开Dump文件后,设置PDB文件路径。



2、 如何恢复当时的现场?

可能你要问,怎么可能,这个dump文件可是用户发给我的,我不可能去用户家里调试吧?这个恢复现场可不是指的非要到那台机器上去,而是要把产生dump文件对应的二进制文件拿到。

但是恢复现场需要所有的二进制文件都要对应,你一定要有导致用户崩溃的那些Exe和DLL。既然是你发布的程序,Exe文件当然你会有。所以这里只考虑DLL就行了。

Dump文件中记录了所有DLL文件的版本号和时间戳,所以你一定可以同过某种途径拿到它。如果你能从用户那里拿到最好,如果不方便,用户不可能用的是我们平常不常用的操作系统,所以找个有对应系统的机器一般都会有。但是记住不仅是文件名称要一致,还要核对版本和时间戳,如果不同一样没有办法用。

如果客户用了某个特殊的补丁怎么办?

其实这个问题也很好解决,只要它不阻碍阅读堆栈,就不用管它,调试Dump和运行程序不一样,缺少一两个DLL没有任何问题。



3、 如果真的需要怎么办?

符号文件现在主要是指PDB文件。

如果没有符号文件,那么调试的时候可能导致堆栈错误。

如果你丢失了这个发布版本中你编译出来的那些exe和DLL的PDB,那么这个损失是严重的,重新编译出来的版本是不能使用的。

我自己的DLL都有了,可是缺的是系统的DLL的对应PDB文件怎么办?图1.4中已经介绍了方法。微软在它的符号数据库上为我们提供了所有的PDB文件,还有部分非关键DLL。设置好后程序将自动下载需要的PDB及DLL文件。



4、 拿到需要的文件了,这些文件应该放在哪里?

符号数据库中的文件不用动,把其它的exe和DLL、PDB文件放在dump文件目录里就行了。



5、 我用的是VS2005,明明有源代码,为什么显示不了?

这个是dump调试的最头痛问题,代码可能已经改过了,即使你从SVN拿到当时的版本,时间戳也是错的,VS2005就是不让你显示代码。其实只要在

Tools/Options,Debugging/General中去掉

Require source files to exactly match the original version的复选就行了。
posted @ 2012-01-10 13:54 wrh 阅读(1783) | 评论 (4)编辑 收藏

前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件。使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置。本文将讨论以下内容:

1  程序编译选项

2  利用VS2005 分析dump文件

3  常见问题讨论

一、       程序编译选项

PDB files contains all debug information like type definition and function prototype. When application crashes, we need the PDB files to analyze the root cause, so make sure these PDB files will be created when building it. You must do the following setting:

C/C++/General/Debug Information Format=Program Database (/Zi).

clip_image001

1.1 调试信息格式

Linker/Debugging/Generate Program Database File=”Name and location of your PDB files”

clip_image002

1.2 PDB文件输出路径

PDB文件路径最好设置在同一个文件夹中,这样方便dmp文件调试时调用。

调试时,所有的PDB文件和源文件必须严格匹配(the PDB files should be the one generated by build the source code),并存储在一个安全的位置。当客户报告了一个错误时,你需要这些文件来帮忙以便定位错误于源代码中并解决问题。

二、       VS2005 分析dump文件

In this simple application, there is an unhandled Access Violation Reading exception, because GetNameFromDatabase returns a NULL pointer, and this pointer is passed into IsPrefix and then it’s used directly without NULL pointer checking.

clip_image003

1.3 演示代码

 

利用Release模式编译该测试程序,在客户机上运行该程序,将根据NTSD设置生成相对应的DMP格式文件。

可以使用Visual Studio.Net、NTSD或是其他的调试工具对DMP格式文件进行分析。

 

l         Start Visual Studio.Net

Click File/Open Solution and make sure the files of type is *.dmp then click Open.

clip_image004

1.3 Open Dump File (GUI)

 

l         Set Symbol Path

Click Tools/Options, Debugging/Symbols,增加PDB文件路径。若调试的程序需要微软基础库的PDB信息,可以增加一个路径为:

http://msdl.microsoft.com/download/symbols

在界面下方Cache Symbol From symbol…选择本地存储这些Symbols的路径。

clip_image005

1.4 Symbol Path

如果DMP文件没有放入本身PDB文件所在目录,也可以在此处增加一个本地目录。点OK后,VS2005将从网络中下载所需要的Symbols,需要等待一段时间。如果是多次调试同一个程序错误所生成的DMP文件,可以在对话框中选择“Search the above locations only when symbols are loaded manually”。从而可以节省网络带宽。

 

l         Set Source code path

Open Solution Property Pages and set the source code path.

clip_image006

1.5 属性菜单

clip_image007

1.6 Debug Source Files

 

l         Start to Debug the Dump File

Click the Debug menu, it will ask you to save as a solution, save it. Then it will go to the line which caused the crash of your application.

clip_image008

1.7 调试窗口,定位到源代码

 

三、       常见问题讨论

1  Dump文件放在哪里?

Dump文件不用非要放在你编译出来的位置,你完全可以建立一个新的文件夹来放它。但若不是存放在编译出来的位置,需要将编译生成的PDB文件拷贝到Dump文件目录,或是利用VS2005打开Dump文件后,设置PDB文件路径。参照图1.4。

 

2  如何恢复当时的现场?

可能你要问,怎么可能,这个dump文件可是用户发给我的,我不可能去用户家里调试吧?这个恢复现场可不是指的非要到那台机器上去,而是要把产生dump文件对应的二进制文件拿到。

但是恢复现场需要所有的二进制文件都要对应,你一定要有导致用户崩溃的那些ExeDLL。既然是你发布的程序,Exe文件当然你会有。所以这里只考虑DLL就行了。

Dump文件中记录了所有DLL文件的版本号和时间戳,所以你一定可以同过某种途径拿到它。如果你能从用户那里拿到最好,如果不方便,用户不可能用的是我们平常不常用的操作系统,所以找个有对应系统的机器一般都会有。但是记住不仅是文件名称要一致,还要核对版本和时间戳,如果不同一样没有办法用。

如果客户用了某个特殊的补丁怎么办?

其实这个问题也很好解决,只要它不阻碍阅读堆栈,就不用管它,调试Dump和运行程序不一样,缺少一两个DLL没有任何问题。

 

3  如果真的需要怎么办?

符号文件现在主要是指PDB文件。

如果没有符号文件,那么调试的时候可能导致堆栈错误。

如果你丢失了这个发布版本中你编译出来的那些exe和DLL的PDB,那么这个损失是严重的,重新编译出来的版本是不能使用的。

我自己的DLL都有了,可是缺的是系统的DLL的对应PDB文件怎么办?图1.4中已经介绍了方法。微软在它的符号数据库上为我们提供了所有的PDB文件,还有部分非关键DLL。设置好后程序将自动下载需要的PDB及DLL文件。

 

4  拿到需要的文件了,这些文件应该放在哪里?

符号数据库中的文件不用动,把其它的exe和DLL、PDB文件放在dump文件目录里就行了。

 

5  我用的是VS2005,明明有源代码,为什么显示不了?

这个是dump调试的最头痛问题,代码可能已经改过了,即使你从SVN拿到当时的版本,时间戳也是错的,VS2005就是不让你显示代码。其实只要在

Tools/OptionsDebugging/General中去掉

Require source files to exactly match the original version的复选就行了。

posted @ 2012-01-10 13:53 wrh 阅读(757) | 评论 (0)编辑 收藏

2011年10月21日

映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”,就像一种只有两列的表格,一列是关键字,一列是数据项,它们是一一对应的。关键字是唯一的,给出一个关键字,映射表类会很快找到对应的数据项。映射表的查找是以哈希表的方式进行的,因此在映射表中查找数值项的速度很快。映射类最适用于需要根据关键字进行快速检索的场合,我们的程序中就用映射表来保存计时器标志值和类实例指针,用计时器的标志值作为关键字。 他这个有点像数组,比如你要查找a[index],不必先遍历前面的index个元素,只不过数组的下标是哈希表键值,它是以键值对的形式出现的。举个例子来说吧,公司的所有职员都有一个工号和自己的姓名,工号就是姓名的关键字,给出一个工号,就可以很快的找到相应的姓名。
        举例如下:
1、定义一个CMAP,向这个CMAP中增加数据项(键-值对)。
CMap<CString, LPCTSTR, CString, LPCTSTR>m_ItemMap;
CString strKey = _T(""), str = _T("");
int i;
for(i = 0; i < 5; i++)
    {
        strKey.Format("%d", i);             
//这个是键
        str.Format("A%d", i);              
//键对应的
        m_ItemMap.SetAt(strKey, str);
    }
2、遍历正个CMAP的常用方法。
    POSITION pos = m_ItemMap.GetStartPosition();
    while(pos)
    {
        m_ItemMap.GetNextAssoc(pos, strKey, str);
        cout<< strKey<< ":"<< str<< endl;
    }
3、在CMAP中查找相应的数据项。
    CString pReset;
    if(m_ItemMap.Lookup("1", pReset))
    {
        cout<<pReset<<endl;
    }


=======================================================================现在,我们来学习MFC中,最常用的数据结构中的最后一个CMap模板。之前,我们已经依次学完了CArray,CList,并且也对它们进行了初步的剖析。

其实,我一直认为CMap是最简单的一个数据类型,如果说,大家对这个数据类型产生不良感觉的话,大多是因为对Hash表的陌生。

显然,CMap就是对Hash表的一种实现。对于Hash表来说,我们需要提供成对的Key与Value进行操作,其实,也就是将我们日常使用的数组下标替换成现在Key,至于MFC是采用了什么样的散列函数,我们不必知道。

Hash表可以认为是数组的一种优化,或者说是对数组缺陷的一种弥补,因为我们知道,数组在具备了高效存取性能的同时,无法动态的调整自身的大小,又严重的影响了它的使用效果。这给了Hash表可乘之机,Hash表总是使用了某种算法尽可能的来达到将成对的元素存储到一个额定的离散的内存空间,它既继承了链表对自身的动态调整,又尽可能的使读写维持在高速的水平,当然无论如何还是要比数组慢的多。

如果你非要让我告诉你,Hash表是什么样的一个数据结构的话,很遗憾,我无法准确的描述,这就相当于你问我“凤凰是什么样子”,不过我可以告诉你孔雀的样子。常用的Hash表非常像一个十字数组,似乎十字数组又成为了众多读者的障碍,如果你暂时还不能理解的话,请你去翻阅Hash表的详细论述,当然你也可以在不久之后,在本处看到这些经典数据结构的精讲。

现在,我们来看一个CMap的用法,至于它的参数,你可以看本空间一篇专门描述CArray,CList以及CMap参数用法的文章《CArray,CList,CMap如何实化(实例化)》。下面是我自己编写的例子:

class Point

{

public:

    Point()

    {

        m_x = 0;

        m_y = 0;

    }

    Point(int x, int y)

    {

        m_x = x;

        m_y = y;

    }

public:

    int m_x;

    int m_y;

};

typedef CMap<const char*, const char*, Point, Point&>     CMapPnt; //请在使用之前定义

int main()

{

    Point elem1(1, 100), elem2(2, 200), elem3(3, 300), point;

    CMapPnt mp;

    // insert 3 elements into map          #1

    mp.SetAt("1st", elem1);

    mp.SetAt("2nd", elem2);

    mp.SetAt("3th", elem3);

   

    // search a point named "2nd" from map                  #2

    mp.Lookup("2nd", point);

    printf("2nd: m_x: %d, m_y: %d\n", point.m_x, point.m_y);

// insert a new pair into map      #3

Point elem4(4, 400);

mp["4th"] = elem4;

cout<<"count: "<<mp.GetCount()<<endl;

// traverse the entire map                    #4

size_t index = 0;

const char* pszKey;

POSITION ps = mp.GetStartPosition();

while( ps )

{  

mp.GetNextAssoc(ps, pszKey, point);

printf("index: %d, m_x: %d, m_y: %d\n", ++index, point.m_x, point.m_y);

}

return 0;

}

代码中,我已经给出了一些注释,我同样建议读者们,用英文在代码中注释,这样的好处实在是太多了。尤其在代码需要在不同编码的操作系统上调试的时候。

对于CMap这个类,我不得不着重啰嗦一下的是:遍历操作以及取下标【】操作,当然还有那个令很多人困惑不已的ARG_KEY到底应该如何选择的问题。

遍历,看注释#4,至于POSITION的含义,请在本空间,查看其它文章。先使用GetStartPosition()函数获得表头的位置,然后,我们可以使用GetNextAssoc函数来遍历。GetNextAssoc(POSITION& rNextPosition, KEY& rKey, VALUE& rValue)函数的参数值得说明一下,大家看到,3个参数都是引用,而第一个是rNextPosition,顾名思义,在函数返回之后,它将会指像下一个元组,当然这是在表还未遍历完的时候,否则,它将被置为空(NULL)。

【】,利用下标取元素的这个操作符,在CMap中被重载,用来返回指定Key值数据的引用,不过在注释#3处,对于先取"4th"这个Point的引用然后赋值的用法,看起来,似乎有点聪明过了头,因为在这之前,我们还没有插入"4th"所对应的元组,但是,程序却能正常的运行!为什么?其实,这样的用法是十分正确的,因为CMap毕竟不是数组,它是没有边界的,当CMap在获得一个它无法查询到的Key值的时候,它会将这个Key以及一个空的数据类型追加到Hash表中去,从而保证了上面的程序可以无误的运行。

我们已经说过,ARG_KEY是作为类型参数传入CMap的,但并不是任何类型都可以作为ARG_KEY传入的。为什么?看样子,这次不得不简单的说说Hash表的散列函数了。每个Hash表,总会使用一些散列函数,用来查找Key所对应的Value,理想状态下,我们当然希望Hash表,就是一个数组,虽然这不可能,不过这样理解,可以帮助我们更好的理解Hash表的物理结构,就让我们暂时把它看成一个数组吧。数组总是使用下标来直接获取元素的存储地址,而下标,显然应该是个非负整数,从而Hash表,也应该具备这样的特性,至少必须存在某种算法可以使传入的Key可以直接的转化为一个非负的整数,这也就是ARG_KEY的选择标准。从而对象、引用无论如何都不应该作为ARG_KEY成为CMap的类型参数,而int、unsigned int、指针以及地址就成为了ARG_KEY的常用类型参数,其实也就是那些类似于整型的数据类型。常常看到一些人在用CMap的时候,试图使用CString作为CMap中ARG_KEY的类型参数,这是应该被纠正的方向性错误,但有些人似乎会理直气壮的反驳我,因为他们发现类型参数KEY是可以使用CString的,这很奇怪吗?我说过KEY不能使用CString吗?之所以KEY可以使用CString而ARG_KEY却用的是LPCTSTR,那是因为CString重载了operator==(const char*)这个判等操作符,当CMap从Hash表中获得KEY之后,它会将ARG_KEY与KEY直接相比较。真正存于CMap内部的是KEY,也就是CString。这也就是为什么,我们经常会看到CMap被实化成CMap<CString, LPCTSTR/*相当于const char*,非Unicode情况下*/, CString,CString&>这样的一个四不像实化类的原因,至于CMap的效率优化问题,我们会在以后的文章中继续与大家探讨。

CMap的确是个很不错的数据结构,尤其在你建立一个字典的时候。比如idealsoft的含义是"曳光科技",这就是一个元组,也就是一个Pair,Key是"idealsoft",而Value是"曳光科技"。

====================================================================
#include   <afxwin.h>
#include   <afxtempl.h>
void   main()
{
AfxWinInit(::GetModuleHandle(NULL),   NULL,   ::GetCommandLine(),   0);
CMap <int,   int,   CString,   CString>   m_cMap;
m_cMap.SetAt(9923033,     "张三 ");
m_cMap.SetAt(9826033,     "张A ");
m_cMap.SetAt(9923063,     "张B ");
m_cMap.SetAt(9923093,     "张C ");
CString   strName;
m_cMap.Lookup(9923063,   strName);
AfxMessageBox(strName);
}


posted @ 2011-10-21 09:38 wrh 阅读(18913) | 评论 (0)编辑 收藏

2011年8月26日

COLORMAP   ColorMap[3]   =   {  
{   RGB(128,128,128),   ::GetSysColor(COLOR_BTNSHADOW)   },  
{   RGB(192,192,192),   ::GetSysColor(COLOR_BTNFACE)   },  
{   RGB(255,255,255),   ::GetSysColor(COLOR_BTNHILIGHT)}  
};  

CBitmap   Bitmap;  
Bitmap.LoadMappedBitmap(IDB_BITMAP,   0,   ColorMap,   3);


BOOL   LoadMappedBitmap(
                UINT   nIDBitmap,                               //位图的标识
                UINT   nFlags   =   0,                     //通常情况下为0,当将该位图作
        为屏蔽位图使用时该参数为CMB_MASKED
                LPCOLORMAP   lpColorMap   =   NULL,  
                int   nMapSize   =   0);

【返回值】该成员函数调用成功返回一个非零值,否则返回零。
【参   数】
        nIDBitmap
           
      nFlags

通常情况下为0,当将该位图作为屏蔽位图使用时该参数为CMB_MASKED。

lpColorMap

一个指向COLORMAP数据类型数组的指针。COLORMAP的数据结构如下:

typedef   struct   _COLORMAP{

COLORREF   from;   //   逻辑调色板的颜色

COLORREF   to;   //   物理调色板的颜色

}COLORMAP,   FAR*   LPCOLORMAP;

nMapSize

指定数组中数组元素的个数。

【注   释】本成员函数可以将一个设备无关位图装入CBitmap类的对象,并根据逻辑调色板与物理调色板的映射关系使系统正确地显示该位图。


_COLORMAP   iColor[2]={{RGB(191,191,196),::GetSysColor(COLOR_3DFACE)},{RGB(192,192,192),::GetSysColor(COLOR_3DFACE)}};
m_bmToolbarHi.LoadMappedBitmap(   IDB_TOOLBARHI,0,iColor,2);
        m_wndToolBar.SetBitmap(   (HBITMAP)m_bmToolbarHi   );
这是我的代码,可他不工作啊:~(

有个问题提醒一下:
库中的LoadMappedBitmap函数对超过256色的图像好像无效,而且会死掉。
对不超过256色的图像是有效的。

我知道了,我的图像是256色的,这不错。但是转换的颜色好像也算一种颜色。我把我导出的图像色数改成128,结果就好了   :D

posted @ 2011-08-26 14:59 wrh 阅读(2316) | 评论 (0)编辑 收藏
仅列出标题  下一页

导航

<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

常用链接

留言簿(19)

随笔档案

文章档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜