获取Runtime_Class(CView)的窗口句柄?

作者在使用MFC创建并显示子窗口后,尝试从CChildFrame2发送消息到CView2,但无论是直接调用还是通过主框架间接调用GetActiveView()方法都返回NULL,尽管视图已处于显示状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正在做一个MFC的程序,遇到了这个问题,因为程序需要,于是用下面的代码创建子窗口:

    m_PDoc=new CDoc();
    m_PChildFrame2=new CChildFrame2();
    CCreateContext context;
    context.m_pNewViewClass=RUNTIME_CLASS(CView2);
    context.m_pCurrentDoc=m_PDoc;
    if(m_PChildFrame2->Create(NULL,NULL,WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,   CRect(0,0,860,500),NULL,&context))
         return;
    m_PChildFrame2->ShowWindow(SW_SHOWMAXIMIZED);
    m_PChildFrame2->InitialUpdateFrame(NULL,true);

//CDOC继承自CDocument   ,CChildFrame2继承自CMDIChildWnd,CView2继承自CView

现在要从CChildFrame2中发送消息到CView2,问题出来了,在CChildFrame2中用this->GetActiveView()返回NULL,但是此时视图已经处于显示状态。在主框架中用GetActiveFrame(),再用GetActiveView()还是为NULL。

// MFCApplication1View.cpp: CMFCApplication1View 类的实现 // #include "pch.h" #include "framework.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "MFCApplication1.h" #endif #include "MFCApplication1Doc.h" #include "MFCApplication1View.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMFCApplication1View IMPLEMENT_DYNCREATE(CMFCApplication1View, CView) BEGIN_MESSAGE_MAP(CMFCApplication1View, CView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() END_MESSAGE_MAP() // CMFCApplication1View 构造/析构 CMFCApplication1View::CMFCApplication1View() noexcept { // TODO: 在此处添加构造代码 } CMFCApplication1View::~CMFCApplication1View() { } BOOL CMFCApplication1View::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs); } // CMFCApplication1View 绘图 void CMFCApplication1View::OnDraw(CDC* /*pDC*/) { CMFCApplication1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 } // CMFCApplication1View 打印 BOOL CMFCApplication1View::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CMFCApplication1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加额外的打印前进行的初始化过程 } void CMFCApplication1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加打印后进行的清理过程 } // CMFCApplication1View 诊断 #ifdef _DEBUG void CMFCApplication1View::AssertValid() const { CView::AssertValid(); } void CMFCApplication1View::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMFCApplication1Doc* CMFCApplication1View::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication1Doc))); return (CMFCApplication1Doc*)m_pDocument; } #endif //_DEBUG // CMFCApplication1View 消息处理程序 void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 P0 = point; CView::OnLButtonDown(nFlags, point); } void CMFCApplication1View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 P1 = point; CDC*pDC = GetDC(); pDC->Rectangle(CRect(P0, P1)); pDC->Ellipse(CRect(P0, P1)); float d = min(abs(P0.x - P1.x), abs(P0.y - P1.y)); pDC->Ellipse(CRect((P0.x - P1.x) / 2 - d / 2, (P0.y + P1.y) / 2 + d / 2, (P0.x + P1.x) / 2+d/2, (P0.y + P1.y )/ 2 - d / 2)); pDC->MoveTo((P0.x + P1.x) / 2 - d / 2, ((P0.y + P1.y) / 2 + d / 2 + (P0.y + P1.y) / 2 - d / 2) / 2); pDC->LineTo((P0.x + P1.x) / 2 - d / 2+((P0.x + P1.x) / 2 + d / 2)/2 , (P0.y + P1.y) / 2 - d / 2); ReleaseDC(pDC); CView::OnLButtonUp(nFlags, point); } 我给你了我的页面的代码 我要替换你的代码 给我你的代码
03-25
#include "pch.h" #include "framework.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "MFC3DApp.h" #endif #include "MFC3DAppDoc.h" #include "MFC3DAppView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMFC3DAppView IMPLEMENT_DYNCREATE(CMFC3DAppView, CView) BEGIN_MESSAGE_MAP(CMFC3DAppView, CView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CMFC3DAppView::OnFilePrintPreview) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() END_MESSAGE_MAP() // CMFC3DAppView 构造/析构 CMFC3DAppView::~CMFC3DAppView() { } BOOL CMFC3DAppView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs); } // CMFC3DAppView 绘制 void CMFC3DAppView::OnDraw(CDC* pDC) { CMFC3DAppDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; for (const auto& cube : m_cubes) { TwoXiece(cube, pDC); } } void CMFC3DAppView::TwoXiece(const std::array<float, 8 * 3>& vertices, CDC* pDC) { // 获取客户区域 CRect clientRect; GetClientRect(&clientRect); // 计算中心点 int centerX = clientRect.Width() / 2; int centerY = clientRect.Height() / 2; // 投影后的顶点坐标 CPoint projected[8]; double cosTheta = cos(m_b); double sinTheta = sin(m_b); for (int i = 0; i < 8; ++i) { double x = vertices[i * 3 + 0]; double y = vertices[i * 3 + 1]; double z = vertices[i * 3 + 2]; // 斜二测投影公式 double px = x + z * m_t * cosTheta; double py = y + z * m_t * sinTheta; // 转换为屏幕坐标(中心点偏移) projected[i].x = centerX + (int)(px); projected[i].y = centerY - (int)(py); } CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); CPen* pOldPen = pDC->SelectObject(&pen); // 立方体边的索引对 static int edges[12][2] = { {0, 1}, {1, 2}, {2, 3}, {3, 0}, {4, 5}, {5, 6}, {6, 7}, {7, 4}, {0, 4}, {1, 5}, {2, 6}, {3, 7} }; // 绘制立方体边 for (int i = 0; i < 12; ++i) { int a = edges[i][0]; int b = edges[i][1]; pDC->MoveTo(projected[a]); pDC->LineTo(projected[b]); } pDC->SelectObject(pOldPen); } // CMFC3DAppView 打印 void CMFC3DAppView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL CMFC3DAppView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CMFC3DAppView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加额外的打印前进行的初始化过程 } void CMFC3DAppView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加打印后进行的清理过程 } void CMFC3DAppView::OnRButtonUp(UINT /* nFlags */, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void CMFC3DAppView::OnContextMenu(CWnd* /* pWnd */, CPoint point) { #ifndef SHARED_HANDLERS theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif } void CMFC3DAppView::OnLButtonDown(UINT nFlags, CPoint point) { CView::OnLButtonDown(nFlags, point); m_startPoint = point; } void CMFC3DAppView::OnLButtonUp(UINT nFlags, CPoint point) { CView::OnLButtonUp(nFlags, point); m_endPoint = point; // 固定大小的正方体 float size = 50.0f; // 固定大小 // 使用起点作为正方体的中心点 float centerX = m_startPoint.x; float centerY = m_startPoint.y; // 创建新的正方体顶点 std::array<float, 8 * 3> newCube = { centerX - size, centerY - size, 0, centerX + size, centerY - size, 0, centerX + size, centerY + size, 0, centerX - size, centerY + size, 0, centerX - size, centerY - size, size * 2, centerX + size, centerY - size, size * 2, centerX + size, centerY + size, size * 2, centerX - size, centerY + size, size * 2 }; // 添加新正方体到列表 m_cubes.push_back(newCube); // 刷新视图 Invalidate(); } #ifdef _DEBUG void CMFC3DAppView::AssertValid() const { CView::AssertValid(); } void CMFC3DAppView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMFC3DAppDoc* CMFC3DAppView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC3DAppDoc))); return (CMFC3DAppDoc*)m_pDocument; } #endif //_DEBUG 这些代码完成一个正方体的斜二侧投影吗?
05-30
// MFCApplicatioView.cpp: CMFCApplicatioView 类的实现 // #include "pch.h" #include "framework.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "MFCApplicatio.h" #endif #include "MFCApplicatioDoc.h" #include "MFCApplicatioView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif const int B_cols = 8; void multiplyMatrices(double A[A_rows][A_cols], double B[A_cols][B_cols], double C[A_rows][B_cols]) { // 初始化结果矩阵 C 为 0 for (int i = 0; i < A_rows; ++i) { for (int j = 0; j < B_cols; ++j) { C[i][j] = 0; } } // 进行矩阵相乘 for (int i = 0; i < A_rows; ++i) { for (int j = 0; j < B_cols; ++j) { for (int k = 0; k < A_cols; ++k) { // 或者用 B_rows,B_rows 和 A_cols 均为 4 C[i][j] += A[i][k] * B[k][j]; } } } } // CMFCApplicatioView IMPLEMENT_DYNCREATE(CMFCApplicatioView, CView) BEGIN_MESSAGE_MAP(CMFCApplicatioView, CView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview) END_MESSAGE_MAP() // CMFCApplicatioView 构造/析构 CMFCApplicatioView::CMFCApplicatioView() noexcept { // TODO: 在此处添加构造代码 } CMFCApplicatioView::~CMFCApplicatioView() { } BOOL CMFCApplicatioView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs); } // CMFCApplicatioView 绘图 void CMFCApplicatioView::OnDraw(CDC* pDC) { // 定义立方体顶点(齐次坐标) double m_cubeVertices[8][4] = { {-1.0, -1.0, -1.0, 1.0}, {1.0, -1.0, -1.0, 1.0}, {1.0, 1.0, -1.0, 1.0}, {-1.0, 1.0, -1.0, 1.0}, {-1.0, -1.0, 1.0, 1.0}, {1.0, -1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0, 1.0} }; double m_transformedVertices[8][4]; // 转换后的顶点 // 斜二侧投影矩阵 double angle = 45.0; // 角度 double scale = 0.5; // 缩放因子 double radians = angle * M_PI / 180.0; double P[4][4] = { {1, 0, 0, 0}, {0, 1, 0, 0}, {scale*cos(radians), scale*sin(radians), 1, 0}, {0, 0, 0, 1} }; // 将顶点重组为4x8矩阵 double vertexMatrix[4][8]; for (int i = 0; i < 8; ++i) { for (int j = 0; j < 4; ++j) { vertexMatrix[j][i] = m_cubeVertices[i][j]; // 转置存储 } } // 结果矩阵 double tempResult[4][8]; multiplyMatrices(P, vertexMatrix, tempResult); // 将结果转存回顶点数组 for (int i = 0; i < 8; ++i) { for (int j = 0; j < 4; ++j) { m_transformedVertices[i][j] = tempResult[j][i]; } } // 归一化齐次坐标 CPoint points[8]; int viewportWidth = GetSystemMetrics(SM_CXSCREEN); int viewportHeight = GetSystemMetrics(SM_CYSCREEN); for (int i = 0; i < 8; ++i) { double x = m_transformedVertices[i][0] / m_transformedVertices[i][3]; double y = m_transformedVertices[i][1] / m_transformedVertices[i][3]; points[i].x = static_cast<int>((x + 1.0) * viewportWidth / 2.0); points[i].y = static_cast<int>(viewportHeight - (y + 1.0) * viewportHeight / 2.0); } // 设置绘图颜色 CPen pen(PS_SOLID, 2, RGB(255, 255, 255)); CPen* pOldPen = pDC->SelectObject(&pen); // 绘制立方体边框 pDC->MoveTo(points[0]); pDC->LineTo(points[1]); pDC->LineTo(points[2]); pDC->LineTo(points[3]); pDC->LineTo(points[0]); pDC->MoveTo(points[4]); pDC->LineTo(points[5]); pDC->LineTo(points[6]); pDC->LineTo(points[7]); pDC->LineTo(points[4]); pDC->MoveTo(points[0]); pDC->LineTo(points[4]); pDC->MoveTo(points[1]); pDC->LineTo(points[5]); pDC->MoveTo(points[2]); pDC->LineTo(points[6]); pDC->MoveTo(points[3]); pDC->LineTo(points[7]); pDC->SelectObject(pOldPen); } // CMFCApplicatioView 打印 BOOL CMFCApplicatioView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CMFCApplicatioView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加额外的打印前进行的初始化过程 } void CMFCApplicatioView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加打印后进行的清理过程 } // CMFCApplicatioView 诊断 #ifdef _DEBUG void CMFCApplicatioView::AssertValid() const { CView::AssertValid(); } void CMFCApplicatioView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMFCApplicatioDoc* CMFCApplicatioView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplicatioDoc))); return (CMFCApplicatioDoc*)m_pDocument; } #endif //_DEBUG // CMFCApplicatioView 消息处理程序
05-30
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值