我是靠谱客的博主 舒服水池,最近开发中收集的这篇文章主要介绍标签超出图像控件c语言,VC++标签控件之图像标签控件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、创建新工程

0818b9ca8b590ca3270a3433284dd417.png

二、编辑对话框资源

1、添加控件

0818b9ca8b590ca3270a3433284dd417.png

2、添加位图

点“插入”,点“资源”,

0818b9ca8b590ca3270a3433284dd417.png

编辑位图:

0818b9ca8b590ca3270a3433284dd417.png

三、添加变量

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

四、添加代码(红色部分)

BOOL CCImageListDlg::OnInitDialog()

{

CDialog::OnInitDialog();

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

SetIcon(m_hIcon, TRUE);    // Set big icon

SetIcon(m_hIcon, FALSE);   // Set small icon

// TODO: Add extra initialization here

m_imagelist.Create(24,24,ILC_COLOR24|ILC_MASK,1,0);

m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));

m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));

m_tab.SetImageList(&m_imagelist);

m_tab.InsertItem(0,"标签1",0);

m_tab.InsertItem(1,"标签2",1);

return TRUE; // return TRUE unless you set the focus to a control

}

五、编译

六、运行

0818b9ca8b590ca3270a3433284dd417.png

七、函数说明

1、CImageList::Create函数声明

BOOL Create(int cx,int cy,UINT nFlages,int nInitial,int nGrow)

2、CImageList::Add函数声明

int Add(CBitmap* pbmImage,CBitmap* pbmMask)

3、CTabCtrl::SetImageList函数声明

CImageList*SetImageList(CLmageList* pImageList)

pImageList:指向图像列表的指针

功能:将一个图像列表与tab控件相关联

4、AfxGetApp()函数声明

CWinApp*AfxGetApp()

功能:产生一个指向CWinApp类对象的指针

int Add(CBitmap* pbImage,COLORREF crMask)

int Add(HICON hIcon)

pbmImage:指向一包含位图图像的指针

pbmMask:包含掩码的位图的指针

crMask:    用于产生掩码的颜色

hIcon:       指向位图的句柄

功能:         将一到数幅图片插入到图像列表控件中。创建成功则返回图像在列表中的索引;否则返回“-1”。

附录:

使用 picture 控件动态显示图片方法

一 控件适应于图片尺寸

添加一个 picture 控件,修改 ID 为 IDC-PICTURE, 并添加一 CBitmap m_bmp 成员变量

在 OnInitDialog() 函数中添加如下代码

if(m_bmp.m_hObject!=NULL) m_bmp.DeleteObject();

// 以绝对路径加载 BMP 图片

HBITMAP hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"1.bmp",IMAGE_BITMAP,

0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE);

if(hbmp==NULL) return false;

// 获得加载位图的文件信息

m_bmp.Attach(hbmp);

DIBSECTION ds;

BITMAPINFOHEADER &bminfo=ds.dsBmih;// 获得位图信息图

m_bmp.GetObject(sizeof(ds),&ds);

int cx=bminfo.biWidth;// 获得位图宽度

int cy=bminfo.biHeight;// 获得位图高度

// 该段程序根据图象的宽和高,调整控件大小,让它正好显示一张图片

CRect rect;

GetDlgItem(IDC_PICTRUE)->GetWindowRect(&rect);// 获得控件所在矩形区域

ScreenToClient(&rect);

GetDlgItem(IDC_PICTRUE)->MoveWindow(rect.left,rect.top,cx,cy,true);     // 调整控件大小

在 OnPaint() 函数中添加如下代码

// 三种方法获得 pictrue 控件 DC ,图象将被绘制在控件上

CPaintDC dc(GetDlgItem(IDC_PICTRUE));

//CPaintDC dc(this);

//CDC dc;

//dc.m_hDC=::GetDC(NULL);

CRect rcclient;

GetDlgItem(IDC_PICTRUE)->GetClientRect(&rcclient);

CDC memdc;

memdc.CreateCompatibleDC(&dc);

CBitmap bitmap;

bitmap.CreateCompatibleBitmap(&dc,rcclient.Width(),rcclient.Height());

memdc.SelectObject(&bitmap);

CWnd::DefWindowProc(WM_PAINT,(WPARAM)memdc.m_hDC,0);

CDC maskdc;

maskdc.CreateCompatibleDC(&dc);

CBitmap maskbitmap;

maskbitmap.CreateBitmap(rcclient.Width(),rcclient.Height(),1,1,NULL);

maskdc.SelectObject(&maskbitmap);

maskdc.BitBlt(0,0,rcclient.Width(),rcclient.Height(),&memdc,rcclient.left,rcclient.top,SRCCOPY);

CBrush brush;

brush.CreatePatternBrush(&m_bmp);

