集美大学计算机工程学院实验报告
课程名称:TCP/IP协议与通信程序设计
班级:
实验成绩
实验项目名称Windows API窗口画线程序设计
学号
上机实践日期:2016—04-07
实验项目编号:03
:1
上机实践时间:  2学时
一、实验目的
理解并熟悉Windows程序消息映射的思想,熟练掌握运用Win32 API技术进行编程的方法。为Windows通信程序打下坚实的基础。
二、实验内容与设计思想
设计一个简单的Win32程序,该程序窗口内正上方居中显示“Windows API画线程序演示”字样,
在程序窗口内任意位置按下鼠标左键并拖动到窗口范围内任意位置,松开鼠标左键即可绘制一条蓝的直线.
三、实验使用环境
操作系统:  Microsoft Windows XP SP2
编程环境:  Visual C++ 6。0中文企业版
、实验步骤和调试过程
详细给出源码以及实现的效果图,并配有代码解释
源码:
#include <windows。h〉
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    TCHAR SoftName[]=TEXT(”划线程序");
    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 (hInstance, SoftName) ;
    wndclass。hCursor      = LoadCursor (NULL, IDC_ARROW) ;
    wndclass。hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName  = NULL ;
    wndclass。lpszClassName = SoftName ;
    if (!RegisterClass (&wndclass))
    {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      SoftName, MB_ICONERROR) ;
          return 0 ;
    }
    hwnd = CreateWindow (SoftName, SoftName,
                          WS_OVERLAPPEDWINDOW,
                          GetSystemMetrics (SM_CXSCREEN) / 4,
                          GetSystemMetrics (SM_CYSCREEN) / 4,
                          GetSystemMetrics (SM_CXSCREEN) / 2,
                          GetSystemMetrics (SM_CYSCREEN) / 2,
                          NULL, NULL, hInstance, NULL) ;
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;
    while (GetMessage (&msg, NULL, 0, 0))
    {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
    }
    return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    static POINT pt[2];//定义存放结构体类型的点的坐标
    PAINTSTRUCT ps;//定义指向包含绘图信息的结构体变量
    HDC hdc;//定义指向设备的句柄
    HPEN hPen;//定义指向画笔的句柄
    RECT        rect ;//定义指向矩形区域的结构体变量
        switch(message)
        {
        case WM_CREATE:
            return 0;
        case WM_LBUTTONDOWN://鼠标点击左键后获取该点的坐标病放到POINT结构体内
            pt[0].x=LOWORD(lParam);
            pt[0].y=HIWORD(lParam);
            return 0;
        case WM_MOUSEMOVE://按下了左键就获取点的坐标并放到结构体内,只要没按下键或按得不是左键俊不获取坐标
            if(wParam & MK_LBUTTON)
            {
                pt[1]。x=LOWORD(lParam);
                pt[1].y=HIWORD(lParam);
            }
            InvalidateRect(hwnd,NULL,TRUE);//窗体重新绘制(用于下一个WM_PAINT消息到来时)
api设计            return 0;
        case WM_PAINT://处理绘图消息
            hdc=BeginPaint(hwnd,&ps);//开始窗口绘制
            GetClientRect (hwnd, &rect); //获取窗口客户区的尺寸
            DrawText (hdc,TEXT("Windows API画线程序演示!"),—1, &rect,
            DT_SINGLELINE | DT_CENTER) ;; //显示文本串
            hPen=CreatePen(PS_SOLID,2,RGB(0,0,255));//创建画笔,样式为实线,宽度为2.颜为蓝
            SelectObject(hdc,hPen);//选择画笔
            MoveToEx(hdc,pt[0].x,pt[0]。y,0);//移到刚才存放的鼠标左键按下的坐标点
            LineTo(hdc,pt[1]。x,pt[1].y);//从当前坐标连线到pt[1]坐标所在位置即划成一条直线
            EndPaint(hwnd,&ps);//释放设备环境句柄,结束窗口绘制
            return 0;
        case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
        }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
}
实验结果:
实验小
六、附录
《网络编程技术与应用》