Windows程序设计--(五)绘图基础
5.1 GDI的结构图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视讯显示器和打印机上显示图形。 ? 5.2 设备环境5.2.1 获取设备环境句柄最常用的取得并释放设备内容句柄的方法是,在处理WM_PAINT消息时,使用BeginPaint和EndPaint呼叫: hdc = BeginPaint (hwnd,&ps) ; 其它行程序 EndPaint (hwnd,&ps) ; ? Windows程序还可以在处理非WM_PAINT消息时取得设备内容句柄: hdc = GetDC (hwnd) ; 其它行程序 ReleaseDC (hwnd,hdc) ; ? Windows程序还可以取得适用于整个窗口(而不仅限于窗口的显示区域)的设备内容句柄: hdc = GetWindowDC (hwnd) ; 其它行程序 ReleaseDC (hwnd,hdc) ; ? 5.3 点和线的绘制5.3.1 设定像素SetPixel函数在指定的x和y坐标以特定的颜色设定图素: SetPixel (hdc,x,y,crColor) ; ? 第一个参数是设备内容的句柄。第二个和第三个参数指明了坐标位置。通常要获得窗口显示区域的设备内容,并且x和y相对于该显示区域的左上角。最后一个参数是COLORREF型态指定了颜色。如果在函数中指定的颜色视讯显示器不支持,则函数将图素设定为最接近的纯色并从函数传回该值。 GetPixel函数传回指定坐标处的图素颜色: crColor = GetPixel (hdc,y) ; ? 5.3.2 直线画一条直线,必须呼叫两个函数。第一个函数指定了线的开始点,第二个函数指定了线的终点: MoveToEx (hdc,xBeg,yBeg,NULL) ; LineTo (hdc,xEnd,yEnd) ; ? 绘制直线 #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("WNDCLASS NAME");//窗口类名称 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(DKGRAY_BRUSH);//主窗口背景色 wndclass.lpszMenuName = NULL;//窗口菜单 wndclass.lpszClassName = szAppName;//窗口类名 if (!RegisterClass(&wndclass)) {//注册窗口类,如果注册失败弹出窗口 MessageBox(NULL,TEXT("窗口创建失败!程序需要Windows NT!(传递窗口消息为UNICODE)"),szAppName,MB_ICONERROR);//消息窗口 return 0; } hwnd = CreateWindow(szAppName,//Windows类名 TEXT("窗口绘制成功!"),//窗口标题 WS_OVERLAPPEDWINDOW,//窗口风格 CW_USEDEFAULT,//初始化窗口位置的X坐标 CW_USEDEFAULT,//初始化窗口位置的Y坐标 500,//初始化窗口宽度大小 500,//初始化窗口长度大小 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) { HDC hdc;//设备环境句柄 int x,y; /* typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT 其中left,top赋为0,因此right和bottom表示客户区的宽度和高度(像素) */ RECT rect;//矩形结构 switch (message) {//处理得到的消息 case WM_PAINT://处理窗口绘制 hdc = GetDC(hwnd); GetClientRect(hwnd,&rect);//获取当前位置 for (x = 0; x < rect.right; x += 50) {//竖线 MoveToEx(hdc,NULL);//设置起点 LineTo(hdc,rect.bottom);//设置终点 } for (y = 0; y < rect.bottom; y += 50) {//横线 MoveToEx(hdc,0,NULL); LineTo(hdc,rect.right,y); } ReleaseDC(hwnd,hdc); return 0; case WM_DESTROY://处理窗口关闭时的消息 PostQuitMessage(0);//将退出消息插入消息队列,程序从消息循环退出,return msg.wParam return 0; } return DefWindowProc(hwnd,message,wParam,lParam);//执行默认消息处理 } ? ? 绘制矩形 #include <Windows.h> LRESULT CALLBACK WndProc(HWND,IDC_ARROW);//鼠标,移入内容区域变成箭头 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITENESS);//主窗口背景色 wndclass.lpszMenuName = NULL;//窗口菜单 wndclass.lpszClassName = szAppName;//窗口类名 if (!RegisterClass(&wndclass)) {//注册窗口类,如果注册失败弹出窗口 MessageBox(NULL,//Windows类名 TEXT("Hk_Mayfly"),LPARAM lParam) { HDC hdc;//设备环境句柄 POINT apt[5] = { 100,100,200,100 };//矩形坐标 int i; /* typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT 其中left,&rect);//获取当前位置 MoveToEx(hdc,apt[0].x,apt[0].y,NULL); for (i = 1; i < 5; ++i) { LineTo(hdc,apt[i].x,apt[i].y); } ReleaseDC(hwnd,lParam);//执行默认消息处理 }View Code 使用Polyline替换,也可以绘制矩形。 Polyline(hdc,apt,5); 或者 MoveToEx(hdc,NULL); PolylineTo(hdc,5); ? (编辑:ASP站长网) |