- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
MSDN 和许多帖子都建议在 WM_PAINT 中使用 BeginPaint/EndPaint。我还看到很多地方表明,如果在绘画中使用双缓冲,那么在 WM_CREATE 中初始化 DC 和 mem 分配并在 WM_PAINT 中重用这些句柄更有意义。
例如,使用 BeginPaint,我经常看到:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
MemDC = CreateCompatibleDC(hdc);
bmp = CreateCompatibleBitmap(hdc, width, height);
oldbmp = SelectObject(MemDC,bmp);
g = new Graphics(MemDC);
//do paint on bmp
//blt bmp back to hdc
EndPaint(hWnd, &ps);
DeleteObject(bmp);
g->ReleaseHDC(MemDC);
DeleteDC(MemDC);
delete g;
为了保存初始化和拆卸,是否可以这样做:
case WM_CREATE:
hdc = GetDC(hWnd);
//create memDC and graphics object references ...
case WM_DESTROY
//delete memDC and graphics object references...
case WM_PAINT
BeginPaint(hWnd, &ps);
//use previously create mem and graphics object to paint
EndPaint(hWnd, &ps);
因此我们只使用 EndPaint 来清除更新区域,并将绘图委托(delegate)给先前创建的对象。
最佳答案
不,这是一个非常糟糕的做法。这首先是由于设备上下文具有错误的剪切区域而出错,当用户调整窗口大小时,您无法正确绘制窗口。
第二个问题是更新区域剪切不会生效,PAINTSTRUCT.rcPaint。当更新区域只是窗口的一部分时,防止 Windows 可能自动执行的任何可能的绘制优化。
第三个问题是您不必要地占用了操作系统资源。所有 GDI 对象都分配在一个堆中,该堆由同一桌面上运行的所有进程共享。
创建 HDC 非常便宜,在需要时创建它。更不用说 PAINTSTRUCT.hdc 了,您可以将其放在盘子上,随时可以使用。
关于winapi - GetDC 与 BeginPaint 性能注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12153472/
假设 GetDC(hWnd) 作为 WM_CREATE 上的第一条 指令被调用,对于窗口 hWnd, GetDC() 是否可能返回 NULL? 我担心 GetDC() 可能因资源不足而失败。当发生这种
基本上,我正在制作模仿屏幕融化效果的东西,但我只能让它在我的主显示器上运行。我已经尽可能多地查找了所有显示器的 GetDC 上只有一个论坛,但它没有用,它所做的只是从我的主显示器到我的辅助显示器制作一
我正在阅读一些 VB6 以转换为 C#。这条线是什么意思? 0& 是否等同于 IntPtr.Zero? //'Get a Device context hdc = GetDC(0&) 这个值用于 pi
我正在学习 OpenGL 并使用 Windows API 进行窗口化。我有一个渲染函数,最后它调用 SwapBuffers(deviceContext)。 一开始我是用GetDC()来获取DC句柄的(
我正在使用此代码获取当前鼠标位置处的对象/窗口的设备上下文(也称为 DC)。 POINT curPos; while (1) { GetCursorPos(&curPos); prin
环顾网络,我发现大多数人认为 GetDC(NULL) 将为整个主要 监视器(左上角为 0,0 的监视器)获取设备上下文。但是,我感觉大多数人只是这么说,因为 GetDC 的 msdn 页面可能就是这么
MSDN 和许多帖子都建议在 WM_PAINT 中使用 BeginPaint/EndPaint。我还看到很多地方表明,如果在绘画中使用双缓冲,那么在 WM_CREATE 中初始化 DC 和 mem 分
我是 C++ 的新手,正在学习如何做的最佳方法。我看到了很多关于绘画的有用示例,但是我没有看到任何带有智能类的简单 pimple getdc。 所以我自己写了一个: class DCObject {
在我的程序(游戏)中,我进行了 GetDC() 调用并将 DC 保存为全局。我想我可以在程序结束时只使用 ReleaseDC()。 目前我遇到了一些问题,因为有些东西绘制不正确。我将 DC 与各种功能
所以,我不断收到断言失败: _AFXWIN_INLINE CDC* CWnd::GetDC() { ASSERT(::IsWindow(m_hWnd)); return CDC::FromHa
我正在处理 Win32 用户界面。我想知道 GetDC 和 BeginPaint 之间的区别。何时使用哪个 API,何时不使用哪个 API。 最佳答案 GetDC 只是将句柄返回到设备上下文,您可以随
Windows API 函数 GetDC() 接受单个参数: hWnd A handle to the window whose DC is to be retrieved. If this valu
这个问题在这里已经有了答案: Difference between GetDC() and BeginPaint() (3 个答案) 关闭 4 年前。 我一直在尝试使用设备上下文,并从 MSDN 文
我想知道 CClientDC 和 CWnd::GetDC 之间是否有任何区别。尽管存在资源分配和语义问题,但两者似乎相当平等。 一个例子: CClientDC dc(this); // "this"
有没有办法获取拥有 win32 DC 的窗口的窗口句柄?或者任何其他可能对识别窗口有用的信息,例如 DC 宽度和高度? 最佳答案 巧的是,还有WindowFromDC . 关于winapi - Win
对于使用 D3D11_RESOURCE_MISC_GDI_COMPATIBLE 创建的纹理,IDXGISurface1 GetDC/ReleaseDC 的线程安全规则是什么? 我可以在另一个线程上的
GetDC(hwnd) 和 GetDC(NULL) 有什么区别?我知道后者获得了整个(虚拟)屏幕的 DC,但我不确定这实际上意味着什么。 我想根据使用的字体设置初始窗口的大小。我使用 CreateFo
我正在使用 MiscFlags D3D11_RESOURCE_MISC_GDI_COMPATIBLE 创建纹理。然而调试层显示以下错误。如果我使用 D3D10_RESOURCE_MISC_GDI_CO
我有一个从本地计算机获取屏幕截图的应用程序。这多年来一直正常工作,直到一位同事突然向我报告他从我的应用程序中收到“句柄无效”错误。 此错误来自 Graphics.CopyFromScreen() 的
可以使用GetDC/ReleaseDC在窗口客户区绘制。但是为了响应 WM_PAINT 消息,必须使用 BeginPaint/EndPaint。这有什么特别的吗? 最佳答案 当窗口的一部分需要更新时,
我是一名优秀的程序员,十分优秀!