CRect rect; (this->GetDlgItem(IDC_game))->GetWindowRect(&rect); // 获取控件相对于屏幕的位置 ScreenToClient(rect); // 转化为相对于客户区的位置 GetDlgItem(IDC_game)->MoveWindow(rect.left, rect.top ,1000, 480, false); //重新获取 CDC* pClientDC = GetDC(); (this->GetDlgItem(IDC_game))->GetWindowRect(&rect); // 获取控件相对于屏幕的位置 ScreenToClient(rect); // 转化为相对于客户区的位置 CPen pen(PS_SOLID, 8, RGB(0, 0, 0)); CPen pen0(PS_SOLID, 10, RGB(255, 250, 250)); CPen* oldPen = pClientDC->SelectObject(&pen0);
时间: 2024-04-02 14:34:12 浏览: 103
这是一个 MFC 程序中的对话框类的成员函数,用于重新获取指定控件的位置信息,并创建画笔对象进行绘制。首先创建一个 CRect 类型的对象 rect,然后调用 GetDlgItem() 函数获取 IDC_game 控件相对于屏幕的位置,保存在 rect 对象中。接着调用 ScreenToClient() 函数将控件的位置转换为相对于客户区的位置。然后创建一个 CDC 对象 pClientDC,调用 GetDC() 函数获取客户区的设备上下文对象。接着创建两个 CPen 对象 pen 和 pen0,分别用于绘制黑色和白色的线条。调用 SelectObject() 函数将画笔对象选入设备上下文对象中,并保存旧的画笔对象,以便后续恢复。
相关问题
CRect rect; (this->GetDlgItem(IDC_game))->GetWindowRect(&rect); // 获取控件相对于屏幕的位置 ScreenToClient(rect); // 转化为相对于客户区的位置 GetDlgItem(IDC_game)->MoveWindow(rect.left, rect.top ,1000, 480, false);
这是一个 MFC 程序中的对话框类的成员函数,用于获取指定控件的位置信息,并移动控件到指定位置。首先创建一个 CRect 类型的对象 rect,然后调用 GetDlgItem() 函数获取 IDC_game 控件相对于屏幕的位置,保存在 rect 对象中。接着调用 ScreenToClient() 函数将控件的位置转换为相对于客户区的位置。最后调用 GetDlgItem() 函数获取 IDC_game 控件的指针,并调用 MoveWindow() 函数将控件移动到指定的位置和大小。其中,rect.left 和 rect.top 表示控件的左上角在客户区的位置,1000 和 480 分别表示控件的宽度和高度,最后一个参数表示是否重绘控件。
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()绘制的图片没有显示?
在上述代码中,第一次调用 `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()` 函数中添加一些调试信息,例如在函数开始时输出一条调试信息,以确认函数能否正常被调用。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://img-home.csdnimg.cn/images/20250102104920.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)