在窗口显示文字和绘制图形

上传人:wt****50 文档编号:35581368 上传时间:2018-03-17 格式:DOC 页数:13 大小:68.50KB
返回 下载 相关 举报
在窗口显示文字和绘制图形_第1页
第1页 / 共13页
在窗口显示文字和绘制图形_第2页
第2页 / 共13页
在窗口显示文字和绘制图形_第3页
第3页 / 共13页
在窗口显示文字和绘制图形_第4页
第4页 / 共13页
在窗口显示文字和绘制图形_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《在窗口显示文字和绘制图形》由会员分享,可在线阅读,更多相关《在窗口显示文字和绘制图形(13页珍藏版)》请在金锄头文库上搜索。

1、昨天和大家谈了如何建立一个带有窗口的 Windows 程序,今天和大家说说如何在窗口中显 示文字吧!先说说相关的基础知识(1).绘制和更新在 Windows 中,只能在窗口的显示区域绘制文字和图形,而且不能确保在显示区域内显示 的内容会一直保留到程序下一次有意地改写它时还保留在那里。例如,使用者可能会在屏 幕上移动另一个程序的窗口,这样就可能覆盖您的应用程序窗口的一部分。Windows 不会 保存您的窗口中被其它程序覆盖的区域,当程序移开后,Windows 会要求您的程序更新显 示区域的这个部分, Windows 通过发送 WM_PAINT 消息通知窗口消息处理程序,窗口的部 分显示区域需要绘

2、制。(2).WM_PAINT 消息大多数 Windows 程序在 WinMain 中进入消息循环之前的初始化期间都要呼叫函数 UpdateWindow。Windows 利用这个机会给窗口消息处理程序发送第一个 WM_PAINT 消息。 这个消息通知窗口消息处理程序:必须绘制显示区域。此后,窗口消息处理程序应在任何 时刻都准备好处理其它 WM_PAINT 消息,必要的话,甚至重新绘制窗口的整个显示区域。(3).有效矩形和无效矩形Windows 内部为每个窗口保存一个绘图信息结构 ,这个结构包含了包围无效区域的最 小矩形的坐标以及其它信息,这个矩形就叫做无效矩形 ,有时也称为无效区域 。如 果在窗

3、口消息处理程序处理 WM_PAINT 消息之前显示区域中的另一个区域变为无效,则 Windows 计算出一个包围两个区域的新的无效区域(以及一个新的无效矩形) ,并将这种 变化后的信息放在绘制信息结构中。Windows 不会将多个 WM_PAINT 消息都放在消息队 列中。窗口消息处理程序可以通过呼叫 InvalidateRect 使显示区域内的矩形无效。如果消息队列中 已经包含一个 WM_PAINT 消息,Windows 将计算出新的无效矩形。否则,它将一个新的 WM_PAINT 消息放入消息队列中。在接收到 WM_PAINT 消息时,窗口消息处理程序可以 取得无效矩形的坐标(我们马上就会看

4、到这一点) 。通过呼叫 GetUpdateRect,可以在任何 时候取得这些坐标。在处理 WM_PAINT 消息处理期间,窗口消息处理程序在呼叫了 BeginPaint 之后,整个显 示区域即变为有效。程序也可以通过呼叫 ValidateRect 函数使显示区域内的任意矩形区域 变为有效。如果这呼叫具有令整个无效区域变为有效的效果,则目前队列中的任何 WM_PAINT 消息都将被删除GDI 相关的内容要在窗口的显示区域绘图,可以使用 Windows 的图形设备接口(GDI)函数(1). 设备内容句柄只不过是一个数值,Windows 以它在内部使用对象。程序写作者从 Windows 取得句柄,

5、然后在其它函数中使用该句柄。设备内容句柄是 GDI 函数的窗口通行证 ,有了这种设 备内容句柄,程序写作者就能自如地在显示区域上绘图,使图形如自己所愿地变得好看或 者难看。设备内容(简称为DC )实际上是 GDI 内部保存的数据结构。设备内容与特定的显示设 备(如视讯显示器或打印机)相关。对于视讯显示器,设备内容总是与显示器上的特定窗 口相关。设备内容中的有些值是图形属性 ,这些属性定义了 GDI 绘图函数工作的细节。例如, 对于 TextOut,设备内容的属性确定了文字的颜色、文字的背景色、x 坐标和 y 坐标映像到 窗口的显示区域的方式,以及显示文字时 Windows 使用的字体。当程序需

6、要绘图时,它必须先取得设备内容句柄。在取得了该句柄后,Windows 用内定的 属性值填入内部设备内容结构。在后面的章节中您会看到,可以通过呼叫不同的 GDI 函数 改变这些默认值。利用其它的 GDI 函数可以取得这些属性的目前值。当然,还有其它的 GDI 函数能够在窗口的显示区域真正地绘图。当程序在显示区域绘图完毕后,它必须释放设备内容句柄。句柄被程序释放后就不再有效, 且不能再被使用。程序必须在处理单个消息处理期间取得和释放句柄。除了呼叫 CreateDC()建立的设备内容之外,程序不能在两个消息之间保存其它设备内容句柄(2) 取得设备内容句柄的方法:方法一:caseWM_PAINT:hd

