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

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

正在做一个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。

#include "stdafx.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "My.h" #endif #include "MyDoc.h" #include "MyView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMyView IMPLEMENT_DYNCREATE(CMyView, CView) BEGIN_MESSAGE_MAP(CMyView, 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() // CMyView 构造/析构 CMyView::CMyView() { // TODO: 在此处添加构造代码 } CMyView::~CMyView() { } BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs); } // CMyView 绘制 void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; for (const auto& bubble : m_vBubbles) { CBrush brush(bubble.m_clr); CBrush* pOldBrush = pDC->SelectObject(&brush); pDC->Ellipse(bubble.m_ptPos.x - 10, bubble.m_ptPos.y - 10, bubble.m_ptPos.x + 10, bubble.m_ptPos.y + 10); pDC->SelectObject(pOldBrush);// TODO: 在此处为本机数据添加绘制代码 } // CMyView 打印 BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加额外的打印前进行的初始化过程 } void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加打印后进行的清理过程 } // CMyView 诊断 #ifdef _DEBUG void CMyView::AssertValid() const { CView::AssertValid(); } void CMyView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMyDoc* CMyView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); return (CMyDoc*)m_pDocument; } // CMyView 消息处理程序 void CMyView::OnStart() { if (!m_bStarted) { m_bStarted = true; SetTimer(1, 50, NULL); // 每50毫秒触发一次 } } void CMyView::OnStop() { m_bStarted = false; KillTimer(1); } void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { if (m_bStarted) m_vBubbles.emplace_back(point, RGB(255, 0, 0)); // 红色泡泡 CView::OnLButtonDown(nFlags, point); } void CMyView::OnRButtonDown(UINT nFlags, CPoint point) { if (m_bStarted) m_vBubbles.emplace_back(point, RGB(0, 0, 255)); // 蓝色泡泡 CView::OnRButtonDown(nFlags, point); } void CMyView::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 1 && !m_vBubbles.empty()) { for (auto it = m_vBubbles.begin(); it != m_vBubbles.end();) { it->m_ptPos.y -= 5; // 向上移动 if (it->m_ptPos.y < 0) it = m_vBubbles.erase(it); // 移除超出屏幕顶端的泡泡 else ++it; } Invalidate(); // 重绘窗口 } CView::OnTimer(nIDEvent); } #endif //_DEBUG
08-27
这是.cpp的代码// MOView.cpp : CMOView 类的实现 // #include "stdafx.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "MO.h" #endif #include "MODoc.h" #include "MOView.h" #include <cmath> // 移到此处(确保cos/sin能被找到) #ifdef _DEBUG #define new DEBUG_NEW #endif // CMOView IMPLEMENT_DYNCREATE(CMOView, CView) // 修正:只保留一个消息映射,把ON_WM_KEYDOWN加在这里 BEGIN_MESSAGE_MAP(CMOView, 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_KEYDOWN() // 新增:方向键消息 END_MESSAGE_MAP() // CMOView 构造/析构 CMOView::CMOView() { m_x = 0; // 初始居中(偏移为0) m_y = 0; m_R = 100; // 五角星大小 } CMOView::~CMOView() { } BOOL CMOView::PreCreateWindow(CREATESTRUCT& cs) { return CView::PreCreateWindow(cs); } // CMy1View 绘制 void CMOView::OnDraw(CDC* pDC) { CMODoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // 1. 获取窗口中心 CRect rect; GetClientRect(&rect); int centerX = rect.Width()/2 + m_x; int centerY = rect.Height()/2 + m_y; // 2. 计算五角星10个顶点 POINT pts[10]; double innerR = m_R * 0.382; // 内凹半径 for(int i=0; i<10; i++){ double angle = 2*3.14159*i/10 - 3.14159/2; // 从正上方开始 double r = (i%2==0) ? m_R : innerR; // 外/内顶点 pts[i].x = centerX + static_cast<int>(r*cos(angle)); // 强制转int(避免精度问题) pts[i].y = centerY + static_cast<int>(r*sin(angle)); } // 3. 画红色五角星(填充) CBrush brush(RGB(255,0,0)); CBrush* pOldBrush = pDC->SelectObject(&brush); // 保存旧画刷 pDC->Polygon(pts, 10); pDC->SelectObject(pOldBrush); // 恢复旧画刷(避免内存泄漏) } // CMOView 打印 BOOL CMOView::OnPreparePrinting(CPrintInfo* pInfo) { return DoPreparePrinting(pInfo); } void CMOView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { } void CMOView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { } // CMOView 诊断 #ifdef _DEBUG void CMOView::AssertValid() const { CView::AssertValid(); } void CMOView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMODoc* CMOView::GetDocument() const { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMODoc))); return (CMODoc*)m_pDocument; } #endif //_DEBUG // 方向键响应函数(移到此处) void CMOView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { const int step = 10; switch(nChar){ case VK_LEFT: m_x -= step; break; case VK_RIGHT: m_x += step; break; case VK_UP: m_y -= step; break; case VK_DOWN: m_y += step; break; } InvalidateRect(NULL); CView::OnKeyDown(nChar, nRepCnt, nFlags); }
11-04
这里头是报告要求这是cpp的代码// MOView.cpp : CMOView 类的实现 // #include "stdafx.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "MO.h" #endif #include "MODoc.h" #include "MOView.h" #include <cmath> // 移到此处(确保cos/sin能被找到) #ifdef _DEBUG #define new DEBUG_NEW #endif // CMOView IMPLEMENT_DYNCREATE(CMOView, CView) // 修正:只保留一个消息映射,把ON_WM_KEYDOWN加在这里 BEGIN_MESSAGE_MAP(CMOView, 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_KEYDOWN() // 新增:方向键消息 END_MESSAGE_MAP() // CMOView 构造/析构 CMOView::CMOView() { m_x = 0; // 初始居中(偏移为0) m_y = 0; m_R = 100; // 五角星大小 } CMOView::~CMOView() { } BOOL CMOView::PreCreateWindow(CREATESTRUCT& cs) { return CView::PreCreateWindow(cs); } // CMy1View 绘制 void CMOView::OnDraw(CDC* pDC) { CMODoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // 1. 获取窗口中心 CRect rect; GetClientRect(&rect); int centerX = rect.Width()/2 + m_x; int centerY = rect.Height()/2 + m_y; // 2. 计算五角星10个顶点 POINT pts[10]; double innerR = m_R * 0.382; // 内凹半径 for(int i=0; i<10; i++){ double angle = 2*3.14159*i/10 - 3.14159/2; // 从正上方开始 double r = (i%2==0) ? m_R : innerR; // 外/内顶点 pts[i].x = centerX + static_cast<int>(r*cos(angle)); // 强制转int(避免精度问题) pts[i].y = centerY + static_cast<int>(r*sin(angle)); } // 3. 画红色五角星(填充) CBrush brush(RGB(255,0,0)); CBrush* pOldBrush = pDC->SelectObject(&brush); // 保存旧画刷 pDC->Polygon(pts, 10); pDC->SelectObject(pOldBrush); // 恢复旧画刷(避免内存泄漏) } // CMOView 打印 BOOL CMOView::OnPreparePrinting(CPrintInfo* pInfo) { return DoPreparePrinting(pInfo); } void CMOView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { } void CMOView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { } // CMOView 诊断 #ifdef _DEBUG void CMOView::AssertValid() const { CView::AssertValid(); } void CMOView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMODoc* CMOView::GetDocument() const { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMODoc))); return (CMODoc*)m_pDocument; } #endif //_DEBUG // 方向键响应函数(移到此处) void CMOView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { const int step = 10; switch(nChar){ case VK_LEFT: m_x -= step; break; case VK_RIGHT: m_x += step; break; case VK_UP: m_y -= step; break; case VK_DOWN: m_y += step; break; } InvalidateRect(NULL); CView::OnKeyDown(nChar, nRepCnt, nFlags); } 这是,h的代码// MOView.h : CMOView 类的接口 // #pragma once // 注意:你的项目类名是CMOView(不是C1View),要保持一致 class CMOView : public CView { protected: // 仅从序列化创建 CMOView(); DECLARE_DYNCREATE(CMOView) // 特性 public: CMODoc* GetDocument() const; // 操作 public: // 重写 public: virtual void OnDraw(CDC* pDC); // 重写以绘制该视图 virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); // 实现 public: virtual ~CMOView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif // ********** 修正:变量放在当前类的private区域 ********** private: int m_x; // 五角星水平偏移 int m_y; // 五角星垂直偏移 int m_R; // 五角星外圆半径 // 生成的消息映射函数 protected: DECLARE_MESSAGE_MAP() afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); }; #ifndef _DEBUG // 1View.cpp 中的调试版本 inline CMy1Doc* CMy1View::GetDocument() const { return reinterpret_cast<CMy1Doc*>(m_pDocument); } #endif根据图片的要求写出一份报告来报告要在文档里不超过四页
最新发布
11-04
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值