调用api函数使用双缓冲方式在窗口中画线时的问题

flyingdog 2004-05-01 03:18:33
以下程序目的是要在鼠标按下时在窗口中画线。为了避免闪烁,使用了双缓冲方式。但是结果确是屏幕上什么都没有。请高手指点一下到底是哪里出了问题。

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;
}

...全文
102 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingdog 2004-05-04
  • 打赏
  • 举报
回复
我终于试出来了,是在WM_CREATE中的原因。
但是为什么在WM_CREATE期间不能这样那?
平时应该放在什么地方那?
菜牛 2004-05-02
  • 打赏
  • 举报
回复
跟踪一下cxClient,cyClient的值。
社会栋梁 2004-05-02
  • 打赏
  • 举报
回复
有残影没有清除背景
社会栋梁 2004-05-02
  • 打赏
  • 举报
回复
不应在WM_CREATE中绘制
在WM_PAINT和WM_LBUTTONDOWN中绘制
好象你的双缓存效果不好
flyingdog 2004-05-02
  • 打赏
  • 举报
回复
怎么没人回答啊?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