最近做项目时,遇到一个问题,想要让picture control中的图片显示与该控件的大小一致,用的环境是vs2008,添加一个控件后,更改其type为bitmap,此时的控件大小不能改变,需要将Center Image更改为True,此时即可更改控件的大小 将控件关联一个CStatic的变量m_ctrlPic后,可以在OnInitDialog中使用SetImage,此时的图片可以居中显示,但是大小被缩减了,然后在OnInitDialog中使用了StretchBlt发现图片显示一下就不见了,后来查了查,发现了问题所在,对话框显示的时候会先调用OnInitDialog,然后调用OnPaint,而OnPaint中的CDialog::OnPaint();当对话框 没有 WS_CLIPDRILDREN 属性CDialog::OnPaint(); 会给 pictrue 发 窗口无效 (invalidate),如果 这时 画 东西, 会 被 pic 的 paint 覆盖 掉.所以一定要让 pic 的 窗口 ,有效 后 才能 画.也就是说 先 要 pWnd->UpdateWindow();//或者:(pWnd->RedrawWindow())或者 pWnd->ValidateRect()使 窗口 有效. void CUWB_CoordinateDlg::OnPaint() {if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } UpdateWindow(); int height, width; CRect rect;//定义矩形类 CRect rect1; CImage image; //创建图片类 image.Load(_T("1.jpg")); height = image.GetHeight(); width = image.GetWidth(); m_ctrlPic.GetClientRect(&rect); //获得pictrue控件所在的矩形区域 CDC *pDc = m_ctrlPic.GetDC();//获得pictrue控件的Dc SetStretchBltMode(pDc->m_hDC,STRETCH_HALFTONE); image.StretchBlt(pDc->m_hDC,rect,SRCCOPY); ReleaseDC(pDc);//释放picture控件的Dc }
|
|