在算法过程当中动态的加载图片显示到mfc的控件上 不被覆盖

燕子lovinglife 2014-10-23 05:26:21
在算法程序中把处理好的图片保存到指定的路径上,然后加载图片显示到mfc的static的控件上,可是图片会被覆盖掉,查了资料说是要重载,可是对mfc真的相当的不清楚,希望能有具体一些的代码做指导,多谢!这是我现在的图片显示程序。
void ShowImage1( UINT uID, void * image)
{
//显示图片
CDC* pDC=aaDlg->GetDlgItem(uID)->GetDC();// 获得显示控件的 DC

HDC hDC=pDC->GetSafeHdc();// 获取 HDC(设备句柄) 来进行绘图操作

CRect rect;

aaDlg->GetDlgItem(uID)->GetClientRect(&rect);

CvvImage cimg;
cimg.CopyOf((IplImage*)image); // 复制图片

cimg.DrawToHDC(hDC,&rect);
cimg.Destroy();
aaDlg->ReleaseDC(pDC);

}
...全文
406 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2014-10-29
  • 打赏
  • 举报
回复
右图 里 那个 ”Clip Children“ 改 TRUE
燕子lovinglife 2014-10-29
  • 打赏
  • 举报
回复
引用 24 楼 schlafenhamster 的回复:
点击对话框,按“属性”
所以还是没找到在哪里添加?
schlafenhamster 2014-10-28
  • 打赏
  • 举报
回复
点击对话框,按“属性”
燕子lovinglife 2014-10-28
  • 打赏
  • 举报
回复
引用 22 楼 schlafenhamster 的回复:
资源,对话框, 属性,
我是vs2008的,点了对话框属性后是这样子的,在哪里添加呢?
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
把我能加的分都加上了,希望好心人能明白我的要求给个示范代码,多谢
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
引用 10 楼 y249077293 的回复:
楼上说的对,当控件需要重绘时,系统会发送WM_PAINT消息,你没在WM_PAINT消息的响应函数中绘制的话你绘制的图片就会被默认的行为覆盖。所以你要派生一个新类,把绘制代码放在WM_PAINT的消息函数OnPaint里面绘制
就像我在9楼说的一样,我需要在其他函数用调用画图的函数,这样的话该怎么做?
也已时过境迁 2014-10-27
  • 打赏
  • 举报
回复
楼上说的对,当控件需要重绘时,系统会发送WM_PAINT消息,你没在WM_PAINT消息的响应函数中绘制的话你绘制的图片就会被默认的行为覆盖。所以你要派生一个新类,把绘制代码放在WM_PAINT的消息函数OnPaint里面绘制
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
void CIntelligentTrafficDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 //OnOK(); image_plateview = cvLoadImage(imagepath); ShowImage1(IDC_PICPRE,image_plateview); } 就比如这样,imgpath的路径是一直在变的,然后在OnBnClickedOk()中调用ShowImage函数显示图片在控件上,根据图片的路径改变显示不同的图片。
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
引用 7 楼 LYYLYQLJD 的回复:
[quote=引用 5 楼 gz_qmc 的回复:] 这个二货 你要用text staic 的类派生一个新类 在新类里相应WM_PAINT 这个叫重载 步骤如下: 一、建立以个新类CMyPic,新类的基类选用CStatic 二、给CMyPic类相应WM_PAINT,在OnPaint里画你要的图片 三、添加一个text staic 控件,给这个控件建立以个CStatic关联的变量x 四、到对话框里吧CStatic x;改成CMyPic x; OVER
能给一些具体的代码做参考吗,我真的是不懂该怎么弄[/quote] 我是想写一个void ShowImage1( UINT uID, void * image)在工程中的其他函数来调用,调用的时候把id和图片传递给函数,请问这样子的话重载的OnPaint要怎么写?
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
引用 5 楼 gz_qmc 的回复:
这个二货 你要用text staic 的类派生一个新类 在新类里相应WM_PAINT 这个叫重载 步骤如下: 一、建立以个新类CMyPic,新类的基类选用CStatic 二、给CMyPic类相应WM_PAINT,在OnPaint里画你要的图片 三、添加一个text staic 控件,给这个控件建立以个CStatic关联的变量x 四、到对话框里吧CStatic x;改成CMyPic x; OVER
能给一些具体的代码做参考吗,我真的是不懂该怎么弄
向立天 2014-10-27
  • 打赏
  • 举报
回复
引用 4 楼 LYYLYQLJD 的回复:
[quote=引用 2 楼 xianglitian 的回复:] 这类问题我一般推荐用自定义控件解决 参考http://blog.csdn.net/xianglitian/article/details/6075653
这个链接的问题跟我想要的不太一样呢,还有别的资料吗?[/quote]就是建议你按着这个方法做
schlafenhamster 2014-10-27
  • 打赏
  • 举报
回复
资源,对话框, 属性,
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
引用 20 楼 schlafenhamster 的回复:
对话框 加 WS_CLIPCHIDREN 属性。
在哪里加?
schlafenhamster 2014-10-27
  • 打赏
  • 举报
