vc打开多个图片 然后点击按钮显示下一张 或上一张

作者&投稿:劳羽 (若有异议请与网页底部的电邮联系)
vc 点击按钮显示图片 然后点击另一个按钮显示 另一张图片()小白一枚求各位大大 帮助~

两个按钮控件,一个picture box控件,关联变量m_PictScene
两个按钮的相应函数均为如下形式
HBITMAP hBitmap;
hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),_T("BMP//sky.bmp"),IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
if (hBitmap!=NULL)
{
m_PictScene.SetBitmap(hBitmap);
}

图像处理,使用VC6简单做容易,复杂做,涉及太多算法和图形学的东西,具体问题要具体分析。
最简单的:CDC类的BitBlt就是MFC下专门用来操作位图的,将两张位图分别导入到CBitmap做成内存DC后,一次BitBlt到设备DC上,就完成了图片的叠加,叠加效果,由BitBlt函数的光栅代码参数决定,详细看这个函数的帮助(内容不少),可以熟悉不同的叠加方式。(还有相关函数TransparentBlt等)
再复杂的,就需要用其它图形图像库了,比如OpenGL等,都有相关的功能算法。

PictureControl就是类CStatic,下面是VC++ WTL的编程用法,你着重看下WM_PAINT及设置图片的函数就能知道,如何用在MFC里了。关于Load图片的函数AtlLoadGdiplusImage(nRes, pstrType),我没贴出来,主要是为了方便你了解。

当你切换图片时,就调用SetBitmap(HBITMAP hBitmap)函数,就可以切换图片了。SizeToFit()函数是根据你设定的图片,自动调整控件窗口大小。

#ifndef _THEMEDIMAGE_H_INCLUDE_
#define _THEMEDIMAGE_H_INCLUDE_
#pragma once

//////////////////////////////////////////////////////////////////////
// Themed Image control
//

class CThemedImageCtrl : public CWindowImpl<CThemedImageCtrl, CStatic>
{
public:
CWindow m_wndThemeParent;
CBrush m_brBack;
CBitmap m_bmpImage;

// Operations

BOOL SubclassWindow(HWND hWnd)
{
ATLASSERT(m_hWnd==NULL);
ATLASSERT(::IsWindow(hWnd));
BOOL bRet = CWindowImpl<CThemedImageCtrl, CStatic>::SubclassWindow(hWnd);
if( bRet ) Init();
return bRet;
}

void Init()
{
m_wndThemeParent = GetParent();
Invalidate();
}

void SetThemeParent(HWND hWnd)
{
ATLASSERT(::IsWindow(hWnd));
m_wndThemeParent = hWnd;
if( !m_brBack.IsNull() ) m_brBack.DeleteObject();
}

void SetBitmap(HBITMAP hBitmap)
{
m_bmpImage = (HBITMAP) ::CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
if( IsWindow() ) Invalidate();
}

void SetBitmap(UINT nRes, LPCTSTR pstrType)
{
m_bmpImage = AtlLoadGdiplusImage(nRes, pstrType);
if( IsWindow() ) Invalidate();
}

void SizeToFit()
{
ATLASSERT(!m_bmpImage.IsNull());
BITMAP BmpInfo = { 0 };
m_bmpImage.GetBitmap(&BmpInfo);
ResizeClient(BmpInfo.bmWidth, BmpInfo.bmHeight);
if( IsWindow() ) Invalidate();
}

// Message map and handlers

BEGIN_MSG_MAP(CThemedImageCtrl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
MESSAGE_HANDLER(WM_MOVE, OnSize)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
END_MSG_MAP()

LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
Init();
bHandled = FALSE;
return 0;
}

LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
if( !m_brBack.IsNull() ) m_brBack.DeleteObject();
return TRUE;
}

LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
return 1;
}

LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
if( wParam != NULL )
{
DoPaint((HDC) wParam);
}
else
{
CPaintDC dc(m_hWnd);
DoPaint(dc.m_hDC);
}
return 0;
}

// Implementation

void DoPaint(CDCHandle dc)
{
CRect rcClient;
GetClientRect(&rcClient);

// Preserve background
if( m_brBack.IsNull() ) m_brBack = AtlGetBackgroundBrush(m_hWnd, m_wndThemeParent);
HBRUSH hOldBrush = dc.SelectBrush(m_brBack);
dc.PatBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), PATCOPY);
dc.SelectBrush(hOldBrush);

