在对话框控件上显示图片问题,
// 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的时候,第一张图片闪了一下,就变成白色的了。
请问:这个问题怎么解决??????