前几天一位朋友问如何绘制一个可在屏幕上移动的十字架,俺编写了一个,后来又有朋友问到这个问题,故把代码贴了出来,供大家指正:

'* ****************************************** *
'* 程序说明:一个可在屏幕上拖动的十字架       *
'* 作者:lyserver                             *
'* ****************************************** *
Option Explicit

Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function OffsetRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Const RGN_OR = 2
Private Declare Function SelectClipRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_BORDER = &H800000
Private Const WS_MINIMIZE = &H20000000
Private Const WS_SYSMENU = &H80000
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOZORDER = &H4
Private Const SWP_SHOWWINDOW = &H40
Private Const HWND_TOPMOST = -1

Dim bAdjust As Boolean
Dim hLine As RECT, vLine As RECT
Dim hhRgn As Long, hvRgn As Long
Dim startX As Long, startY As Long

Private Sub Form_Deactivate()
    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
    Me.Refresh
End Sub

Private Sub Form_Load()
    WindowState = 2
    MousePointer = 0
    ScaleMode = vbPixels
    BackColor = vbRed '十字条线条颜色
    SetWindowLong hwnd, GWL_STYLE, WS_BORDER Or WS_MINIMIZE Or WS_SYSMENU
    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub

Private Sub Form_LostFocus()
    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
    Me.Refresh
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = 1 Then
        bAdjust = True
        startX = x
        startY = y
        MousePointer = IIf(CBool(PtInRect(hLine, x + 1, y + 1)), 7, 9)
        SetCapture hwnd
    End If
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = 0 Then
        MousePointer = IIf(CBool(PtInRect(hLine, x + 1, y + 1)), 7, 9)
    ElseIf Button = 1 Then
        If Not bAdjust Then
            bAdjust = True
            startX = x
            startY = y
            SetCapture hwnd
        End If
    End If
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = 1 And bAdjust Then
        Dim tRgn As Long
        If MousePointer = 7 Then
            OffsetRect hLine, 0, y - startY
            hhRgn = CreateRectRgn(hLine.Left, hLine.Top, hLine.Right, hLine.Bottom)
        Else
            OffsetRect vLine, x - startX, 0
            hvRgn = CreateRectRgn(vLine.Left, vLine.Top, vLine.Right, vLine.Bottom)
        End If
        tRgn = CreateRectRgn(hLine.Left, hLine.Top, hLine.Right, hLine.Bottom)
        Call CombineRgn(tRgn, hhRgn, hvRgn, RGN_OR)
        Call SetWindowRgn(hwnd, tRgn, True)
        DeleteObject tRgn
        startX = x
        startY = y
        bAdjust = False
    End If
    ReleaseCapture
    MousePointer = 0
End Sub

Private Sub Form_Resize()
    Dim tRgn As Long

SetRect hLine, 0, ScaleHeight / 2, ScaleWidth, ScaleHeight / 2 + 1
    SetRect vLine, ScaleWidth / 2, 0, ScaleWidth / 2 + 1, ScaleHeight
    hhRgn = CreateRectRgn(hLine.Left, hLine.Top, hLine.Right, hLine.Bottom)
    hvRgn = CreateRectRgn(vLine.Left, vLine.Top, vLine.Right, vLine.Bottom)
    tRgn = CreateRectRgn(hLine.Left, hLine.Top, hLine.Right, hLine.Bottom)
    Call CombineRgn(tRgn, hhRgn, hvRgn, RGN_OR)
    Call SetWindowRgn(hwnd, tRgn, True)
    DeleteObject tRgn
End Sub

Private Sub Form_Unload(Cancel As Integer)
    DeleteObject hhRgn
    DeleteObject hvRgn
End Sub

程序效果如下:

摘自:用VB编写的一个可在屏幕上移动的十字架


更多精彩>>>