7、c = BeginPaint (hwnd, 使用 GDI 函数EndPaint (hwnd, return 0 ;在处理 WM_PAINT 消息时,使用这种方法。它涉及 BeginPaint 和 EndPaint 两个函数,这 两个函数需要窗口句柄(作为参数传给窗口消息处理程序)和 PAINTSTRUCT 结构的变量 (在 WINUSER.H 表头文件中定义)的地址为参数在处理 WM_PAINT 消息时,窗口消息处理程序首先呼叫 BeginPaint。BeginPaint 函数一般 在准备绘制时导致无效区域的背景被擦除。该函数也填入 ps 结构的字段。BeginPaint 传回 的值是设备内容

8、句柄,这一传回值通常被保存在叫做 hdc 的变量中HDC 数据型态定义为 32 位的无正负号整数。然后,程序就可以使用需要设备内容句柄的 TextOut 等 GDI 函数。呼叫 EndPaint 即可释放设备内容句柄。方法二:hdc = GetDC (hwnd) ;使用 GDI 函数ReleaseDC (hwnd, hdc) ;主要用来处理非 WM_PAINT 消息处理期间绘制显示区域的某个部分的;主要步骤如下:(1). 得到窗口显示区域的设备内容句柄,可以呼叫 GetDC 来取得句柄,在使用完后呼叫 ReleaseDC;注意:与从 BeginPaint 传回设备内容句柄不同,GetDC 传回

9、的设备内容句柄具有一个剪取矩形, 它等于整个显示区域。可以在显示区域的某一部分绘图,而不只是在无效矩形上绘图(如果确实存在无效矩形) 。与 BeginPaint 不同,GetDC 不会使任何无效区域变为有效。如果需 要使整个显示区域有效,可以呼叫ValidateRect (hwnd, NULL) ;一般可以呼叫 GetDC 和 ReleaseDC 来对键盘消息(如在字处理程序中)和鼠标消息(如在 画图程序中)作出反应。此时,程序可以立刻根据使用者的键盘或鼠标输入来更新显示区 域,而不需要考虑为了窗口的无效区域而使用 WM_PAINT 消息。不过,一旦确实收到了 WM_PAINT 消息,程序就必

10、须要收集足够的信息后才能更新显示。与 GetDC 相似的函数是 GetWindowDC。GetDC 传回用于写入窗口显示区域的设备内容句 柄,而 GetWindowDC 传回写入整个窗口的设备内容句柄。例如,您的程序可以使用从 GetWindowDC 传回的设备内容句柄在窗口的标题列上写入文字。然而,程序同样也应该处 理 WM_NCPAINT (非显示区域绘制 )消息下面请看具体的示例(注意,其中的实现窗口部分的代码是重复前面的代码的,以后再说 的时候就不全部写了,请大家参考前面的代码)#include #include #define NUM 1000#define myTWOPI (2*3

11、.14159)LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)static TCHAR szAppName=TEXT(“SinWave“);HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style=CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.

12、cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.lpszClassName=szAppName;if(!RegisterClass(return 0;

13、 hwnd=CreateWindow(szAppName,TEXT(“Draw Sine Wave Using Polyline“),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,iCmdShow);UpdateWindow(hwnd);while(GetMessage(DispatchMessage(return msg.wParam; LRESULT CALLBACK WndProc(HWND hwnd

14、,UINT message,WPARAM wParam,LPARAM lParam)static int cxClient,cyClient;HDC hdc;int i;PAINTSTRUCT ps;POINT aptNUM; /定义 1000 组数据TCHAR szBuffer40;HPEN hPen;switch(message)/处理 WM_SIZE 消息case WM_SIZE:cxClient=LOWORD(lParam);cyClient=HIWORD(lParam);return 0;case WM_PAINT:hdc=BeginPaint(hwnd,/ TCHAR szBuff

15、er40;注意此行要把 szBuffer 的定义放在消息处编译理的前面,不然 编译会报错的;SetTextColor(hdc,RGB(255,0,0);/设置文字的背景色SetBkColor(hdc,RGB(0,255,255);/*SetTextColor 的 MSDN 文档COLORREF SetTextColor(HDC hdc, / handle to device contextCOLORREF crColor / text color);COLORREF 的文档When specifying an explicit RGB color, the COLORREF value has

16、 the following hexadecimal form: 0x00bbggrr The low-order byte contains a value for the relative intensity of red; the second byte contains a value for green; and the third byte contains a value for blue. The high-order byte must be zero. The maximum value for a single byte is 0xFFThe RGB macro selects a red, green, blue (RGB) color based on the arguments supplied and the color

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号