vc中建了一个窗口用鼠标左键画线,可是最小化窗口之后线就消失了,怎样解决?
最好能用向量先把这些点的坐标存起来,在重绘的方法,求正解?做了半天还是不会。部分代码LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage...
最好能用向量先把这些点的坐标存起来,在重绘的方法,求正解?做了半天还是不会。部分代码
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
POINTS ptNew;
hdc = GetDC(hwnd);
if(hdc != NULL)
{
char str[12];
sprintf(str, "%d", uCounter++);
//输出文字
TextOut(hdc, 0, 0, str, strlen(str));
ReleaseDC(hwnd, hdc);
}
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("HelloWin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
FrameRect(hdc, &rect, (HBRUSH) GetStockObject (GRAY_BRUSH));
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_LBUTTONDOWN:
ptOld = MAKEPOINTS(lParam);
bIsLBD = TRUE;
return 0;
case WM_LBUTTONUP:
bIsLBD = FALSE;
return 0;
case WM_MOUSEMOVE:
if(bIsLBD)
{
//画内容
hdc = GetDC(hwnd);
//新点的坐标
ptNew = MAKEPOINTS(lParam);
//画线
::MoveToEx(hdc, ptOld.x, ptOld.y, NULL);
::LineTo(hdc, ptNew.x, ptNew.y);
//保存坐标点
ptOld = ptNew;
ReleaseDC(hwnd, hdc);
}
return DefWindowProc(hwnd, message, wParam, lParam);
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
} 展开
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
POINTS ptNew;
hdc = GetDC(hwnd);
if(hdc != NULL)
{
char str[12];
sprintf(str, "%d", uCounter++);
//输出文字
TextOut(hdc, 0, 0, str, strlen(str));
ReleaseDC(hwnd, hdc);
}
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("HelloWin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
FrameRect(hdc, &rect, (HBRUSH) GetStockObject (GRAY_BRUSH));
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_LBUTTONDOWN:
ptOld = MAKEPOINTS(lParam);
bIsLBD = TRUE;
return 0;
case WM_LBUTTONUP:
bIsLBD = FALSE;
return 0;
case WM_MOUSEMOVE:
if(bIsLBD)
{
//画内容
hdc = GetDC(hwnd);
//新点的坐标
ptNew = MAKEPOINTS(lParam);
//画线
::MoveToEx(hdc, ptOld.x, ptOld.y, NULL);
::LineTo(hdc, ptNew.x, ptNew.y);
//保存坐标点
ptOld = ptNew;
ReleaseDC(hwnd, hdc);
}
return DefWindowProc(hwnd, message, wParam, lParam);
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
} 展开
3个回答
展开全部
画线的代码放错了地方。所有绘制代码都应该放到WM_PAINT消息里去。
处理鼠标消息的时候不要画线,只要把坐标记录下来,并且调用InvalidateRect()。
在WM_PAINT里用保存的坐标点去画线。
处理鼠标消息的时候不要画线,只要把坐标记录下来,并且调用InvalidateRect()。
在WM_PAINT里用保存的坐标点去画线。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没有细看你的程序。粗看问题在开关语句中的 return,(相当于平时用的 break;)
switch (message)
{
case xxx : ....; return 0;
.....
case WM_PAINT:
做画图工作
存点大于2,补画线条
return 0;
case WM_MOUSEMOVE:
做画图工作。
存点(到全局量),计数器记数。
画完 return 0; // 用0,不用DefW....
最后一个 case xx : ...return 0; 下来 是
default:
return DefWindowProc(hwnd,message,wParam,lParam);
} // 开关语句结束
switch (message)
{
case xxx : ....; return 0;
.....
case WM_PAINT:
做画图工作
存点大于2,补画线条
return 0;
case WM_MOUSEMOVE:
做画图工作。
存点(到全局量),计数器记数。
画完 return 0; // 用0,不用DefW....
最后一个 case xx : ...return 0; 下来 是
default:
return DefWindowProc(hwnd,message,wParam,lParam);
} // 开关语句结束
追问
就是这个点怎么存放我不太会!!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当你挪动窗口或者改变窗口大小是 窗口进行了重绘,在ONDRAW里绘图或这利用双缓冲技术绘图就不会消失了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询