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);//执行默认消息处理 } 使用Polyline替换,也可以绘制矩形。 Polyline(hdc,apt,5); 或者 MoveToEx(hdc,NULL);
PolylineTo(hdc,5);
? 绘制正弦曲线 #include <Windows.h> #include <math.h> #define NUM 1000 #define TWOPI (2*3.14159) LRESULT CALLBACK WndProc(HWND,//初始化窗口位置的Y坐标 1000,//初始化窗口高度大小 NULL,LPARAM lParam) { HDC hdc;//设备环境句柄 PAINTSTRUCT ps; static int cxClient,cyClient; int i; POINT apt[NUM]; switch (message) {//处理得到的消息 case WM_SIZE: cxClient = LOWORD(lParam);//客户区宽度 cyClient = HIWORD(lParam);//客户区的高度 return 0; case WM_PAINT://处理窗口绘制 hdc = BeginPaint(hwnd,&ps); MoveToEx(hdc,0,cyClient / 2,NULL);//中间横线 LineTo(hdc,cxClient,cyClient / 2); for (i = 0; i < NUM; i++) { apt[i].x = i * cxClient / NUM; apt[i].y = (int)(cyClient / 2 * (1 - sin(TWOPI * i / NUM))); //apt[i].x = i*15; //apt[i].y = (int)cyClient*sin(0.1*i); } Polyline(hdc,NUM); EndPaint(hwnd,&ps); return 0; case WM_DESTROY://处理窗口关闭时的消息 PostQuitMessage(0);//将退出消息插入消息队列,lParam);//执行默认消息处理 } ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何在Windows上关闭Eclipse控制台
- Windows – 为什么CreateProcess给出错误193(%1不是有效的
- windows – 在我的应用程序退出之前终止的线程上调用CoUnin
- Windows Server 2012 R2智能卡限制
- Windows批处理脚本:将所有输出重定向到文件
- 如何通过cmd命令远程重启或远程关闭Windows服务器
- 批处理文件 – Dos批处理:写入没有行结尾的文件
- Windows上的GIMP – 从命令行执行python-fu脚本
- active-directory – 如何验证Windows Server 2008R2 Activ
- winapi – Win32 CRITICAL_SECTION包含什么?