dav*_*ave 3 winapi gdi+ gdi wm-paint
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;
Run Code Online (Sandbox Code Playgroud)
要保存初始化和拆除,是否可以执行此操作:
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);
Run Code Online (Sandbox Code Playgroud)
因此,我们仅使用EndPaint清除更新区域,但将图形委托给prev创建的对象.
不,这是一个非常糟糕的做法.这首先由具有错误剪切区域的设备上下文出错,当用户调整窗口大小时,您无法正确绘制窗口.
第二个问题是更新区域剪辑不会生效,PAINTSTRUCT.rcPaint.当更新区域只是窗口的一部分时,防止Windows可能自动执行的任何可能的绘制优化.
第三个问题是您不必要地持有操作系统资源.所有GDI对象都分配在一个堆中,该堆由在同一桌面上运行的所有进程共享.
创建HDC非常便宜,在需要时创建它.更不用说PAINTSTRUCT.hdc,你可以在盘子上送达,随时可以使用.
| 归档时间: |
|
| 查看次数: |
1733 次 |
| 最近记录: |