调用api函数使用双缓冲方式在窗口中画线时的问题
以下程序目的是要在鼠标按下时在窗口中画线。为了避免闪烁,使用了双缓冲方式。但是结果确是屏幕上什么都没有。请高手指点一下到底是哪里出了问题。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static POINT pt;
POINT pt2;
static int cxClient, cyClient;
static HDC srcbuf,realbuf;
static HBITMAP hbitmap;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN: // 左键按下
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
return 0;
case WM_MOUSEMOVE: // 鼠标移动
pt2.x = LOWORD(lParam);
pt2.y = HIWORD(lParam);
if(wParam&MK_LBUTTON){
hdc = GetDC(hWnd);
BitBlt(srcbuf,0,0,cxClient,cyClient,realbuf,0,0,SRCCOPY);
MoveToEx(srcbuf,pt.x,pt.y,NULL);
LineTo(srcbuf,pt2.x,pt2.y);
BitBlt(hdc,0,0,cxClient,cyClient,srcbuf,0,0,SRCCOPY);
DeleteDC(hdc);
}
return 0;
case WM_LBUTTONUP:
BitBlt(realbuf,0,0,cxClient,cyClient,srcbuf,0,0,SRCCOPY);
return 0;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_CREATE:
hdc=GetDC(hWnd);
hbitmap=CreateCompatibleBitmap(hdc,cxClient,cyClient);
srcbuf=CreateCompatibleDC(hdc);
realbuf=CreateCompatibleDC(hdc);
SelectObject(srcbuf,hbitmap);
SelectObject(realbuf,hbitmap);
BitBlt(srcbuf,0,0,cxClient,cyClient,hdc,0,0,SRCCOPY);
BitBlt(realbuf,0,0,cxClient,cyClient,hdc,0,0,SRCCOPY);
DeleteDC(hdc);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}