void DlgCheck::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); if (nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED) { float fsp[2]; POINT Newp; //获取现在对话框的大小 CRect recta; GetClientRect(&recta); //取客户区大小 Newp.x = recta.right - recta.left; Newp.y = recta.bottom - recta.top; fsp[0] = (float)Newp.x / Old.x; fsp[1] = (float)Newp.y / Old.y; CRect Rect; int woc; CPoint OldTLPoint, TLPoint; //左上角 CPoint OldBRPoint, BRPoint; //右下角 HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件 while (hwndChild) { woc = ::GetDlgCtrlID(hwndChild);//取得ID GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect); OldTLPoint = Rect.TopLeft(); TLPoint.x = long(OldTLPoint.x * fsp[0]); TLPoint.y = long(OldTLPoint.y * fsp[1]); OldBRPoint = Rect.BottomRight(); BRPoint.x = long(OldBRPoint.x * fsp[0]); BRPoint.y = long(OldBRPoint.y * fsp[1]); Rect.SetRect(TLPoint, BRPoint); GetDlgItem(woc)->MoveWindow(Rect, TRUE); hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT); } Old = Newp; } if (this->IsPicDerec) { this->drawDerection();//此处因不明原因无法绘制成功,必须绘制两次,待修复 } if (this->IsPicShow) { cv::Mat res = this->getPic().clone(); if (!this->getBackPic().empty()) { vector<vectorcv::Point> contours; cv::findContours(this->getBackPic(), contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);//查找外层轮廓 cv::drawContours(res, contours, -1, cv::Scalar(255)); } else { res = this->getPic(); } if (res.empty()) { AfxMessageBox("Empty res"); } this->DrawcvMat(res, IDC_Picture); } if (this->IsPicDerec) { this->drawDerection(); } }为什么第一次drawDerection()绘制的图片没有显示?
时间: 2024-02-17 20:02:28 浏览: 160
vc如何让EDIT控件随窗口大小改变而改变
在上述代码中,第一次调用 `drawDerection()` 后绘制的图片没有显示,可能是因为你没有在 `OnSize()` 函数中正确的设置绘制的位置或者没有调用 `Invalidate()` 函数触发重绘。具体来说,你可以尝试以下几个步骤:
1. 在 `OnSize()` 函数中添加以下代码:
```cpp
void DlgCheck::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
if (nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED) {
// 获取现在对话框的大小
CRect recta;
GetClientRect(&recta);
// 取客户区大小
POINT Newp;
Newp.x = recta.right - recta.left;
Newp.y = recta.bottom - recta.top;
// 触发重绘
Invalidate();
}
}
```
2. 确认 `drawDerection()` 函数中绘制图片的位置是否正确。你可以使用 `CDC::TextOut()` 函数在该位置绘制一些文字进行测试。
3. 确认 `DrawcvMat()` 函数能否正常显示图片。你可以在其他地方调用该函数,并传入相同的图片进行测试。
如果以上方法都无法解决问题,你可以尝试在 `DrawcvMat()` 函数中添加一些调试信息,例如在函数开始时输出一条调试信息,以确认函数能否正常被调用。
阅读全文