新手到GDI.
我正在尝试在Win32表单中模拟鼠标光标.在每个WM_MOUSEMOVE我都有
hCursor = LoadCursor(NULL, IDC_ARROW);
////Get device context
hDeviceContext = GetDC(hwnd);
hDCMem = CreateCompatibleDC(hDeviceContext);
hBitmap = CreateCompatibleBitmap(hDCMem, 50, 50);
hbmOld = SelectObject(hDCMem, hBitmap);
DrawIcon(hDCMem, x, y, hCursor);
SelectObject(hDCMem, hbmOld);
Run Code Online (Sandbox Code Playgroud)
但我没有看到任何被画出来的东西.但是,如果我直接画到DC:
DrawIcon(hDeviceContext , x, y, hCursor);
Run Code Online (Sandbox Code Playgroud)
我确实看到了光标,但是当我移动光标时它不会擦除图像,留下一条长尾巴.
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创建的对象.