回复
对话框 加 WS_CLIPCHIDREN 属性。
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
引用 18 楼 y249077293 的回复:
猜测你没有子类化控件该控件 1. BOOL CIntelligentTrafficDlg::OnInitDialog() { //在头文件中声明的CMyStatic m_ctlMyStatic m_ctlMyStatic.SubclassDlgItem(IDC_STATIC_TEST, this); //IDC_STATIC_TEST控件的ID,可能要把默认的IDC_STATIC修改下 } 2.在类向导中为控件添加成员变量CMyStatic
程序页面框画了出来以后点击确定的按钮然后才会显示图片,为什么不是一开始初始化以后就显示呢?
也已时过境迁 2014-10-27
  • 打赏
  • 举报
回复
猜测你没有子类化控件该控件 1. BOOL CIntelligentTrafficDlg::OnInitDialog() { //在头文件中声明的CMyStatic m_ctlMyStatic m_ctlMyStatic.SubclassDlgItem(IDC_STATIC_TEST, this); //IDC_STATIC_TEST控件的ID,可能要把默认的IDC_STATIC修改下 } 2.在类向导中为控件添加成员变量CMyStatic
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
程序跟踪了以后发现是m_lpszImagePath没有值,初始化赋值了以后m_lpszImagePath得值没有存储起来?
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
void CIntelligentTrafficDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();

CMyStatic* pMyStatic =(CMyStatic*) GetDlgItem(IDC_STATIC1);
char path_show[128] ="D:\\PlatePicture\\001.jpg";
pMyStatic->SetImagePath(path_show);
}
BOOL CIntelligentTrafficDlg::OnInitDialog()


引用 14 楼 y249077293 的回复:
这个问题给这么多分!好有钱

//头文件.h
#pragma once

// CMyStatic

class CMyStatic : public CStatic
{
DECLARE_DYNAMIC(CMyStatic)

protected:
LPCTSTR m_lpszImagePath;
public:
CMyStatic();
virtual ~CMyStatic();

public:
void SetImagePath(LPCTSTR lpszImagePath);
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
};

//源文件.cpp
#include "stdafx.h"
#include "MyStatic.h"

// CMyStatic

IMPLEMENT_DYNAMIC(CMyStatic, CStatic)

CMyStatic::CMyStatic()
: m_lpszImagePath(NULL)
{

}

CMyStatic::~CMyStatic()
{
}


BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()



// CMyStatic message handlers

void CMyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here


image_plateview = cvLoadImage(m_lpszImagePath);
if (image_plateview != NULL)
{
CvvImage cimg;
cimg.CopyOf((IplImage*)image_plateview); // 复制图片

CRect rect;
GetClientRect(&rect);
cimg.DrawToHDC(dc.GetSafeHdc(),&rect);
cimg.Destroy();
}

// Do not call CStatic::OnPaint() for painting messages
}

void CMyStatic::SetImagePath( LPCTSTR lpszImagePath )
{
m_lpszImagePath = lpszImagePath;
Invalidate();
UpdateWindow();
}


//在按钮click中
void CIntelligentTrafficDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();
CMyStatic* pMyStatic = GetDlgItem(uID);
pMyStatic.SetImagePath(imagepath);
}



按照你说的写了,然后把OnBnClickedOk()放在BOOL CIntelligentTrafficDlg::OnInitDialog()里面初始化,但是没有显示出图片。OnBnClickedOk()里面是这样写的
void CIntelligentTrafficDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();

CMyStatic* pMyStatic =(CMyStatic*) GetDlgItem(IDC_STATIC1);
char path_show[128] ="D:\\PlatePicture\\001.jpg";
pMyStatic->SetImagePath(path_show);
燕子lovinglife 2014-10-27
  • 打赏
  • 举报
回复
引用 13 楼 gz_qmc 的回复:
你留下邮箱吧,抽空给你写一个
1050064794@qq.com,谢谢!
也已时过境迁 2014-10-27
  • 打赏
  • 举报
回复
这个问题给这么多分!好有钱 //头文件.h #pragma once // CMyStatic class CMyStatic : public CStatic { DECLARE_DYNAMIC(CMyStatic) protected: LPCTSTR m_lpszImagePath; public: CMyStatic(); virtual ~CMyStatic(); public: void SetImagePath(LPCTSTR lpszImagePath); protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnPaint(); }; //源文件.cpp #include "stdafx.h" #include "MyStatic.h" // CMyStatic IMPLEMENT_DYNAMIC(CMyStatic, CStatic) CMyStatic::CMyStatic() : m_lpszImagePath(NULL) { } CMyStatic::~CMyStatic() { } BEGIN_MESSAGE_MAP(CMyStatic, CStatic) ON_WM_PAINT() END_MESSAGE_MAP() // CMyStatic message handlers void CMyStatic::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here image_plateview = cvLoadImage(m_lpszImagePath); if (image_plateview != NULL) { CvvImage cimg; cimg.CopyOf((IplImage*)image_plateview); // 复制图片 CRect rect; GetClientRect(&rect); cimg.DrawToHDC(dc.GetSafeHdc(),&rect); cimg.Destroy(); } // Do not call CStatic::OnPaint() for painting messages } void CMyStatic::SetImagePath( LPCTSTR lpszImagePath ) { m_lpszImagePath = lpszImagePath; Invalidate(); UpdateWindow(); } //在按钮click中 void CIntelligentTrafficDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 //OnOK(); CMyStatic* pMyStatic = GetDlgItem(uID); pMyStatic.SetImagePath(imagepath); }
加载更多回复(6)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