dc.FillRect(rcclient,&brush);

dc.BitBlt(rcclient.left,rcclient.top,rcclient.Width(),rcclient.Height(),&memdc,

rcclient.left,rcclient.top,SRCPAINT);

brush.DeleteObject();

二 图片适用于控件尺寸

添加一个 picture 控件,修改 ID 为 IDC-PICTURE

在 OnPaint() 函数中添加如下代码

CWnd *pWnd=GetDlgItem(IDC_PICTRUE);// 获得 pictrue 控件窗口的句柄

CRect rect;

pWnd->GetClientRect(&rect);   // 获得 pictrue 控件所在的举行区域

CDC *pDC=pWnd->GetDC();   // 获得 pictrue 控件的 DC

IStream *pStm;

CFileStatus fstatus;

CFile file;

LONG cb;

IPicture *pPic;                      // 定义显示图片的接口(可显示 jpg 格式图片)

CString m_sPath="1.BMP";  // 设置想要显示的图片

// 打开图象文件,获取文件字节数

if(file.Open(m_sPath,CFile::modeRead) && file.GetStatus(m_sPath,fstatus)

&& ((cb=fstatus.m_size)!=-1))

{

// 分配全局存储空间

HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);

LPVOID pvData=NULL;

if(hGlobal!=NULL)

{

// 锁定分配内存块

if((pvData=GlobalLock(hGlobal))!=NULL)

{

// 读入文件到内存缓冲区

file.ReadHuge(pvData,cb);

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal,true,&pStm);

}

}

}

// 装载图象文件

if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))

{

OLE_XSIZE_HIMETRIC hmWidth;

OLE_XSIZE_HIMETRIC hmHeight;

pPic->get_Width(&hmWidth);     // 获得图象真实宽度

pPic->get_Height(&hmHeight);    // 获得图象真实高度

// 在控件上显示图片    pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL);

pPic->Release();

}

图片显示通用模块

首先为类添加如下两个函数和一个成员变量 IPicture* m_pPicture;

// 图片加载函数

HRESULT   LoadFromBuffer(BYTE *pBuff, int nSize)

{

bool bResult=false;

HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,nSize);// 分配内存空间

void *pData=GlobalLock(hGlobal);// 定义图象数据指针

memcpy(pData,pBuff,nSize);

GlobalUnlock(hGlobal);// 释放内存空间

IStream *pStream=NULL;// 定义数据流指针

// 创建数据流

if(CreateStreamOnHGlobal(hGlobal,TRUE,&pStream)==S_OK)

{

HRESULT hr;// 定义返回结果

if((hr=OleLoadPicture(pStream,nSize,FALSE,IID_IPicture,(LPVOID*)&m_pPicture))==S_OK)

bResult=true;

pStream->Release();// 释放数据流

}

return bResult;

}

// 图片显示函数

BOOL   DrawFromFile(CString filename, CDC *pDC)

{

CFile cFile;

CFileException e;

// 打开文件

if(cFile.Open(filename,CFile::modeRead | CFile::typeBinary,&e))

{

BYTE *pBuff=new BYTE[cFile.GetLength()];// 定义分配内存

if(cFile.Read(pBuff,cFile.GetLength())>0)// 将文件读入缓存

LoadFromBuffer(pBuff,cFile.GetLength());

delete []pBuff;// 释放缓存

long hmWidth,hmHeight;

m_pPicture->get_Width(&hmWidth);

m_pPicture->get_Height(&hmHeight);// 获取图片尺寸

int nWidth=MulDiv(hmWidth,pDC->GetDeviceCaps(LOGPIXELSX),2540);

int nHeight=MulDiv(hmHeight,pDC->GetDeviceCaps(LOGPIXELSX),2540);

// 在内存中画

CDC MenDC;

CBitmap bmp;

bmp.CreateCompatibleBitmap(pDC,nWidth,nHeight);

MenDC.CreateCompatibleDC(NULL);

MenDC.SelectObject(&bmp);

m_pPicture->Render(MenDC.m_hDC,0,0,nWidth,nHeight,0,hmHeight,hmWidth,-hmHeight,NULL);

// 将内存中画拷贝到目的地

pDC->BitBlt(0,0,nWidth,nHeight,&MenDC,0,0,SRCCOPY);

}

return true;

}

然后在 OnPaint() 函数中显示

void CDialogDlg::OnPaint()

{

CPaintDC dc(this); // device context for painting

if (IsIconic())

{

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CString filename;

filename="1.bmp";

DrawFromFile(filename,&dc);

CDialog::OnPaint();

}

}

最后

以上就是舒服水池为你收集整理的标签超出图像控件c语言,VC++标签控件之图像标签控件的全部内容,希望文章能够帮你解决标签超出图像控件c语言,VC++标签控件之图像标签控件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部