WEB开发网
开发学院软件开发汇编语言 汇编教程之绘制文本 阅读

汇编教程之绘制文本

 2008-04-28 09:33:08 来源:WEB开发网   
核心提示:分析:这里的大多数代码和第三课中的一样,我只解释其中一些不相同的地方,汇编教程之绘制文本(2),LOCAL hdc:HDCLOCAL ps:PAINTSTRUCTLOCAL rect:RECT这些局部变量由处理 WM_PAINT 消息中的 GDI 函数调用,hdc 用来存放调用 BeginPaint 返回的&ldquo

分析:

这里的大多数代码和第三课中的一样。我只解释其中一些不相同的地方。

LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT

这些局部变量由处理 WM_PAINT 消息中的 GDI 函数调用。hdc 用来存放调用 BeginPaint 返回的“设备环境”句柄。ps 是一个 PAINTSTRUCT 数据类型的变量。通常您不会用到其中的许多值,它由 Windows 传递给 BeginPaint,在结束绘制后再原封不动的传递给 EndPaint。rect 是一个 RECT 结构体类型参数,它的定义如下:

RECT Struct left LONG ?
top LONG ?
right LONG ?
bottom LONG ?
RECT ends

left 和 top 是正方形左上角的坐标。right 和 bottom 是正方形右下角的坐标。客户区的左上角的坐标是 x=0,y=0,这样对于 x=0,y=10 的坐标点就在它的下面。

invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, \
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd, ADDR ps

在处理 WM_PAINT 消息时,您调用BeginPaint函数,传给它一个窗口句柄和未初始化的 PAINTSTRUCT 型参数。调用成功后在 eax 中返回“设备环境”的句柄。下一次,调用 GetClientRect 以得到客户区的大小,大小放在 rect 中,然后把它传给 DrawText。DrawText 的语法如下:

DrawText proto hdc:HDC, lpString:DWORD, nCount:DWORD, lpRect:DWORD, uFormat:DWORD

DrawText是一个高层的调用函数。它能自动处理像换行、把文本放到客户区中间等这些杂事。所以您只管集中精力“绘制”字符串就可以了。我们会在下一课中讲解低一层的函数 TextOut,该函数在一个正方形区域中格式化一个文本串。它用当前选择的字体、颜色和背景色。它处理换行以适应正方形区域。它会返回以设备逻辑单位度量的文本的高度,我们这里的度量单位是像素点。让我们来看一看该函数的参数:

hdc: “设备环境”的句柄。

lpString:要显示的文本串,该文本串要么以NULL结尾,要么在nCount中指出它的长短。

nCount:要输出的文本的长度。若以NULL结尾,该参数必须是-1。

lpRect: 指向要输出文本串的正方形区域的指针,该方形必须是一个裁剪区,也就是说超过该区域的字符将不能显示。

uFormat:指定如何显示。我们可以用 or 把以下标志或到一块:

DT_SINGLELINE:是否单行显示。

DT_CENTER:是否水平居中。

DT_VCENTER :是否垂直居中。

结束绘制后,必须调用 EndPaint 释放“设备环境”的句柄。 好了,现在我们把“绘制”文本串的要点总结如下:

必须在开始和结束处分别调用 BeginPaint 和 EndPaint;

在 BeginPaint 和 EndPaint 之间调用所有的绘制函数;

如果在其它的消息处理中重新绘制客户区,您可以有两种选择:

(1)用GetDC和ReleaseDC代替BeginPaint和EndPaint;

(2)调用InvalidateRect或UpdateWindow让客户区无效,这将迫使WINDOWS把WM_PAINT放入应用程序消息队列,从而使得客户区重绘。

上一页  1 2 

Tags:汇编 教程 绘制

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接