求解-win32画直线,该怎么处理
求解--win32画直线
要求:用WIN32(C++)画一条直线,用MoveToEx()和LineTo()实现,以下是小弟的实现:假设鼠标点下左键后,系统获得该点A的坐标,再点下一点B后获得该点坐标,将AB两点连起来即可。想作出如下改进:如果再点两点C、D,则保留AB,同时连结CD,请大侠指导。以下是原代码:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAPPName[] = TEXT( "DrawLine ");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAPPName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT( "This Program requires windows XP! "),szAPPName,MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAPPName,TEXT( "Drawing Line "),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
static int flag1 = 0;
static int flag2 = 0;
int iCount = 0;
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static POINT pt[3];
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_LBUTTONUP:
if (flag1 == 0)
{
pt[0].x = LOWORD(lParam);
pt[0].y = HIWORD(lParam);
flag1 = 1;
}
if (flag1 == 1)
{
pt[1].x = LOWORD(lParam);
pt[1].y = HIWORD(lParam);
flag2 = 1;
pt[2]=pt[0];pt[0]=pt[1];pt[1]=pt[2];
InvalidateRect(hwnd,NULL,TRUE);
}
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
if (flag1 == 1 && flag2 == 1)
{
MoveToEx (hdc, pt[0].x, pt[0].y, NULL);
LineTo(hdc,pt[1].x,pt[1].y);
}
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
------解决方案--------------------
..............
static POINT pt[4];
..................
case WM_LBUTTONUP:
if (flag1 <= 4)
{
pt[flag1 ].x = LOWORD(lParam);
pt[flag1 ].y = HIWORD(lParam);
flag1++;
}
if (flag > = 2)
{
InvalidateRect(hwnd,NULL,TRUE);
}
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
要求:用WIN32(C++)画一条直线,用MoveToEx()和LineTo()实现,以下是小弟的实现:假设鼠标点下左键后,系统获得该点A的坐标,再点下一点B后获得该点坐标,将AB两点连起来即可。想作出如下改进:如果再点两点C、D,则保留AB,同时连结CD,请大侠指导。以下是原代码:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAPPName[] = TEXT( "DrawLine ");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAPPName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT( "This Program requires windows XP! "),szAPPName,MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAPPName,TEXT( "Drawing Line "),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
static int flag1 = 0;
static int flag2 = 0;
int iCount = 0;
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static POINT pt[3];
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_LBUTTONUP:
if (flag1 == 0)
{
pt[0].x = LOWORD(lParam);
pt[0].y = HIWORD(lParam);
flag1 = 1;
}
if (flag1 == 1)
{
pt[1].x = LOWORD(lParam);
pt[1].y = HIWORD(lParam);
flag2 = 1;
pt[2]=pt[0];pt[0]=pt[1];pt[1]=pt[2];
InvalidateRect(hwnd,NULL,TRUE);
}
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
if (flag1 == 1 && flag2 == 1)
{
MoveToEx (hdc, pt[0].x, pt[0].y, NULL);
LineTo(hdc,pt[1].x,pt[1].y);
}
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
------解决方案--------------------
..............
static POINT pt[4];
..................
case WM_LBUTTONUP:
if (flag1 <= 4)
{
pt[flag1 ].x = LOWORD(lParam);
pt[flag1 ].y = HIWORD(lParam);
flag1++;
}
if (flag > = 2)
{
InvalidateRect(hwnd,NULL,TRUE);
}
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);