- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道 CClientDC 和 CWnd::GetDC 之间是否有任何区别。尽管存在资源分配和语义问题,但两者似乎相当平等。
一个例子:
CClientDC dc(this); // "this" is sub-classed object of CWnd
CGdiObject* oldObj = dc.SelectStockObject(WHITE_BRUSH);
... do some with dc ...
dc.SelectObject(oldObj);
// Device object is stack object, ReleaseDC called automaticly
或
CDC* dc = this->GetDC(); // "this" is sub-classed object of CWnd
CGdiObject* oldObj = dc->SelectStockObject(WHITE_BRUSH);
... do some with dc ...
dc->SelectObject(oldObj);
// Device context belongs to a window class no need to call ReleaseDC
// I don't allocate dc, so I don't delete it
除了语义不同之外,这两个代码片段看起来完全相同,但如果有区别的话,区别在哪里呢?我有什么需要关注他们的使用。
GetDC() 只是 CClientDC(this) 的捷径吗?我有点困惑。
编辑:在某些情况下,CClientDC() 返回的设备上下文与 GetDC() 返回的设备上下文不同,我想知道原因。
例子:
HRC hRC = wglCreateContext(GetDC()->m_hDC); // work's as expected.
但是
ClientDC dc(this)
HRC hRC = wglCreateContext(dc.m_hDC); // does not work as expected, output in
// clients device context not screen visible.
因此,同一窗口中的两个客户端设备上下文之间肯定存在细微差别,但 MSDN 并未提供这方面的信息。 CClientDC 参见 MSDN 上的功能说明和 GetDC .
最佳答案
有 3 种类型的 DC:普通 DC、类 DC 和私有(private) DC。如果 GetDC() 返回一个公共(public) DC,则必须对其调用 ReleaseDC()。如果 GetDC() 返回类 DC 或私有(private) DC,则调用 ReleaseDC() 时不会发生任何事情。
所以你的第二段代码很可能存在资源泄漏。
本文详细介绍了 3 种类型的 DC:http://www.codeproject.com/Articles/2078/Guide-to-WIN32-Paint-for-Intermediates
关于c++ - CClientDC 和 CWnd::GetDC 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15262903/
根据 msdn ,当我用 CWnd::FromHandle 得到 CWnd* 时, The pointer may be temporary and should not be stored for
我在一个高度多线程的应用程序上遇到了无数次崩溃。 阅读这些 MSDN page , technical note和 this article on TLS ,我已经了解 CWnd 对象被映射到 Thr
我有一个动态创建的 CWnd 窗口,标题栏区域和任务栏的图标似乎是随机选择的。 要设置图标,我调用: // Set the icon for this dialog. The framework d
我的应用程序具有基于 ATL 的 GUI(CWnd、CDialog、...),它由多个页面(CDialog)组成。其中一个页面是空的,但它有一个占位符框架 (CWnd),可随对话框调整大小。一切都构建
H, 我有一个旧的 MFC 应用程序,它有一个继承自 CWnd 的类。我正在与原作者交谈,他说 Cwnd::Create() 创建了一个新线程。但是,我在 MSDN 文档中找不到对此的任何引用 htt
我正在尝试调用 CWnd 类的函数 GetParent()。每次都会抛出异常。我正在从工作线程调用该函数。 这是导致异常的行:CWnd* parent = this->GetParent(); 我也试
我有一个显示图像的自定义控件。当图像超过可显示大小时,它会显示滚动条。出于某种原因,我想知道是否显示水平或垂直滚动条。我在 CWnd 类中找不到任何直接函数。 我找到了 GetScrollBarI
我编写了一个 MFC 应用程序,需要一个不会将输入焦点从另一个窗口移开的按钮。 不幸的是,当用户用鼠标单击按钮时,删除 WS_TABSTOP 样式没有帮助。当我阻止 WM_LBUTTONDOWN 时,
我目前大量使用这样的代码来确定控件在窗口客户区内的位置: CRect rect; GetDlgItem(IDC_CONTROL_ID)->GetWindowRect(&rect); ScreenToC
如何获取 CWnd* 的高度和宽度? CWnd 窗口是否正确?为什么不是命令: CWnd* parent = this->GetParent(); // C++ command parent->Get
背景 MFC CWnd::SetTimer调用 WinAPI 的 SetTimer简单地。 _AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEve
我有一个 CWnd 类名 mywindow 的成员 我想给它添加一个滚动条。 我该怎么做? 我已经尝试做: mywindow.EnableScrollBarCtrl(SB_BOTH,TRUE); 它显
我有一个对话框,CFormView,其中包含一些按钮和一个面板,其中包含 Tabcontrol、单选按钮、文本输入字段等。 因此,在我的面板 CWnd 上,我创建了如下输入字段: pEdit = ne
(最后一行有一个 TL;DR) 我正在实现一个处理程序来关闭在软件应用程序中打开的选定窗口。这是一个粗略的代码: void CDlg_Dummy_Dialog::OnCloseWindows() {
我正在编写一个带有多个控件的 MFC 对话框。我目前有一个 CWnd,它位于 dialog 的右半部分。单击编辑按钮后,子 CWnd 会调整大小以占据对话框的较大部分。 但是,现在当我尝试调整窗口大小
如果我有一个带有按钮控件的 MFC 对话框,有没有办法使用按钮的 ID(例如 IDC_BUTTON_YES)为该控件构造 HWND 或 CWND? 最佳答案 是的,可以使用MFC对话框的GetDlgI
所以我有一个 MFC 应用程序,当我们执行某些操作时它会闪烁。所以我想我应该设置 SetRedraw(false) 并在函数结束时将其设置为 true。 该应用程序不再刷新,但如果我在 SetRedr
我是一个 C++ 新手,所以请多多包涵。 位于函数内的这行代码: CWnd* pWnd = CWnd::FindWindow("Shell_TrayWnd", ""); CWnd 显示为“未定义”。我
我正在处理我们的 32 位 MFC VC2010 应用程序中出现的偶发生产问题。该应用程序在 Windows Server 2008 R2 Standard SP1 64 位上运行。 此问题是由于无法
我有一个派生自 CWnd 的自定义类,我想从工作线程向其发布消息。我正在使用 PostMessage 函数来实现这一点。 PostMessage 的第一个参数是我的类的 HWND 类型句柄,接下来是我
我是一名优秀的程序员,十分优秀!