在对话框控件上显示图片问题,

sailor_Song 2008-12-25 09:37:54
// ViewPicDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "CViewGIS.h"
#include "ViewPicDlg.h"


// CViewPicDlg 对话框

IMPLEMENT_DYNAMIC(CViewPicDlg, CDialog)

CViewPicDlg::CViewPicDlg(CWnd* pParent /*=NULL*/)
: CDialog(CViewPicDlg::IDD, pParent)
{
m_iPicCurIdx = 0;
m_iPicMaxCnt = 0;
m_pObjPointInfr = 0;
}

CViewPicDlg::~CViewPicDlg()
{
}

void CViewPicDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CViewPicDlg, CDialog)
ON_BN_CLICKED(IDC_PIC_NEXT, &CViewPicDlg::OnBnClickedPicNext)
ON_BN_CLICKED(IDC_PIC_PREV, &CViewPicDlg::OnBnClickedPicPrev)
ON_BN_CLICKED(IDC_PIC_RETURN, &CViewPicDlg::OnBnClickedPicReturn)
ON_STN_CLICKED(IDC_PIC_STATIC, &CViewPicDlg::OnStnClickedPicStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()


// CViewPicDlg 消息处理程序

BOOL CViewPicDlg::OnInitDialog()
{
CDialog::OnInitDialog();

return TRUE;

}

void CViewPicDlg::Initialize(tag_PointInfr*pPnt, CString* pFilePath)
{ //初始化参数
m_pObjPointInfr = pPnt;
m_strFilePath = *pFilePath;

// 取得文件个数;
int iCnt = 0;
CString strFileName;
CFile fp;
BOOL ret = FALSE;
do
{
strFileName.Format(L"pic_%d.bmp", iCnt + 1);
strFileName = m_strFilePath + strFileName;
ret = fp.Open(strFileName, CFile::modeRead);
if(ret == TRUE)
{
iCnt++;
fp.Close();
}
}while(ret == TRUE);
m_iPicMaxCnt = iCnt;
if(m_iPicMaxCnt != 0)
{
m_iPicCurIdx = 1;
}
}
//在某点显示位图 2007.8.11
BOOL CViewPicDlg::DrawStyleBMP(HDC hDC,double scrX, double scrY, LPTSTR srcFileName)
{
COLORREF crMask = RGB(255,255,255);
HBITMAP hBMP;
HDC hBitmapDC;
hBitmapDC = CreateCompatibleDC( hDC);
HBITMAP THBM;
THBM=(HBITMAP)SHLoadDIBitmap(srcFileName);
BITMAP bmp;
GetObject(THBM,sizeof(bmp),&bmp);//取得位图信息
int nWidth = bmp.bmWidth;
int nHeight = bmp.bmHeight;
if( nWidth <= 0 )
{
DeleteObject(THBM);//删除位图
DeleteDC(hBitmapDC);//删除HDC
return FALSE;
}
//显示位图
hBMP = (HBITMAP)SelectObject(hBitmapDC,THBM);//选入位图至内存DC
TransparentBlt2(hDC, (int)(scrX),(int)(scrY),nWidth,nHeight,hBitmapDC,0,0,nWidth,nHeight,crMask);//将临时内存DC中的位图画到客户区中
SelectObject(hBitmapDC, hBMP); //释放选入的内存
DeleteObject(THBM);//删除位图
DeleteDC(hBitmapDC);//删除HDC
return TRUE;
}
//显示透明位图
void CViewPicDlg::TransparentBlt2( HDC hdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF类型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

// 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
{
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
}
else
{
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
}

// 设置透明色
SetBkColor(hImageDC, crTransparent);

// 生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

// 生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// 透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// "或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}

void CViewPicDlg::UpdateView()
{
if(m_pObjPointInfr == NULL)
{
return ;
}
//title显示;
//GetDlgItem(IDD_VIEW_PIC)->SetWindowText(m_pObjPointInfr->strName);

//显示当前图片
CString strBitmapName;
strBitmapName.Format(L"pic_%d.bmp", m_iPicCurIdx); //example:pic_1.bmp
strBitmapName = m_strFilePath + strBitmapName;
//获得指向静态控件的指针
CStatic *pStatic=(CStatic *)GetDlgItem(IDC_PIC_STATIC);
CRect rc;
pStatic->GetClientRect(&rc);
CDC* pStaticDC = pStatic->GetDC();
pStaticDC->SetBkMode(TRANSPARENT);
pStaticDC->FillSolidRect( rc.left, rc.top, rc.Width(), rc.Height(), RGB(255,255,255));
DrawStyleBMP( pStaticDC->GetSafeHdc(),rc.top, rc.left, strBitmapName.GetBuffer());

//按钮控制;
//前翻按钮;
if(m_iPicMaxCnt == 0 || m_iPicCurIdx == 1)
{
GetDlgItem(IDC_PIC_PREV)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_PIC_PREV)->EnableWindow(TRUE);
}
//后翻按钮
if(m_iPicMaxCnt == 0 || m_iPicMaxCnt == m_iPicCurIdx)
{
GetDlgItem(IDC_PIC_NEXT)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_PIC_NEXT)->EnableWindow(TRUE);
}
//返回按钮(始终可选)
GetDlgItem(IDC_PIC_RETURN)->EnableWindow(TRUE);

//this->Invalidate(TRUE);
}

