主题:  [求助}請問製作互動式繪圖中,如何實現繪製Polygon功能

davichiu

职务:普通成员
等级:1
金币:0.0
发贴:21
#12002/8/23 15:44:17
我有個困擾的問題,因為要製作一個互動式繪圖
功能,繪製結果如圖所示,但是如果利用aw自帶的
drawline只能繪製空心的polygon ,如果要繪製
一個可以填滿顏色或樣式的polygon,該如何做
呢?(例如使用者在畫面點選四個點,程式即可繪
制一個不規則的四邊形)


關於繪圖的程式設計,似乎可以使用gdi32.dll來實現
在AW中有winapi.u32對應這個動態連接庫,其中就有
polygon的指令,有誰會使用? 我看了很多關於AW使用
winapi.u32,但是大都是提到User32.dll的功能,關於
gdi32.dll繪圖功能就不曾看過了,貴站也關於winapi
說明但是是以VB寫法寫成,如果要設計像在authorware
顯示圖示會出現的繪圖工具的功能,如縮放,移動,更改
圖形的點位置,群組,該如何進行,繪製曲線或多邊形的
AW例子還未見過,有人肯花時間設計這樣的例子嗎?

回到正提,這裏我想要求助的問題是
有誰會使用winapi.u32中的polygon的指令呢?

在VB上使用user32.dll中polygon指令,首先宣告
Declare Function Polygon Lib "gdi32" Alias "Polygon"
(Byval hdc As Long, lpPoint As POINTAPI, Byval nCount
As Long) As Long
然后大致的用法如下
Dim Point (0 To 3) As POINTAPI
Point(0).X=0 : Points(0).Y=0
Point(0).X=0 : Points(0).Y=0
Point(0).X=0 : Points(0).Y=0
Point(0).X=0 : Points(0).Y=0
Polygon Me.hdc, Point(0) ,4
其中的ipPoint是由點所構成的陣列(POINTAPI)所構成的陣列
寫法如上所示

但是在AW中使用winapi.u32中Polygon指令,其描述如下
BOOL=Polygon(HDC,CONST POINT*,int)
其中的ipPoint 寫成 CONT POINT*
我不知道這個數組該如何使用,如何寫程式
請問有誰可以告訴我如何寫這個數組,如何
正確使用polygon這個指令

如果可以的話可否email告訴我在討論版留下訊息,謝謝
davichiu@pchome.com.tw



魔岩

职务:版主
等级:6
金币:34.0
发贴:4453
#22002/8/23 20:45:24

编辑历史:[这消息被Rock编辑过(编辑时间2002-08-23 20:46:29)]


魔岩

职务:版主
等级:6
金币:34.0
发贴:4453
#32002/8/24 0:18:30
AW能够支持的函数参数类型有限,但是可以考虑用memtools.u32 构造数据结构,然后在aw里使用winapi.u32 的Polygon

