第一个,PB制作异形窗口该怎么办? VC的实例我有,可惜,我的C++学的不太好,也没看懂,大概就是图片的黑色部分与对话框相重叠的地方用windowRGN()变成透明,我也没搞懂怎么弄的,请教高手如何在PB里实现。
第二个问题,如何屏蔽双击标题栏就最大化的事件?
第三个问题,如何使一个main类型的窗口本身的垂直滚动条支持鼠标滚轮?
1。你可以找一个VB的代码,一样 的
2。在RESIZE里面,你可以判断窗口状态参数resizetype
3.你想干什么
第一个问题,前人种树,后人乘凉:
发现PB甚至于其它编程工具都没有提供这样的控件,
不知各位可有创建任意形状的可视控件的办法,比如一个圆形的,多边形的等
这个控件必须像窗口一样有自己的属性、方法,事件就无所谓,但属性就一定要有。
---------------------------------------------------------------
我以前有过不规则按纽的例子,很好玩,你在到网上去找找吧。
---------------------------------------------------------------
pb里的图形框就是有不规则形状啊,只是没事件,因为他们的祖先就不是一个类继承过来的。感兴趣可以自己去做一个控件,用BCB应该很容易
---------------------------------------------------------------
在PB下实现圆形的窗口:
首先在窗口定义下列局部外部函数:
FUNCTION ulong CreateEllipticRgn(ulong X1,ulong Y1,ulong X2,ulong Y2) LIBRARY
"gdi32.dll"
FUNCTION ulong SetWindowRgn(ulong hWnd,ulong hRgn,boolean bRedraw) LIBRARY
"user32.dll"
在窗口的open事件中加上:
long hrgn
long lres
hrgn=createellipticrgn(20,20,400,400)//其中参数为左上到右下的坐标值,可修改。
lres=setwindowRgn(handle(this),hrgn,true)
//记得在窗口中放置一个按钮关闭窗口,要不然……
---------------------------------------------------------------
我有源代码
long ll_handle
ws_position lws_pointapi[]
// 图形2
lws_pointapi[1].xpos = 1
lws_pointapi[1].ypos = 1
lws_pointapi[2].xpos = 800
lws_pointapi[2].ypos = 1
lws_pointapi[3].xpos = 800
lws_pointapi[3].ypos = 41
lws_pointapi[4].xpos = 1
lws_pointapi[4].ypos = 41
lws_pointapi[5].xpos = 1
lws_pointapi[5].ypos = 610
lws_pointapi[6].xpos = 830
lws_pointapi[6].ypos = 610
lws_pointapi[7].xpos = 830
lws_pointapi[7].ypos = 75
lws_pointapi[8].xpos = 35
lws_pointapi[8].ypos = 75
lws_pointapi[9].xpos = 35
lws_pointapi[9].ypos = 586
lws_pointapi[10].xpos = 1
lws_pointapi[10].ypos = 586 //多边形各个顶点坐标值
ll_handle = CreatePolygonRgn(lws_pointapi[], 10, 1)
//其中第 1 个参数为多边形各个顶点坐标值的数组
//其中第 2 个参数为多边形边数,可修改,配合数组值
//其中第 3 个参数为填充模式 ALTERNATE /WINDING
SetwindowRgn(handle(this), ll_handle, true)
放在你的控件中,你的控件就变成了多边形
函数声明为
Function ulong CreatePolygonRgn (ref ws_position lppt[], int cPoints, int fnPolyFillMode ) Library "gdi32.dll"
FUNCTION ulong SetWindowRgn(ulong hWnd,ulong hRgn,boolean bRedraw) LIBRARY "user32.dll"
代码能不能看懂,看不懂给我发短消息
---------------------------------------------------------------
楼上的说的都很不错啊,把这几个API函数配合起来使用,就可以做任意形状的窗口了。
CombineRgn
CreateEllipticRgn
CreateEllipticRgnIndirect
CreatePolygonRgn
CreatePolyPolygonRgn
CreateRectRgn
CreateRectRgnIndirect
CreateRoundRectRgn
SetWindowRgn
---------------------------------------------------------------
楼上:
有没有办法修改按钮的背景色啊?
我不想使用DW、BMP等变通的办法
就想如何才能直接修改按钮的背景色
不知道是不是要用到OWNER_DRAW
---------------------------------------------------------------
楼上:
没问题呀,有handle的控件,都可以的。
---------------------------------------------------------------
使用OWNERDRAW(这里针对按钮,其他类似)
1。设置控件的ownerdraw属性
ll = GetWindowULong( handle( cb_1 ), GWL_STYLE )
SetWindowULong( handle( this ), GWL_STYLE, ll + BS_OWNERDRAW )
2。在窗口的 pbm_measureitem 中
设置按钮的宽和高
3。在窗口的 pbm_drawitem 事件中
绘制按钮, 这是一段代码:
DRAWITEMSTRUCT ldis
MoveMemory( ldis, drawitemstruct, DRAWITEMSTRUCT_SIZE )
if ldis.ctltype <> ODT_BUTTON then return 0
if ldis.ctlid <> g_api.GetWindowULong( handle( this ), g_api.GWL_ID ) then return 0
ib_selected = mod( ldis.itemstate, ODS_SELECTED * 2 ) >= ODS_SELECTED
ib_focus = mod( ldis.itemstate, ODS_FOCUS * 2 ) >= ODS_FOCUS
of_draw( ldis.hdc )
里面 drawitemstruct 是个指向 DRAWITEMSTRUCT结构的指针。
4。ok了。
问题一:
首先在窗口定义下列局部外部函数:
Function ulong CreatePolygonRgn (ref tagPOINT lppt[], int cPoints, int fnPolyFillMode ) Library "gdi32.dll"
FUNCTION ulong SetWindowRgn(ulong hWnd,ulong hRgn,boolean bRedraw) LIBRARY "user32.dll"
在窗口上定义:
Structure
tagpoint
{ long x
long y}
在窗口的open事件中加上:
long hrgn
long lres
tagPOINT l_pointapi[]
l_pointapi[1].x = 173
l_pointapi[1].y = 112
l_pointapi[2].x = 412
l_pointapi[2].y = 66
l_pointapi[3].x = 478
l_pointapi[3].y = 240
l_pointapi[4].x = 338
l_pointapi[4].y = 340 //多边形各个顶点坐标值
hrgn = CreatePolygonRgn(l_pointapi[],4,1)
//其中第 1 个参数为多边形各个顶点坐标值的数组
//其中第 2 个参数为多边形边数,可修改,配合数组值
//其中第 3 个参数为填充模式 ALTERNATE /WINDING
lres=setwindowRgn(handle(this),hrgn,true)