MFC中怎么显示一副图片使其背景透明
包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码位图,另一种是动态生成掩码位图。本文将介绍动态生成掩码位图绘制具有透明区域位图的方法。
一、TransparentBlt 函数的使用
TransparentBlt 函数在Windows98/Windows2000以上版本运行,系统中需要包含 Msimg32.dll,使用时可以链接 Msimg32.lib。
Windows98下的TransparentBlt会产生资源泄漏,所以不建议在WIN98下使用该函数。
TransparentBlt函数原型如下:
BOOL TransparentBlt(HDC hdcDest, // 目标DCint nXOriginDest, // 目标X偏移int nYOriginDest, // 目标Y偏移int nWidthDest, // 目标宽度int hHeightDest, // 目标高度HDC hdcSrc, // 源DCint nXOriginSrc, // 源X起点int nYOriginSrc, // 源Y起点int nWidthSrc, // 源宽度int nHeightSrc, // 源高度UINT crTransparent // 透明色,COLORREF类型);使用示例:
CBitmap FootballBMP;
FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);
CDC ImageDC;
ImageDC.CreateCompatibleDC(pDC);
CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);
TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));//RGB(0,0,0xff)改成你的背景颜色
ImageDC.SelectObject(pOldImageBMP);
C++ MFC关于Create函数
原型为:
BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );
其中各项参数的含义为:
cx定义图像的宽度,单位为象素;
cy定义图象的高度,单位为象素;
nFlags确定建立图像列表的类型,能够是以下值的组合:ILC_COLOR、ILC_COLOR4、ILC_COLOR8、ILC_COLOR16、ILC_COLOR24、ILC_COLOR32、ILC_COLORDDB和ILC_MASK;
nInitial用来确定图像列表包含的图像数量;
nGrow用来确定图像列表可控制的图像数量。
问个VC中cimagelist的问题
看一下MSDN便知,cimagelist::Create()函数共有5种重载形式,你用的是BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow )这种。其中nInitial的解释是Number of images that the image list initially contains,大意应该是“最初列出的图像张数”;nGrow的解释是
Number of images by which the image list can grow when the system needs to resize the list to make room for new images. This parameter represents the number of new images the resized image list can contain,大意应该是“图像的图像列表可以增长时,系统需要调整,以腾出空间给新的图像列表的数目。此参数表示新的图像调整大小的图像列表可以包含的数量”。
关于JAVA中super的用法问题,百思不得其解。
错误的原因:①super(name);这条语句是调用父类的(button)具有一个参数的构造方法。(参数name其实就是这个Button按钮的名字)而super(name);语句只能放在构造方法的第一行。②没有具有一个参数的构造方法。修改后的代码:import java.awt.AWTEvent;import java.awt.Button;import java.awt.Frame;import java.awt.event.MouseEvent;class TEST24 extends Button {private TEST24 friend;public void setfriend(TEST24 friend) {this.friend = friend;}public TEST24(String name) {super(name);enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);}protected void processMouseMotionEvent(MouseEvent e) {setVisible(false);friend.setVisible(true);}}public class TEST25 {public static void main(String[] args) {TEST24 btn1 = new TEST24("I LOVE YOU!");TEST24 btn2 = new TEST24("I LOVE YOU!");btn1.setfriend(btn2);btn2.setfriend(btn1);btn1.setVisible(true);btn2.setVisible(true);Frame f = new Frame("北京欢迎你!");f.add(btn1, "North");f.add(btn2, "South");f.setSize(300, 300);f.setVisible(true);btn1.setVisible(false);}}
MFC 中CListCtrl控件的作用
这个推荐你看微软的MSDN里面最详细 其它给一点参考 在 VC中使用控件一直是件让我头痛的事件,从控件的创建到控件的操作管理,都得写一大堆代码,相比于Delphi/VB,实在是麻烦多了。其实在之前学习 SDK的时候,就有想过专门花点儿时间来学习VC中控件的使用,但一直没空。最近准备写一个小工具,要用到ListCtrl控件,所以又不得不好好的恶补 一翻。我是在MFC的对话框模式下使用CListCtrl控件的,其实不管在SDK或文档/视图模式下,VC控件的使用都差不多,下面来好好的写写CListCtrl控件的使用笔记。一、CListCtrl控件的创建由于我是在MFC的对话框模式下使用CListCtrl控件的,所以只需要在控件栏上选择CListCtrl的图形按钮,接着添加到对话框中就行了。二、CListCtrl控件样式的设置第一步:在使用CListCtrl控件之前,首先需要为该控件关联一个变量(只针对于对话框模式):
CListCtrl m_BlogAccountList;第二步:由于CListCtrl控件要做一些初始化操作,比如设置控件样式,设置控件的行列并填入一些数据。初始化操作的代码是在对话框的OnInitDialog事件中写入的。默 认情况下,CListCtrl控件的样式是非常简陋的,大多情况下我们都需要对CListCtrl控件的样式进行修改,比如设置为报表样式,可以进行整行 选择等,如有需要还有调整CListCtrl控件的行高。诸如这些设置都需要用到CListCtrl控件的扩展样式,所以首先得了解这些扩展样式。我在MSDN中没有找到CListCtrl控件的扩展样式资料,只好上百度百科找了找。CListCtrl控件的扩展样式
LVS_EX_GRIDLINES //绘制表格线
LVS_EX_SUBITEMIMAGES//子项目图标列表
LVS_EX_CHECKBOXES //带复选框
LVS_EX_TRACKSELECT //自动换行
LVS_EX_HEADERDRAGDROP//报表头可以拖拽
LVS_EX_FULLROWSELECT //选择整行
LVS_EX_ONECLICKACTIVATE//单击激活
LVS_EX_TWOCLICKACTIVATE//双击激活
LVS_EX_FLATSB//扁平滚动条
LVS_EX_REGIONAL
LVS_EX_INFOTIP
LVS_EX_UNDERLINEHOT
LVS_EX_UNDERLINECOLD
LVS_EX_MULTIWORKAREAS//多工作区对话框模式下创建的CListCtrl控件样式只有一个,就是WS_BORDER,而我需要为CListCtrl设置为报表样式,并能选择整行,下面就可以开始写代码了://通过GetWindowLong来获取CListCtrl已有的样式
DWORD dwStyle = GetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE);//在原有样式的基本上,添加LVS_REPORT扩展样式
SetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE, dwStyle|LVS_REPORT); //获取已有的扩展样式
DWORD dwStyles = m_BlogAccountList.GetExStyle();//取消复选框样式
dwStyles &= ~LVS_EX_CHECKBOXES;//添加整行选择和表格线扩展样式
m_BlogAccountList.SetExtendedStyle(dwStyles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);通过以上四句代码,就已经能满足我的需求了。三、为CListCtrl控件添加列列的添加只需要用到LVCOLUMN结构体,所以需要先行了解了解。在MSDN中查到的LVCOLUMN结构体的定义如下:typedef struct _LVCOLUMN {
UINT mask;
int fmt;
int cx;
LPTSTR pszText;
int cchTextMax;
int iSubItem;
#if (_WIN32_IE >= 0x0300)
int iImage;
int iOrder;
#endif
} LVCOLUMN, FAR *LPLVCOLUMN; 该结构体共有8个成员。mask是用来设置LVCOLUMN结构体中哪些成员有效,其值可以为0。mask可设置的值如下:LVCF_FMT fmt成员有效
LVCF_IMAGE iImage成员有效
LVCF_ORDER //以下略
LVCF_SUBITEM
LVCF_TEXT
LVCF_WIDTH fmt成员是对CListCtrl控件列标题进行设置,比如列标题中文字的对齐方式,是否在列标题中显示图标等。cx成员是设置列宽。pszText成员是设置列标题文字cchTextMax成员是设置标题文字的缓冲区大小iSubItem成员是设置列索引iImage成员是设置ImageList中的图像索引。iOrder成员的作用未知。下面进行添加列操作:char *szColUmn[] = {"帐号", "密码"};
int nColWidth[] = {100, 100};
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
lvc.fmt = LVCFMT_LEFT; //左对齐
for (int i = 0; i < 2; i++)
{
lvc.pszText = szColUmn[i];
lvc.iSubItem = i;
lvc.iOrder = i;
lvc.cx = nColWidth[i];
m_BlogAccountList.InsertColumn(i, &lvc);}四、为CListCtrl控件添加行
添加行的操作需要用到InsertItem和SetItemText属性,这个简单,就不详述了,看代码:m_BlogAccountList.InsertItem(0, "abc");
m_BlogAccountList.SetItemText(0, 1, "abc");
m_BlogAccountList.SetItemText(1, 1, "123");