具体做法我需要研究一下(Y好象是这方面的专家,快出手

谁有类似的VB范例代码呢?

编辑历史:[这消息被Rock编辑过(编辑时间2002-08-24 12:16:20)]
[这消息被Rock编辑过(编辑时间2002-08-24 12:17:06)]


与人同乐

职务:管理员
等级:6
金币:18.0
发贴:3928
#42002/8/24 17:22:00
AW太吃力,这个倒不如自己编写U32来得直接。



与人同乐

职务:管理员
等级:6
金币:18.0
发贴:3928
#52002/8/24 17:23:36
davichiu在上个帖子中说
引用:
但是在AW中使用winapi.u32中Polygon指令,其描述如下
BOOL=Polygon(HDC,CONST POINT*,int)
其中的ipPoint 寫成 CONT POINT*
我不知道這個數組該如何使用,如何寫程式
請問有誰可以告訴我如何寫這個數組,如何
正確使用polygon這個指令

如果可以的話可否email告訴我在討論版留下訊息,謝謝
davichiu@pchome.com.tw

用memtools.u32来传递指针。
pointer:=AllocMem(size),因此要知道那个常量指针的size。

编辑历史:[这消息被Y编辑过(编辑时间2002-08-24 17:30:43)]


davichiu

职务:普通成员
等级:1
金币:0.0
发贴:21
#62002/8/25 2:23:00
謝謝兩位版主Rock和Y先生之解說

關於VB範例代碼如下
Polygon

VB声明
Declare Function Polygon Lib "gdi32" Alias "Polygon" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
说明
描绘一个多边形,由两点或三点的任意系列构成。windows会将最后
一个点与第一个点连接起来,从而封闭多边形。多边形的边框用当
前选定的画笔描绘,多边形用当前选定的刷子填充
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hdc Long,用于描绘的设备场景
lpPoint POINTAPI,在nCount POINTAPI结构数组中的第一个POINTAPI
结构
nCount Long,多边形的总点数(顶点数)
注解
GetPolyFillMode 和 SetPolyFillMode 函数决定了如何在多边形内部填充


兩位前輩提到說""AW能够支持的函数参数类型有限,但是可以考虑用memtools.u32 构造数据结构,然后在aw里使用winapi.u32 中Polygon""
真得那麼複雜,我以為winapi中的函数應該就如AW中自建的函數一樣,以為程式設計者已經幫我們宣告好了,只要按照規定的寫法即可使用,...???我有去找到memtools.u32 ,和看了它的參數說明,可是我完全都不會,不知再寫什麼?????

如果可以的話,希望ROCK和Y版主能夠花時間研究這個問題,提供一個實例下載讓其他人研究

謝謝Rock兄提供的画圆和画矩形例子,讓我學會如何用SetMode 和SetPalette兩個指令,好像每畫一個圖形(線 圓 楕圓 矩形)它們都在不
同的圖層?? 以這個例子為例如果我今天要刪除其中一個圖形,而不是一次全部刪除可能嗎? 畫好的一個圖形可不可以移動或減下貼上或縮放 ?




davichiu

职务:普通成员
等级:1
金币:0.0
发贴:21
#72002/8/25 2:30:12
這個問題可以問MM公司嗎????
它們會回答嗎???



魔岩

职务:版主
等级:6
金币:34.0
发贴:4453
#82002/8/25 8:35:34
可以的。。去MM公司的AU技术支持论坛问问看看。



与人同乐

职务:管理员
等级:6
金币:18.0
发贴:3928
#92002/8/25 11:08:31
这个简单的示例画一个填充四边形。用到winapi和memtools两个U32,安装有AW的应该都有这两个函数库。这是一个A6P文件。
 源码下载

编辑历史:[这消息被Y编辑过(编辑时间2002-08-25 15:45:35)]


魔岩

职务:版主
等级:6
金币:34.0
发贴:4453
#102002/8/25 11:59:36
我用AW5打开后怎么执行什么效果都没有,空空的。。



与人同乐

职务:管理员
等级:6
金币:18.0
发贴:3928
#112002/8/25 14:50:59
看看两个U32在不在AW目录下。
davichiu:memtools.u32中函数的用法,置顶的【 Authorware 插件函数 】一帖中有详细说明。

编辑历史:[这消息被Y编辑过(编辑时间2002-08-25 14:54:59)]


davichiu

职务:普通成员
等级:1
金币:0.0
发贴:21
#122002/8/25 15:34:56
我也是

我下載後,並將winapi.u32和memtools.u32放在同一目錄下
打開後有一個計算圖示all in this和顯示圖示point show,
執行結果,我移動mouse時,左下角會有mouse移動的座標
但是並沒有看到繪製的結果,我用點選的也沒有呀

雖然看不到,相信Y版主應該找到了如何寫CONST POINT*
,太高興了,
我也仔細的看過計算圖示all in this的內容,如下

HDC:=GetDC( WindowHandle)
pointer:=AllocMem(32)
--賒珨跺侐晚倛:
(10,50),(300,400),(440,250),(270,90)
PokeULong(pointer,0,10)
PokeULong(pointer,4,50)
PokeULong(pointer,8,300)
PokeULong(pointer,12,400)
PokeULong(pointer,16,440)
PokeULong(pointer,20,250)
PokeULong(pointer,24,270)
PokeULong(pointer,28,90)
--扢离沓喃耀宒
SetPolyFillMode(HDC, 12)
--Do it!
result:=Polygon(HDC, pointer,4)

可否一步一步講解其中的AllocMem和PokeULong
我有查過這兩個指令的講說如下所示,
可是還是不明白其意思.

AllocMem
语法:pointer := AllocMem(size)
说明:分配一块指定大小的内存并返回指向内存的指针,该块内存中所有的字节被初始化为0,参数size必须大于或等于0。当分配请求失效时,该函数返回0。

PokeULong
语法:PokeULong(ptr,offset,value)
说明:在指针 ptr 指定的内存块中的偏移量offset 处写入一个无符号长整型数值。

1. AllocMem但底是什麼意思
2. 為何size設為32
3. 四點不是(10,50),(300,400),(440,250),(270,90) ,為何X1和Y1
要設為PokeULong(pointer,0,10)和PokeULong(pointer,4,50)
4. 可否為我們詳細解說或要去那裏參考有關memtools.u32
中指令的用法和說明,這個函數好像很重要

非常謝謝你們的講說






与人同乐

职务:管理员
等级:6
金币:18.0
发贴:3928
#132002/8/25 16:08:11
很不好意思。上午走得匆忙,误把一个草稿程序上传,现在已经上传了正式的A6P文件,麻烦各位重新下载一下,浪费大家时间了。(不过我专门下载了A5P文件,在我这里还是可以看到一个难看的四边形的:))

