Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1676226
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2009-07-15 09:45:21

 真彩色工具栏和可视的拖拽操作 收藏

今天总结两个MFC界面处理的问题:
1.  真彩色工具栏
2.  如何实现可视的拖拽操作
===============================真彩色工具栏=========================================
   
经过多次实践, 总结出关于工具栏的一些编程体会:

1. 更高位的色彩的支持

   对工具栏而言, 图标都保存在图象列表中,而对于这个图象列表, 自然是不能从 工具栏 资源中获得. 而要手动创建和设置
 
   CImageList  img;
   img.Create(44, 40, ILC_COLOR32 | ILC_MASK , 8, 2); 

   CImageList::Create几个重载函数中,只有这个生成的列表能提供对16位色以上色彩的支持.
     其他的几个同名函数, 采用默认方式创建的图象列表只支持16色(会丢失一些颜色)


   下一步就是向图象列表中添加图标或位图 
   CBitmap bmp;
   bmp.LoadBitmap(IDB_TOOLBAR01);   
   img.Add(&bmp, RGB(255,0,255));  // 不要埋怨为什么必须用MFC类CBitmap, CImageList本身就是MFC类型
   
   img.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); // 这是添加图标

     另外, 在参考了MSDN 2003的例子mfcie 里面使用Rebar和toolbar的代码后,   可以通过修改REBARBANDINFO 结构体实现对工具条的背景图;   这样我们的工具栏就具有了 "自定义背景位图" 和 "24/32位真彩色图标" 两种特性. 不过遗憾的是引入了Rebar,  这也可能不像我们原来期望那样,  并不是一个简单的派生类的替换就可以了. 但是这也是十分可靠的一种方案.

2. 应用到工具栏中

   CToolBar的一个成员函数 GetToolBarCtrl, 如下:
   m_wndToolBar.GetToolBarCtrl().SetImageList(&img);        // 设置normal状态的图象列表
   m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);     // 设置hot 状态的图象列表
   m_wndToolBar.GetToolBarCtrl().SetDisabledImageList(&img) // 设置Disabled 状态的图象列表

3. 添加对应的Button
   m_wndToolBar.SetButtons(NULL, 13);
   m_wndToolBar.SetButtonInfo(0, ID_APP_ABOUT, TBSTYLE_BUTTON, 0);
   m_wndToolBar.SetButtonInfo(1, ID_VIDEORECT1, TBSTYLE_CHECK, 1);
   m_wndToolBar.SetButtonInfo(2, ID_VIDEORECT1, TBSTYLE_CHECKGROUP, 2);
   m_wndToolBar.SetButtonInfo(3, ID_VIDEORECT1, TBSTYLE_CHECKGROUP, 2);

===============================可视的拖拽操作========================================
1. 主要函数
   CImageList* pImageList;
   pImageList = CreateDragImage(hItem);                   // 这是个new操作,用后要delete

   CImageList::BeginDrag( int nImage, CPoint ptHotSpot);  // 非静态成员函数
   CImageList::DragEnter( CWnd* pWnd, CPoint pt);
   SetCapture();

   CImageList::DragMove(pt);       // WM_MOUSEMOVE处理函数中调用

   CImageList::DragLeave(NULL);    // WM_LBUTTONUP处理函数中调用
   CImageList::EndDrag();
   ReleaseCapture();

2. 需要了解的是除了成员函数BeginDrag以外,列出的CImageList的其他成员函数都是static类型.
   静态函数可以在没有对象存在的情况下使用; CImageList对象可以利用控件的成员函数生成默认的(如CTreeCtrl),
   也可以自己生成
 

阅读(1243) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~