| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 763 人关注过本帖
标题:写控件中遇到的几个基础问题
只看楼主 加入收藏
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
结帖率:87.93%
收藏
已结贴  问题点数:20 回复次数:10 
写控件中遇到的几个基础问题
1.使用PropBag.ReadProperty
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  dim lngWidth as long
  lngWidth = PropBag.ReadProperty("Width", 100)
  '读出来的控件的Width为什么总是100,而不是Width属性中的数值
end Sub
2.想在控件的边框处画些线条
  With LineTop
        .X1 = 2
        .X2 = UserControl.Width - 2
        .Y1 = 2
        .Y2 = 2
  End With
  '感觉画出来的线条的长度大大超出了控件的宽度,在控件初始化时有设置UserControl.ScaleMode = vbPixels
3.想在用户设置Width/Height属性时能马上有对应的反应
  想设置Property Let Width(lngValue as long),提示错误"二义性"
  那是否有其他方法能实现 还是只能在事件Resize中处理
搜索更多相关主题的帖子: 控件 基础 
2010-10-18 09:40
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:20 
dim lngWidth as long
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  me.Width = PropBag.ReadProperty("Width", 100)
  '读出来的控件的Width为什么总是100,而不是Width属性中的数值
end Sub
Property Let Width(lngValue as long)
lngWidth  = lngValue
end property
'嗯,没试过。看看吧。
2010-10-18 09:49
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
收藏
得分:0 
问题一:
部分解决
lngWidth = PropBag.ReadProperty("Width", Extender.Width)
不知道象Width这样的属性读是应该怎样写
2010-10-18 10:36
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
收藏
得分:0 
问题基本解决了:
问题一:
lngWidth = PropBag.ReadProperty("Width", gFunTwipsToPixels(Extender.Width, DIRECTION_HORIZONTAL))
lngHeight = PropBag.ReadProperty("Height", gFunTwipsToPixels(Extender.Height, DIRECTION_VERTICAL))
问题二:
'控件显示边框
   With LineTop
        .X1 = 0
        .X2 = lngWidth
        .Y1 = 0
        .Y2 = 0
   End With
   
   With LineLeft
        .X1 = 0
        .X2 = 0
        .Y1 = 0
        .Y2 = lngHeight - 1
   End With
   
   With LineRight
        .X1 = lngWidth - 1
        .X2 = lngWidth - 1
        .Y1 = 0
        .Y2 = lngHeight - 1
   End With
   
   With LineBottom
        .X1 = 0
        .X2 = lngWidth - 1
        .Y1 = lngHeight - 1
        .Y2 = lngHeight - 1
   End With

'还有一个小问题:左边和顶点的坐标可以原样使用,但是右边和下边的坐标却需要减1

问题三:
目前使用raise事件处理
2010-10-18 15:35
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
收藏
得分:0 
Option Explicit
'
'Option Compare Database
'Option Explicit

Private Declare Function apiGetDC Lib "user32" Alias "GetDC" _
    (ByVal hwnd As Long) As Long
