网站首页

家园论坛

老版论坛

家园博客

业界新闻

技术文档

下载中心

速查中心

图片中心

硬件资讯
上一篇:让你的软件界面更漂亮(四) 下一篇:让你的软件界面更漂亮(五)
让你的软件界面更漂亮(六)

来源: 作者: 添加日期:2007-10-31 15:13:45 点击次数:

实现彩色图片到单色位图转换的语句为:

hbitmap = (HBITMAP) CopyImage(hbitmap, IMAGE_BITMAP,0, 0,LR_COPYDELETEORG|LR_MONOCHROME);

我也写了一个实现彩色图片到单色位图转换算法,其代码如下:

//这是本人写的一个转换算法。效果好,但运行时间稍长
HBITMAP BitmapColorToGray(CDC* pDC,HBITMAP hBitmap)
{
      BITMAP bmpInfo;

      ::GetObject(hBitmap,sizeof(BITMAP),&bmpInfo);

      if(pDC)
      {
            CDC memDC;

            if( !memDC.CreateCompatibleDC(pDC) )
            {
                  return NULL;
            }

            HBITMAP oldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);

            DWORD   r,g,b;   

            for (int H =0; H <= bmpInfo.bmHeight; H++)   
            {
                  for(int W = 0; W <= bmpInfo.bmWidth; W ++)   
                  {   
                        r = GetRValue(memDC.GetPixel(W,H));   
                        g = GetGValue(memDC.GetPixel(W,H));   
                        b = GetBValue(memDC.GetPixel(W,H));   
                        r = (r * 3 + g * 6 +  g) / 10;   
                        g   =   r;   
                        b   =   g;   
                        memDC.SetPixel(CPoint(W,H),RGB(r,g,b));
                  }
            }

            hBitmap = (HBITMAP)memDC.SelectObject(oldBitmap);

            memDC.DeleteDC();
      }

    return hBitmap;           
}

3.MyListCtrl 要包含丰富的用户信息(如 ID,NAME 、IP Address 、视频可用 ,手机短消息等用户信息)

QQ 的ListCtrl 包含了很多信息,如在线用户和不在线用户的头象不同,有视频设备的用户还会显示标志,开通了手机短消息功能的也会显示标志,等等。这是如何实现的?找MSDN分析CListCtrl 发现,有两个函数SetItemData(int nItem,DWORD dwData),和

DWORD GetItemData(int nItem),非常有用,这个32位 data 做几个标志还是不错的,但还是无法表达更多的东东。如果把这32位 data作为外部结构的地址是否可行呢?经实验是可行的,但在要外部处理,封装性能不好! 于是定义了一个用户信息的结构。

struct LUSERITEM
{
     CString         szUserID;
     CString         szUserName;
     CString         szIPAddress;
     CString         szServerAddress;
     CString         szNoticeMsg;
     BOOL            bOnline;
     int             nHeadImageIndex;

     //根据需要可增加信息
};

再定义一个链表,用来管理用户信息的结构,如查找,增加,删除等操作。

在头文件中添加

#include <dequ>
typedef std::deque<LUSERITEM> DEQUELVITEM;

二、打开Visual Studio C++ (6.0),新建工程。(本文的目的是实现自绘 ListCtrl 的,实现过程下面会详细介绍)

a. 首先,生成一个新类名为CMyListCtrl. 其基类为CListCtrl. 这部分工作用ClassWizard很容易完成。

b. 添加相关消息及处理函数,OnPaint() ;OnMouseMove();OnHScroll();OnVScroll等,这部工作用ClassWizard同样很容易完成。编译通过后,接着往下看。

c. 在.h文件顶部定义用户信息结构struct LUSERITEM

d. 在.h文件顶部定义一些常量标志

#define       TVS_VIDEO             0x00000001 //有视频设备标志
#define       TVS_MOBILEMSG         0x00000002 //可用手机SMS标志
#define       TVS_NETDISK           0x00000004 
#define       TVS_LEADER            0x00000008
#define       TVS_VICELEADER        0x00000010
#define       TVS_ONLINEUSER        0x00000020

本新闻共3页,当前在第2页  1  2  3  

 
设为首页 | 加入收藏 | 业务办理 | 友情链接 | 论坛版面 | 浙ICP备07502118号 |