资源描述
集美大学计算机工程学院实验报告
课程名称:TCP/IP协议及程序设计
班级:
实验成绩:
实验项目名称:Windows API窗口矩形绘制程序设计
学号:
上机实践日期:2016-04-14
实验项目编号:04
组号:1
上机实践时间: 2学时
一、 实验目的
熟悉Windows程序的运行脉络,掌握运用Win32 API技术进行编程的方法。
二、实验内容与设计思想
设计一个简单的Win32程序,该程序窗口内正上方居中显示“Windows API绘制矩形程序演示”字样,在程序窗口内任意位置A按下鼠标左键、并拖动鼠标到任意位置B松开,可以AB为主对角线绘制矩形。并且用红色填充该矩形。
三、实验使用环境
操作系统: Microsoft Windows XP SP2
编程环境: Visual C++ 6.0中文企业版
四、实验步骤和调试过程
详细给出源码以及实现的效果图,并配有代码解释
#include <windows.h>
#include <stdio.h>
static POINT pt_star,pt_end;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
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 NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("3062,3076,3080,3083,43073"), // window caption
WS_OVERLAPPEDWINDOW , // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
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)
{
HDC hdc ;
PAINTSTRUCT ps ;
static bool bJude = false;
TCHAR szBuffer[] = "";
RECT rect ;
switch (message)
{
case WM_LBUTTONDOWN:
pt_end.x = pt_star.x = LOWORD(lParam);
pt_end.y = pt_star.y = HIWORD(lParam); //获得按下坐标;掩盖掉第一次按下时鼠标移动
bJude = true;
return 0;
case WM_MOUSEMOVE:
if(bJude)
{
hdc = GetDC(hwnd);
SelectObject(hdc,GetStockObject(NULL_BRUSH));
SetROP2(hdc,R2_NOT); //防止重影
Rectangle(hdc,pt_star.x,pt_star.y,pt_end.x,pt_end.y);
pt_end.x = LOWORD(lParam);
pt_end.y = HIWORD(lParam);
Rectangle(hdc,pt_star.x,pt_star.y,pt_end.x,pt_end.y);
ReleaseDC(hwnd,hdc);
}
return 0;
case WM_LBUTTONUP:
bJude = false;
pt_end.x = LOWORD(lParam);
pt_end.y = HIWORD(lParam);
InvalidateRect(hwnd,NULL,true);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd , &ps);
SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
ShowCursor (TRUE) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("Windows API画线程序演示"), -1, &rect,
DT_SINGLELINE | DT_CENTER) ;
SelectObject(hdc,CreateSolidBrush(RGB(255,0,0)));
Rectangle(hdc,pt_star.x,pt_star.y,pt_end.x,pt_end.y);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
图(1)
图(2)
五、实验小结
图(3)
在防重影这一块,如果没有执行这一块代码,会导致画图过程中没有图(1)的框的效果;直接出现图2的效果;
本次实验过程基于实验3之上,做实验的过程中由于有上次实验的经验以及代码,编写代码的过程较快,这次实验主要是一个自制画刷的过程较为深刻,小组成员讨论较久,小组成员也深刻的体会到了SelectObject(hdc,CreateSolidBrush(RGB(255,0,0)));
这一语法的应用,以及在选取brush和pen的过程体会较深。
case WM_PAINT:
hdc = BeginPaint(hwnd , &ps);
SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Rectangle(hdc,pt_star.x,pt_star.y,pt_end.x,pt_end.y);
EndPaint(hwnd,&ps);
return 0;
这块代码是从网上找的实例,刚开始,小组成员以为会有RED_BRUSH这类语法,后来程序执行不了,才发现了自定画刷的做法:
SelectObject(hdc,CreateSolidBrush(RGB(255,0,0)));
这是本次实验过程中最为深刻的一个点。
图(4)
这一块代码是覆盖前一次画的矩形的图,如果缺失这一块代码会出现以下情况:
图(5)
无论鼠标从什么坐标开始点击左键,矩形框总是从最左上角开始绘图,而且只需点击一次左键便能画出矩形图。
六、附录
《网络编程技术与应用》
展开阅读全文