Private Declare Function apiReleaseDC Lib "user32" Alias "ReleaseDC" _
    (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function apiGetDeviceCaps Lib "gdi32" Alias "GetDeviceCaps" _
    (ByVal hdc As Long, ByVal nIndex As Long) As Long

Private Const LOGPIXELSX = 88
Private Const LOGPIXELSY = 90

Public Const DIRECTION_VERTICAL = 1
Public Const DIRECTION_HORIZONTAL = 0

'===============================================================================
'-函数名称:         gFunTwipsToPixels
'-功能描述:         转换堤到像素
'-输入参数说明:     参数1:rlngTwips Long 需要转换的堤
'                   参数2:rlngDirection Long DIRECTION_VERTICAL是Y方向 DIRECTION_HORIZONTAL为X方向
'-返回参数说明:     转换后像素值
'-使用语法示例:     gFunTwipsToPixels 50,DIRECTION_VERTICAL
'-参考:
'-使用注意:
'-兼容性:           97,2000,XP compatible
'-作者:             王宇虹(参考微软KB),改进:王宇虹
'-更新日期:        2002-08-26 ,2002-11-15
'===============================================================================
Function gFunTwipsToPixels(rlngTwips As Long, rlngDirection As Long) As Long
    On Error GoTo Err_gFunTwipsToPixels
    Dim lngDeviceHandle As Long
    Dim lngPixelsPerInch As Long
    lngDeviceHandle = apiGetDC(0)
    If rlngDirection = DIRECTION_HORIZONTAL Then  '水平X方向
        lngPixelsPerInch = apiGetDeviceCaps(lngDeviceHandle, LOGPIXELSX)
    Else       '垂直Y方向
        lngPixelsPerInch = apiGetDeviceCaps(lngDeviceHandle, LOGPIXELSY)
    End If
    lngDeviceHandle = apiReleaseDC(0, lngDeviceHandle)
    'gFunTwipsToPixels = rlngTwips / 1440 * rlngPixelsPerInch
    gFunTwipsToPixels = rlngTwips / 1440 * lngPixelsPerInch
Exit_gFunTwipsToPixels:
    On Error Resume Next
    Exit Function
Err_gFunTwipsToPixels:
    MsgBox Err.Description, vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume Exit_gFunTwipsToPixels
End Function
'===============================================================================
'-函数名称:         gFunPixelsToTwips
'-功能描述:         转换像素到堤
'-输入参数说明:     参数1:rlngPixels Long 需要转换的像素
'                   参数2:rlngDirection Long DIRECTION_VERTICAL是Y方向 DIRECTION_HORIZONTAL为X方向
'-返回参数说明:     转换后堤值
'-使用语法示例:     gFunPixelsToTwips 50,DIRECTION_VERTICAL
'-参考:
'-使用注意:
'-兼容性:           97,2000,XP compatible
'-作者:             王宇虹(参考微软KB),改进:王宇虹
'-更新日期:        2002-08-26 ,2002-11-15
'===============================================================================
Function gFunPixelsToTwips(rlngPixels As Long, rlngDirection As Long) As Long
    On Error GoTo Err_gFunPixelsToTwips
    Dim lngDeviceHandle As Long
    Dim lngPixelsPerInch As Long
    lngDeviceHandle = apiGetDC(0)
    If rlngDirection = DIRECTION_HORIZONTAL Then  '水平X方向
        lngPixelsPerInch = apiGetDeviceCaps(lngDeviceHandle, LOGPIXELSX)
    Else       '垂直Y方向
     lngPixelsPerInch = apiGetDeviceCaps(lngDeviceHandle, LOGPIXELSY)
    End If
    lngDeviceHandle = apiReleaseDC(0, lngDeviceHandle)
    'gFunPixelsToTwips = rlngPixels * 1440 / rlngPixelsPerInch
    gFunPixelsToTwips = rlngPixels * 1440 / lngPixelsPerInch
Exit_gFunPixelsToTwips:
    On Error Resume Next
    Exit Function
Err_gFunPixelsToTwips:
    MsgBox Err.Description, vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume Exit_gFunPixelsToTwips
End Function



2010-10-18 15:47
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
Private Sub UserControl_Resize()

Dim i As Long, j As Long

'单位是缇,所以需要减15.
'因为坐标是以0 起,而 width 是从1算起的宽度.

i = UserControl.ScaleWidth - 15
j = UserControl.ScaleHeight - 15


UserControl.ForeColor = 0
UserControl.Line (0, 0)-(i, 0)
UserControl.Line (0, 0)-(0, j)

UserControl.ForeColor = RGB(255, 255, 255)
UserControl.Line (i, j)-(i, 0)
UserControl.Line (i, j)-(0, j)
End Sub


授人于鱼,不如授人于渔
早已停用QQ了
2010-10-18 15:56
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
属性,我一般使用 接口向导来弄.

这样可以生成一个基本的架子. 真正的代码,我反而不太知道.

授人于鱼,不如授人于渔
早已停用QQ了
2010-10-18 15:56
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
收藏
得分:0 
以下是引用风吹过b在2010-10-18 15:56:51的发言:

属性,我一般使用 接口向导来弄.

这样可以生成一个基本的架子. 真正的代码,我反而不太知道.
这样吗 多谢指教 虽然知道这个功能 但一直没怎么用 总觉得还是自己双手靠的住
2010-10-18 17:31
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
收藏
得分:0 
另外 Extender.Width 与UserControl.Width返回的数据不一定相等
测试了下 不知道这两个返回的数据有什么区别?
2010-10-19 09:23
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:0 
    UserControl.ScaleX UserControl.Width, ScaleModeConstants.vbTwips, ScaleModeConstants.vbPixels
'用不着这么麻烦用API吧。
2010-10-19 12:16
快速回复:写控件中遇到的几个基础问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024239 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved