标题:MFC PictureControl控件问题
只看楼主
鸿蒙之灵
Rank: 4
来 自:异次元裂缝
等 级:贵宾
威 望:11
帖 子:126
专家分:244
注 册:2016-8-22
结帖率:66.67%
已结贴  问题点数:20 回复次数:9 
MFC PictureControl控件问题
有一些图片,放在一个指定的目录文件下,我需要创建一个模态对话框,该对话框无边框,也没有关闭取消等按钮,程序运行过程中一直存在于内存中,需要显示时它显示用:picDlg->ShowWindow(SW_SHOW);不需要显示时隐藏:picDlg->ShowWindow(SW_HIDE);

有如下问题:图片大小不一致,在显示的时候,我需要对对话框进行大小的重新设定,即先获取图片大小然后将对话框大小设置为匹配图片大小;
如何在知道图片路径及名称以及后缀名的情况下,将图片资源读取并显示在对应的pictrueControl控件中,每次显示图片要动态更新,该方案不将图片素材加入工程;

是否有比较全的功能代码,能够显示jpg格式图片最好,显示部分我暂时用的代码段如下:(当前代码运行一段时间后会触发中断)

程序代码:

void CPictureControl::OnPaint()
{
    mPictureViewer.SetBitmap(NULL);//((CStatic*)GetDlgItem(IDC_STATIC_PHOTO))->SetBitmap(NULL);
    this->RedrawWindow();

    //定义变量存储图片信息
    BITMAPINFO *pBmpInfo;       //记录图像细节
    BYTE *pBmpData;             //图像数据
    BITMAPFILEHEADER bmpHeader; //文件头
    BITMAPINFOHEADER bmpInfo;   //信息头
    CFile bmpFile;              //记录打开文件

    //以仅仅读的方式打开文件 读取bmp图片各部分 bmp文件头 信息 数据
    if(!bmpFile.Open(m_filename, CFile::modeRead|CFile::typeBinary)) 
        return;
    if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
        return;
    if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
        return;
    pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
    //为图像数据申请空间
    memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));
    DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;
    pBmpData = (BYTE*)new char[dataBytes];
    bmpFile.Read(pBmpData,dataBytes);
    bmpFile.Close();

    //显示图像
    CWnd *pWnd=GetDlgItem(IDC_PIC); //获得pictrue控件窗体的句柄
    CRect rect;
    pWnd->GetClientRect(&rect); //获得pictrue控件所在的矩形区域
    CDC *pDC=pWnd->GetDC(); //获得pictrue控件的DC
    pDC->SetStretchBltMode(COLORONCOLOR);
    StretchDIBits(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0,bmpInfo.biWidth,bmpInfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
}

搜索更多相关主题的帖子: sizeof 控件 图片 大小 显示 
2020-03-16 13:10
鸿蒙之灵
Rank: 4
来 自:异次元裂缝
等 级:贵宾
威 望:11
帖 子:126
专家分:244
注 册:2016-8-22
得分:0 
显示jpg格式图片已经解决,代码段如下:

程序代码:

mPictureViewer.SetBitmap(NULL);//((CStatic*)GetDlgItem(IDC_STATIC_PHOTO))->SetBitmap(NULL);
    this->RedrawWindow();

    CImage image;
    image.Load(m_filename);
    CRect rtPic;
    GetDlgItem(IDC_PIC)->GetClientRect(rtPic);
    CDC *pDc = GetDlgItem(IDC_PIC)->GetDC();
    pDc->SetStretchBltMode(STRETCH_HALFTONE);
    //int ModeOld = SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);
    image.Draw(pDc->m_hDC, rtPic);
    //SetStretchBltMode(pDc->m_hDC, ModeOld);
    ReleaseDC(pDc);
    image.Destroy();



接下来需要实现根据图片大小动态设置对话框大小及控件大小

对待编程,要像对待情人一样
2020-03-16 13:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
是否有比较全的功能代码
可以试试MFC自带的 CImage,它封装的是gdi+

当前代码运行一段时间后会触发中断
你的代码之所以报错,是因为你的 pDC 没释放资源,试试 pDC->ReleaseDC();
2020-03-16 13:48
鸿蒙之灵
Rank: 4
来 自:异次元裂缝
等 级:贵宾
威 望:11
帖 子:126
专家分:244
注 册:2016-8-22
得分:0 
回复 3楼 rjsp
这个我换过来了,你看看我前面的,现在需要的问题是如何显示的时候能够根据图片大小动态设置一次对话框的大小,以及控件大小,位置我已经根据需求得到了坐标点

对待编程,要像对待情人一样
2020-03-16 14:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
SetWindowPos
2020-03-16 14:50
鸿蒙之灵
Rank: 4
来 自:异次元裂缝
等 级:贵宾
威 望:11
帖 子:126
专家分:244
注 册:2016-8-22
得分:0 
回复 5楼 rjsp
现在就是这个图片弹出来的时候,在系统任务栏那里会出现一个窗口,这个怎么能不让出现呢,图片是这样的





对待编程,要像对待情人一样
2020-03-16 15:13
鸿蒙之灵
Rank: 4
来 自:异次元裂缝
等 级:贵宾
威 望:11
帖 子:126
专家分:244
注 册:2016-8-22
得分:0 
回复 5楼 rjsp
现在就是这个图片弹出来的时候,在系统任务栏那里会出现一个窗口,这个怎么能不让出现呢,之前做过类似的,但不知道这个为啥就出现了

[此贴子已经被作者于2020-3-16 15:15编辑过]


对待编程,要像对待情人一样
2020-03-16 15:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用鸿蒙之灵在2020-3-16 15:13:37的发言:

现在就是这个图片弹出来的时候,在系统任务栏那里会出现一个窗口,这个怎么能不让出现呢,之前做过类似的,但不知道这个为啥就出现了
ModifyStyleEx( (DWORD)GetWindowLong(m_hWnd,GWL_EXSTYLE), WS_EX_TOOLWINDOW, 0);
2020-03-16 15:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用鸿蒙之灵在2020-3-16 14:38:11的发言:

这个我换过来了,你看看我前面的,现在需要的问题是如何显示的时候能够根据图片大小动态设置一次对话框的大小,以及控件大小,位置我已经根据需求得到了坐标点

程序代码:
        CImage image;
        image.Load(m_filename);
        int width = image.GetWidth();
        int height = image.GetHeight();

        CRect mainRt;
        GetClientRect( mainRt );

        CRect picRt;
        GetDlgItem(IDC_PIC)->GetWindowRect(picRt);
        ScreenToClient(picRt);

        int delta_w = width - picRt.Width();
        int delta_h = height - picRt.Height();

        if( delta_w!=0 || delta_h!=0 )
        {
            GetDlgItem(IDC_PIC)->MoveWindow( picRt.left, picRt.top, picRt.Width()+delta_w, picRt.Height()+delta_h, TRUE );
            MoveWindow( mainRt.left, mainRt.top, mainRt.Width()+delta_w, mainRt.Height()+delta_h, TRUE );
        }

        CPaintDC dc(this);
        image.BitBlt( dc.GetSafeHdc(), picRt.left, picRt.top );

2020-03-16 15:34
鸿蒙之灵
Rank: 4
来 自:异次元裂缝
等 级:贵宾
威 望:11
帖 子:126
专家分:244
注 册:2016-8-22
得分:0 
回复 8楼 rjsp
这个问题已解决,感谢版主的热心解答

对待编程,要像对待情人一样
2020-03-16 15:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499788-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.098400 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved