问题描述:我在做一个绘画板,现在我在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);
}