用VB编写的一个可在屏幕上移动的十字架相关推荐

  1. 编写Java程序,在屏幕上显示带标题的窗口,并添加一个按钮。当用户单击按钮时,结束程序。

    编写Java程序,在屏幕上显示带标题的窗口,并添加一个按钮.当用户单击按钮时,结束程序. package p3;import java.awt.event.ActionEvent; import ja ...

  2. 编写一个Applet在屏幕上画椭圆,椭圆的大小和位置由鼠标决定

    编写一个Applet在屏幕上画椭圆,椭圆的大小和位置由鼠标决定 package p1;import java.applet.Applet; import java.awt.Dimension; imp ...

  3. 编写一个Applet在屏幕上画一组同心圆

    编写一个Applet在屏幕上画一组同心圆 package p1;import java.applet.Applet; import java.awt.Dimension; import java.aw ...

  4. pythonturtle画飞机_浅谈pygame编写外星人入侵游戏第一步(屏幕上绘制飞机)......

    本人小白 刚开始学习python半月,到目前将python基础语法跑了一遍,不算透彻,只是有一些映像...... 于是学着做外星人入侵游戏,想从项目中深度学习,直接上目前的效果图: --------- ...

  5. vb编写脚本能让计算机屏幕黑屏,,win7上设置颜色黑屏

    当前位置:我的异常网» VB » ,win7上设置颜色黑屏 ,win7上设置颜色黑屏 www.myexceptions.net  网友分享于:2013-12-16  浏览:7次 求助,win7下设置颜 ...

  6. VB编写DirectX简明教程

    VB编写DirectX简明教程 随这计算机软硬件的发展,计算机不在只是一个简单的计算工具而成为了一个可以玩游戏.进行多媒体操作的多功能平台.为了编写高性能的游戏和应用程序,我们需要绕过操作系统提供的A ...

  7. C++ 入门(编写第一个C++程序)

    第一章    遇见C++ 欢迎进入C++世界! 1.1  C++介绍 C++ 是在C语言的基础上添加了面向对象和泛型编程的支持,它是21世纪最重要的编程语言之一,C++继承了C语言的高效.简洁.快速和 ...

  8. 编写程序创建一个通讯录文件,在其中存入10位同学的姓名、年龄、电话号码,并在屏幕上输出第2、4、6、8、10位同学的信息

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p257 习题8 8.编写程序创建一个通讯录文件,在其中存入10位同学的姓名.年龄.电话号码,并在屏幕上 ...

  9. 编写一个Java程序将当100,101,102,103,104,105个数以数组的形式写入到Dest.txt文件中,并以相反的顺序读出显示在屏幕上。

    编写一个Java程序将当100,101,102,103,104,105个数以数组的形式写入到Dest.txt文件中,并以相反的顺序读出显示在屏幕上. package p1;import java.io ...

最新文章

  1. 【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)注解开发
  2. android子view获取父布局,Android获取布局父ID(Android get layout parent id)
  3. IOS基础NSOperation的操作优先级和操作依赖
  4. 魅族魅蓝mirror简单打开usb调试模式的步骤
  5. Java 栈的存储过程
  6. 想唱你就唱卡拉ok_如何将电唱机与其他设备连接起来
  7. 经典排序算法(七)--冒泡排序Bubble Sort
  8. Xtreme Report为windows开发者提供一个完善的类似于Outlook 2003报表的风格
  9. Atitit.项目修改补丁打包工具 使用说明
  10. 【LitJson】如何判断字符串中是否有某个key
  11. 怎样下载最新的SCI/SSCI/EI目录期刊列表?
  12. 高中数学对计算机,对高中数学计算机学习技巧的探讨
  13. 测试按键延迟软件,怎么测试键盘延迟-灵猫键盘DIY大师测试键盘响应速度的方法 - 河东软件园...
  14. 云计算时代的软件行业变化
  15. Android N for Developers
  16. 关于孔明先生职称申请报告的回函
  17. SIM逻辑模型与APDU
  18. 7-1 用格里高利公式求给定精度的PI值
  19. 形式逻辑(05)假言判断 和 推理
  20. Unity的Application.Quit()方法使用失效的其他解决方案。

热门文章

  1. 用故事来给你讲负载均衡的原理
  2. 库克谈“唱衰苹果”:一派胡言!
  3. 谁“玩死了”共享单车?
  4. 96 年美女胜出!那个有关“猪脸识别”的比赛决出冠军啦
  5. 硅谷经历 7 场面试,我是如何最终进入 Facebook 的
  6. cognos 样例 oracle,cognos10.2 sample(ORACLE学样例)
  7. oracle24550,ORA-24550: signal received:这个问题的原因及解决办法
  8. linux软件包管理系统的意义,Linux系统的软件包管理——RPM
  9. linux root所在目录,Linux下误删root目录
  10. mysql 环形主从_【每日一博】MySQL 互为主从(环形结构)_MySQL