重写HwndHost的OnRenderSizeChanged报访问权限降低错误
错误产生原因
C++/CLI 对虚方法重写有明确约束:重写版本的访问权限不得窄于基类原方法的访问权限。OnRenderSizeChanged 是基类 FrameworkElement(HwndHost 的父类)定义的 protected virtual 方法,你当前的重写代码没有显式声明访问修饰符,而C++/CLI中类成员的默认访问级别为private,相当于将原方法的访问权限从protected收窄为private,违反了重写的访问权限约束,因此编译器抛出“以降低的访问权限重写方法”错误。
修复方法
给重写的OnRenderSizeChanged方法显式添加protected访问修饰符即可,方法内部的OpenGL视口、投影矩阵设置逻辑不存在语法问题。修正后的完整方法代码如下:
protected: virtual void OnRenderSizeChanged(SizeChangedInfo^ sizeInfo) override { if (m_hDC == NULL || m_hRC == NULL) return; // DPI适配修正 // 注意:sizeInfo->NewSize为双精度浮点值,先做乘法运算再转整型避免精度损失 int iHeight = (int)(sizeInfo->NewSize.Height * m_dScaleY); int iWidth = (int)(sizeInfo->NewSize.Width * m_dScaleX); if (iWidth == 0 || iHeight == 0) return; wglMakeCurrent(m_hDC, m_hRC); glViewport(0, 0, iWidth, iHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0); // gluPerspective( 67.5, ((double)(iWidth) / (double)(iHeight)), 1.0, 500.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
注:你参考的两份WPF托管Win32窗口的教程示例中,均对该重写方法显式声明了protected访问级别,漏写访问修饰符是触发本次编译错误的唯一原因。
内容的提问来源于stack exchange,提问作者Distinct_Cabinet
相关产品推荐
相关产品推荐

