Win32 不在WM_PAINT中画的图形会在窗口重绘时消失,怎么解决

是小黄同学呀 2020-07-07 10:02:30
问题描述:我在做一个绘画板,现在我在WM_LBUTTONDOWN中取得画线的第一个点的坐标,然后在WM_MOUSEMOVE画鼠标移动的线。现在的问题是,每次窗口重绘时都会导致画的线消失,我也尝试过把画线的代码写到WM_PAINT中,但是没有成功。想问大佬们怎么做,本人才学了两个星期,确实很多东西不懂,虚心请教!感谢感谢。下面是我编写的界面还有回调函数。


LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static POINT prePoint, curPoint;
static int i = 0;
static BOOL lBtnIsDown = 0;
static HDC hdc, hMemDC;
static HBITMAP hBitmap, hOldBitmap;
PAINTSTRUCT ps;


static HPEN hPen;
static HPEN oldHpen;


switch (uMsg)
{
case WM_DESTROY:
DeleteObject(hPen);//退出时删掉画笔
PostQuitMessage(0);
break;
case WM_CREATE:
CreateTools(hwnd, uMsg, wParam, lParam); //创建工具栏
hPen = CreatePen(PS_SOLID, 0, RGB(0, 0, 0));//默认黑色的实线画笔
break;
case WM_PAINT:
{
GetCurClientSize(hwnd);
InitWindows(hwnd, uMsg, wParam, lParam);//工具栏,绘画区分区
}
break;
case WM_CTLCOLORBTN://工具栏染色
{
//PaintTools(hwnd, uMsg, wParam, lParam);
hdc = (HDC)wParam;
int id = GetWindowLong((HWND)lParam, GWL_ID);
if (id == BTNCOLOR1)
{
SetBkColor(hdc, RGB(0, 0, 0));
hBrush = CreateSolidBrush(RGB(0, 0, 0));
return(LONG)hBrush;
}
if (id == BTNCOLOR2)
{
SetBkColor(hdc, RGB(255, 255, 255));
hBrush = CreateSolidBrush(RGB(255, 255, 255));
return(LONG)hBrush;
}

for (int i = BTNCOLOR_1, j = 0; i <= BTNCOLOR_20; ++i, ++j)
{
if (id == i)
{
SetBkColor(hdc, color[j]);
hBrush = CreateSolidBrush(color[j]);
return (LONG)hBrush;
}
}
}
break;
case WM_MOUSEMOVE:
{
//lParam的低位(low-order)是鼠标光标的x坐标(x-coordinate)
//lParam的高位(high - order)是鼠标光标的y坐标(y - coordinate)
if (lBtnIsDown)
{
curPoint.x = LOWORD(lParam);
curPoint.y = HIWORD(lParam);
if (curPoint.y < 80)//工具栏区高80,只允许在工具栏下面画
{
curPoint.y = 80;
}
hdc = GetDC(hwnd);
SelectObject(hdc, hPen);
MoveToEx(hdc, prePoint.x, prePoint.y, NULL);
LineTo(hdc, curPoint.x, curPoint.y);
prePoint = curPoint;
ReleaseDC(hwnd, hdc);
}
}
break;
case WM_LBUTTONDOWN:
{
prePoint.x = LOWORD(lParam);
prePoint.y = HIWORD(lParam);
if (prePoint.y > 80)//不允许从工具栏开始画
{
lBtnIsDown = TRUE;
}
}
break;
case WM_LBUTTONUP:
{
curPoint.x = LOWORD(lParam);
curPoint.y = HIWORD(lParam);
lBtnIsDown = FALSE;
}
break;
case WM_COMMAND:
hPen = SelectColor(hwnd, uMsg, wParam, lParam);
break;
default:
break;
}

//此处必须调用DefWindowProc,不能返回0
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
...全文
547 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2020-07-19
  • 打赏
  • 举报
回复
这个需求把MFC的Scribble示例拿来改改就行…… 要学习的话,把这个实例的代码看懂也行。
mmcanyu 2020-07-18
  • 打赏
  • 举报
回复
这种乱七八咋的曲线没法记录point啊,弄个图像处理库吧,比如CxImage。
smwhotjay 2020-07-08
  • 打赏
  • 举报
回复
1.采用楼上的,记录绘制点,在wm_paint里绘制 2.把画好的线整个图片保存bmp,然后wm_paint里把bmp当作背景图。继续画咯。缺点是无法后退撤回。
schlafenhamster 2020-07-08
  • 打赏
  • 举报
回复
记录 点击点 point【】
在 WM_PAINT 中绘制

15,979

社区成员

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

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