现在将里面核心的内容说明一下:

--准备设备描述表
HDC:=GetDC( WindowHandle)
--分配容纳顶点坐标的point数组
pointer:=AllocMem(32)
--画一个4边形:(150,30),(100,175),(200,90),(70,90)
PokeULong(pointer,0,150)
PokeULong(pointer,4,30)
PokeULong(pointer,8,100)
PokeULong(pointer,12,175)
PokeULong(pointer,16,200)
PokeULong(pointer,20,90)
PokeULong(pointer,24,70)
PokeULong(pointer,28,90)
--设置填充模式
SetPolyFillMode(HDC,1)
HBRUSH:=CreateHatchBrush(5, 128)
oldbursh:=SelectObject(HDC,HBRUSH)
--Do it!
result:=Polygon(HDC, pointer,4)
FreeMem(pointer)

1、首先CONST POINT*是一个指向顶点数组常量的指针。顶点数组保存了预备绘出的多边形的每个顶点。顶点结构声明为:
typedef struct tagPOINT {
LONG x;
LONG y;
}POINT;
可以看出这是一个8字节的结构,每个成员(也就是X,Y坐标)各占4个字节。因此,要绘制一个具有4个顶点的多边形时,这个数组的容量也就应该是32个字节。AllocMem(32)完成的任务就是分配一块大小为32字节的内存。
2、PokeULong(ptr,offset,value)是功能是向指针 ptr 指定的内存块中偏移量offset 处写入一个无符号长整型数值value。所以一共用了8次调用写入每个顶点的X,Y坐标。每次写入时都要调整偏移量。(当然如果顶点数目众多,还是建立循环效率高一些)。
3、接下来就好办了。SetPolyFillMode(HDC,1)设置填充模式为ALTERNATE,CreateHatchBrush(5, 128)创建一个网状画刷,再用Polygon(HDC, pointer,4)画就OK了。HDC是演示窗口的设备描述表,pointer是指向32个字节内存空间的指针,4表示有4个顶点。最后别忘记用FreeMem(pointer)释放无用空间。最好还能把窗口原有画刷恢复。

编辑历史:[这消息被Y编辑过(编辑时间2002-08-25 16:10:24)]
[这消息被Y编辑过(编辑时间2002-08-25 16:12:20)]


与人同乐

职务:管理员
等级:6
金币:18.0
发贴:3928
#142002/8/25 16:15:38
实际上memtools.u32是winapi.u32的左右手。许多API函数都需要传递指针,没有memtools,AW只能以字符串形式传递字符指针。



魔岩

职务:版主
等级:6
金币:34.0
发贴:4453
#152002/8/25 19:27:21
Y啊,我还是看到空空的执行界面啊。。怎么回事?