分类: 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),
也可以自己生成