void CViewPicDlg::OnBnClickedPicNext()
{
if(m_iPicMaxCnt > m_iPicCurIdx)
{
m_iPicCurIdx ++;
}
UpdateView();
}

void CViewPicDlg::OnBnClickedPicPrev()
{
if(m_iPicCurIdx > 1)
{
m_iPicCurIdx --;
}
UpdateView();
}

void CViewPicDlg::OnBnClickedPicReturn()
{
CDialog::OnOK();
}

void CViewPicDlg::OnStnClickedPicStatic()
{
m_iPicCurIdx ++;
m_iPicCurIdx = m_iPicCurIdx % m_iPicMaxCnt;
UpdateView();
}

void CViewPicDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
UpdateView();
}
我在另外一个对话框里面处理显示这个对话框:
void CViewDetailDlg::OnBnClickedBtnPic()
{
CViewPicDlg* pPicDlg = new CViewPicDlg(this);
pPicDlg->Initialize(m_pobjPointInfr, &m_strFilePath);
pPicDlg->DoModal();
delete pPicDlg;
pPicDlg = NULL;
}
这样的方法,DoModal的时候显示不了第一张图片,在点击:前翻(OnBnClickedPicPrev)、后翻(OnBnClickedPicNext)
所有的图片都能正常显示;就是DoModal的时候,第一张图片闪了一下,就变成白色的了。
请问:这个问题怎么解决??????

...全文
155 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
biaozai06 2009-01-08
  • 打赏
  • 举报
回复
这样的方法,DoModal的时候显示不了第一张图片,在点击:前翻(OnBnClickedPicPrev)、后翻(OnBnClickedPicNext)
所有的图片都能正常显示;就是DoModal的时候,第一张图片闪了一下,就变成白色的了。

很奇怪,为什么只有第一张图片会闪烁后消失,而前翻、后翻就能正常显示。代码中二者的处理方法是一样的
gdoupanguoqing 2009-01-08
  • 打赏
  • 举报
回复
画图的操作放在OnPaint或OnEraseBkgnd里面.

UpdateView的时候调用RedrawWindow
sailor_Song 2008-12-26
  • 打赏
  • 举报
回复
发送paint消息我试了,没有用,
我现在的方法是做个时钟,时钟到了以后UpdateView一次,就可以了。当然也是闪一下。
大饼哥- 2008-12-25
  • 打赏
  • 举报
回复
占座
北方大冬瓜 2008-12-25
  • 打赏
  • 举报
回复
在 OnInit 里 InvalidRect 一下然后 SendMessage(WM_PAINT) 试试
小李匪盗 2008-12-25
  • 打赏
  • 举报
回复
你可能需要处理WM_ERASEBKGND消息

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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