vc 解决static中画图不消失

1.*jpgAll Files (*.*)*.*"),

AfxGetMainWnd());

CString pathName;

if(fileDlg.DoModal ()IDOK)

{

POSITION mPos=fileDlg.GetStartPosition();

while(mPos!=NULL)

{

pathName=fileDlg.GetNextPathName(mPos);

if(m_pict.LoadPicture(pathName.GetBuffer(pathName.GetLength())))

{

// 防止有透明图片,消除已有的图片信息

CPaintDC dc(this); // device context for painting

CRect rc;

GetDlgItem(IDC_MY_PIC)-GetWindowRect(&rc);

dc.FillSolidRect(rc, RGB(0, 0, 0));

Invalidate();

}

}

}

}

 

3.给父窗口增加ON_WM_DRAWITEM消息映射函数 在OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)消息映射函数里面绘制控件

void CDlgpicDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)

{

// TODO: Add your message handler code here and/or call default

if(nIDCtl IDC_MY_PIC)

{

if ( m_pict.m_pic)

{

RECT rect;

TRACE("hell test-");

HWND hwnd = ::GetDlgItem(this-GetSafeHwnd(), IDC_MY_PIC);

HDC hDC = ::GetDC(::GetDlgItem(this-GetSafeHwnd(),IDC_MY_PIC));

//Get the DC for the CPicture Box

::GetClientRect(::GetDlgItem(this-GetSafeHwnd(), IDC_MY_PIC), &rect);

//Get dimensions of it

m_pict.DrawPicture(hDC, 0, 0, rect.right - rect.left ,rect.bottom - rect.top );

::ReleaseDC(::GetDlgItem(this-GetSafeHwnd(),IDC_MY_PIC), hDC);

}

}

CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);

}

总结: 如果在static中需要显示图片,在ONPAINT 中绘画 没有效果,需要这么画:

1)给static控件增加SS_OWNERDRAW属性 GetDlgItem(IDC_MY_PIC)-ModifyStyle ( SS_TYPEMASK, SS_OWNERDRAW );

2)给父窗口增加ON_WM_DRAWITEM消息映射函数

3)在OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)消息映射函数里面绘制控件

例如:下面给对话框里的IDC_STATIC_DRAW控件画个蓝色的背景

void CMyDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)

{

if(nIDCtl IDC_STATIC_DRAW)

{

CDC *pDC = CDC::FromHandle(lpDrawItemStruct-hDC);

 

pDC-FillSolidRect(10, 10, lpDrawItemStruct-rcItem.right - 20, lpDrawItemStruct-rcItem.bottom - 20, RGB(0, 0, 255));

return;

}

CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);

}

另外,还可以这么画

从CStatic继承一个新类,然后增加WM_PAINT消息处理,在OnPaint里面画

例如:

class CMyStatic : public CStatic

{

...

afx_msg void OnPaint();

};

void CMyStatic::OnPaint()

{

CPaintDC dc(this); // device context for painting

CRect rc;

GetClientRect(rc);

dc.FillSolidRect(rc, RGB(0, 0, 255));

}

OnInitDialog()中添加自绘属性

GetDlgItem(IDC_SMALLCARNUM)->ModifyStyle ( SS_TYPEMASK,SS_OWNERDRAW );
 GetDlgItem(IDC_SPECIALNUM)->ModifyStyle ( SS_TYPEMASK,SS_OWNERDRAW );

OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)中添加绘制代码:

if(nIDCtl== IDC_SMALLCARNUM){
  CImage mImage;
  HDC hDC;
 
  hDC = lpDrawItemStruct->hDC;
  
  int result = mImage.Load(mSmallpath);
  if(FAILED(result))
   return;
  ::SetStretchBltMode (hDC, HALFTONE);
  ::SetBrushOrgEx(hDC, 0, 0, NULL);
  mImage.StretchBlt(hDC,0,0,150,60,SRCCOPY);
  //return; 我的代码中不返回图像也不会消失
 

 }else if(nIDCtl == IDC_SPECIALNUM){
  CImage mImage;
  HDC hDC;

  hDC = lpDrawItemStruct->hDC;

  int result = mImage.Load(mWholepath);
  if(FAILED(result))
   return;
  ::SetStretchBltMode (hDC, HALFTONE);
  ::SetBrushOrgEx(hDC, 0, 0, NULL);

  mImage.StretchBlt(hDC,0,0,300,288,SRCCOPY);
 

 }


 
 CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值