// Paint image (assume that it is a 32bit with alpha-pr-pixel)...
CDC dcCompat;
dcCompat.CreateCompatibleDC(dc);
BITMAP BmpInfo = { 0 };
m_bmpImage.GetBitmap(&BmpInfo);
BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
HBITMAP hOldBitmap = dcCompat.SelectBitmap(m_bmpImage);
dc.AlphaBlend(0, 0, rcClient.Width(), rcClient.Height(), dcCompat, 0, 0, BmpInfo.bmWidth, BmpInfo.bmHeight, bf);
dcCompat.SelectBitmap(hOldBitmap);
}

};
#endif //_THEMEDIMAGE_H_INCLUDE_


独山县15832062452: vc 点击按钮显示图片 然后点击另一个按钮显示 另一张图片()小白一枚求各位大大 帮助 -
禄巩新立: 两个按钮控件,一个picture box控件,关联变量m_PictScene 两个按钮的相应函数均为如下形式 HBITMAP hBitmap; hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),_T("BMP//sky.bmp"),IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); if (hBitmap!=NULL) { m_PictScene.SetBitmap(hBitmap); }

独山县15832062452: VC 点击按钮能连续显示图片,再点击另一个按钮能暂停显示 -
禄巩新立: 点击第一个按钮启动一个新线程,每sleep x秒钟换个图片显示.点击第二个按钮kill掉这个线程,或者设置一个标志变量,那个线程每次sleep完也检查这个标志,看到被设置了就主动退出

独山县15832062452: vc 如何点下按钮弹出一个子对话框并在子对话框上显示图片 -
禄巩新立: 我说个简单的过程吧.1.你首先要构造“对话框”类型的对象2.在资源里面创建一个对话框资源3.把你的对话框资源和你创建的那个对话框类型的对象关联起来4.你需要吧图片放在你的子对话框上面.方法比较多.可以用CDC的bitblt,也可以用图片控件,反正放图片很容易了.5.写你的按钮事件,弹出来很简单,(你创建的那个对话框的对象).domodel()方法 以上就是过程,很简单吧.

独山县15832062452: 用VC6.0,怎么样在一个对话框中点击一个按钮,在另一个对话框中显示一张已知路径的图片? -
禄巩新立: 在按钮消息函数里面直接使用GDI+把图片显示在另一个对话框中.

独山县15832062452: vc如何在按钮上显示一个图片? -
禄巩新立: 先在按钮的Style里选中Bitmap和Owener draw,然后把Caption改为ID的名称加入一副图,图的ID 为按扭的ID加上U,F,X,D其中的一个,比如按钮ID为IDOK,那么图的ID就可以设为"IDOKU" 记得一定要加双引号,U代表按钮弹起时的图案,D代表压下时的,X代表按钮无用时的,F代表获得聚焦时的.然后声明一个位图按钮类(CBitmapButton)的对象,调用AutoLoad函数,这个函数的两个参数分别是按钮的ID,和按钮父窗口的句柄这样就可以把图显示在按钮上了 除了以上方法还有一些,如loadimage,loadbitmap,setbitmap,你可以看看msdn有关这些函数的解释和应用

独山县15832062452: vc中 鼠标移过按钮或点击按钮,显示图片的不同部分?
禄巩新立: 这么久了,没有人回答,我帮你想个主意吧你用的是MFC么,我不记得CButton是否有这个功能了我给你提供一个手写的思路,不是很难你是用这张图片做的按钮么.你可以重写一个CMYButton类,继承CButton然后呢,你在主界面响应WM_...

独山县15832062452: vc中,建了一个多文档的MFC程序,想在主窗口中点击某按钮后,显示子窗口,请问如何实现啊?谢谢 -
禄巩新立: 对话框时,系统会提示您创建一个新的对话框类,称为CBbDlg CMyDlg的成员变量在主对话框中的首次增长,那么该变量与按钮的Click事件的响应函数

独山县15832062452: VC编程,我希望点击一个对话框的按钮能弹出一个JPG图片窗口,该图片的路径在硬盘中已确定 -
禄巩新立: 新建个对话框, OnInitalDialog的时候设置好图片, 点击按钮就显示对话框..显示jpeg图片可以用 CImage

独山县15832062452: vc 怎么在图像控件上实时切换显示多个位图 -
禄巩新立: 1、首先获取该控件内存首地址:CWnd *wn1=GetDlgItem(控件ID);2、获取该窗口CDC CDC *dc=wn1->GetDC();3、如何在上面作图、显示图像,那就很灵活了,但别忘了窗口的刷新

独山县15832062452: 你好,如何实现点击按钮显示图片,而不是picture控件?谢谢了……急~~ -
禄巩新立: 你的意思是直接显示硬盘上的图片么,VC6.0的话实现起来有点麻烦,.net 2003要简单很多. 我们要做的第一步是把图片的内容读取进内存.怎么才能实现呢.... 2003中有个ATL类CImage能直接读取图片.只需要#include <atlimage.h>头...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网