在VB中实现移动没有标题栏的窗口

在VB中实现移动没有标题栏的窗口


2024年7月2日发(作者:)

在VB中实现移动没有标题栏的窗口

方法二 (可用

这种方法通过消息的发送实现移动无标题窗体。当鼠标按下、移

动或释放时,将鼠标在窗体上按下的消息(消息值为HTCAPTION)发出,

就能拖动窗体了。代码如下:

Private Declare Function ReleaseCapture Lib "user32" () As

Long

Private Declare Function SendMessage Lib "user32" Alias

"SendMessageA" (ByVal hwnd As Long,

ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)

As Long

Private Const WM_NCLBUTTONDOWN = &&HA1

Private Const HTCAPTION = 2

’以上API函数和常数的声明可在VB自带的“API浏览器”中找

Private Sub Form_MouseDown(Button As Integer, Shift As

Integer, X As Single, Y As Single)

’在窗体的MouseDown事件中添加以下代码

If Button = 1 Then

Call ReleaseCapture

Call

End If

End Sub

Private Sub Command1_Click()

End ’退出程式

End Sub

这种方法实现起来比第一种方法更容易,只有几行代码,并且没

有那么多的变量,窗体被拖动时和普通窗体相同,只有一个虚框随鼠

标的移动而移动,当释放鼠标时窗体才移动到相应的位置。用到了两

个API函数。

在visual basic中如何拖动窗体或控件

现在的许多windows下的应用程序,都采用了图形化的界面,例

如:winamp等!这样做的好处是可以使程序界面更漂亮生动,更具

吸引力。但是在这样的界面下就不能使用windows原来的标题条了,

否则会影响界面的美观性。那么在没有标题条的情况下如何用鼠标拖

SendMessage(hwnd, WM_NCLBUTTONDOWN,

HTCAPTION, 0)

动窗体呢?或者拖动其它的控件呢?

其实,采用api函数调用很容易实现,下面我们以拖动窗体

(form1)为例来具体讲一下实现方法:

1.新建立一个项目,名称为:.

2. 填加一个模块,名称为:,并且在声明部分加入以下代

码:

declare function releasecapture lib "user32" () as long

declare function sendmessage lib "user32" alias

"sendmessagea" (byval hwnd as long, byval wmsg as long, byval

wparam as long, lparam as any) as long

public const wm_syscommand = &h112

public const sc_move = &hf012

其中releasecapture函数是用来释放鼠标捕获的,sendmessage

函数是一个在windowsapi中非常重要的函数,在这里的作用是用来

向windows发送移动窗体的消息。wm_syscommand是向windows

发送消息的常量。sc_move是控制移动窗体的常量。请注意:这里

sc_move的赋值一定要是&hf012,它表示鼠标对象。

3.在窗体的mousedown过程中加入以下代码:

releasecapture

sendmessage , wm_syscommand, sc_move, 0

其中releasecapture函数用来释放鼠标捕获,sendmessage函

数向windows发送移动窗体的消息。

4.保存并运行程序,按下鼠标,你会发现窗体会随着鼠标的移动

而移动。就和其它著名的应用程序一样。

以上讲述了如何在vb中用鼠标拖动窗体,其实,控件的拖动的原

理是一样的。

例如以下代码可以实现图片框的拖动:

releasecapture

sendmessage , wm_syscommand, sc_move, 0

其实,运用api函数可以实现许多你意想不到的功能。如果需要更

多有关

拖动无系统标准标题栏的窗口

吴斌

大家知道,在vb中可以通过设置form的属性,制作无系统标题

栏的窗口。可是,由于失去了系统标题栏,如何使用鼠标拖动窗口便

成了一个棘手的问题。其实,借助api函数releasecapture和

sendmessage,这个问题便可迎刃而解了。

首先,在module文件中加入下列声明语句:

declare sub releasecapture lib"user"()

declare function sendmessage lib"user"(byval hwnd _

as integer,byval wmsg as integer,byval wparam as integer,

_lparam as any)as long

public const wm_syscommand=&h112

public const sc_move=&hf010

public const htcaption=2

然后,在form的mousedown事件中加入下列代码:

releasecapture

ret&=sendmessage(me.hwnd,wm_syscommand,

_sc_move+htcaption,0)

……

程序运行后,只要当光标落在form区域时按住鼠标左键,便可以

拖动窗口了。在一些要求生动活泼的界面的程序设计中,开发者常常

希望自制风格独特的标题栏,以满足整个界面的要求。通过这个方法,

就可以使自制的标题栏达到乱真的地步。不过,用作自制标题栏的控

件,必须具有mousedown事件以摆放上述代码。

vb的其它经验与技巧。建议访问

/doc/,站点。

移动没有标题栏的窗口

我们一般是用鼠标按住窗口的标题栏,然后移动窗口,当窗口没

有标题栏时,我们可以用下面的方法来移动窗口:

在 bas 文件中声明:

declare function releasecapture lib "user32" () as long

declare function sendmessage lib "user32" _

alias "sendmessagea" ( _

byval hwnd as long, byval wmsg as long, _

byval wparam as long, lparam as any) as long

public const htcaption = 2

public const wm_nclbuttondown = &ha1

然后,在 form_mousedown 事件中:

private sub form_mousedown(button as integer, shift as

integer, x as single, y as single)

releasecapture

sendmessage hwnd, wm_nclbuttondown, htcaption, 0&

end sub

vb编程中窗体的控制技巧

在visual basic中,每个应用程序都是从窗体(form)开始的,窗体

是构成用户接口的所有控件的容器。录活运用窗体的各项属性和操作,

可以为用户设计出赏心悦目的操作界面。

1.窗体以当前屏幕分辨率全屏显示

在应用程序的编制调试过程中,用于经常用到菜单、工具条和

工具框等辅助工具,一般不将窗体设为全屏显示,以便于操作;

另外,当屏幕分辨率改变时,窗体可能不能正常显示,可以在窗体的

load事件中插入下列代码,即可使窗体启动时以当前屏幕分辨率全屏

显示:

private sub form_load()

=0 ‘设置窗体上边界位置

=0 ‘设置窗体左边界位置

= ‘设置窗体宽度为屏幕宽度

= ‘设置窗体高度为屏幕高度

end sub

2.使窗体保持在最上层

有时应用程序需要一个信息或查询窗体总保持在最上层,即使用

读书切换到其他窗体也能看到该窗体,如microsoft word中的find窗

体,这是通过调用windows api函数setwindowpos()实现的,示例

如下:

option explicit

private declare function setwindowpos

lib“user32”(byvalhwnd as long,byval h wndinsertafter as

long,byval x as long,byval y as long,byval cx as long,byval cy as

long,byval wflags as long)as long

const hwnd_topmost=-1

const swp_showwindow=&h40

private sub form_load()

dim retvalue as long

retvalue=setwindowpos(,hwnd_topmost,

tx,ty,300,300,swp_showwindow)

end sub

3.窗体装入速度慢的处理技巧

在缺省情况下,visual basic装入和显示项目的第一个窗体。如果

窗体装入过程超过一秒,用户只好耐心等待,特别是在窗体中含有大

型位图或许多控件时。其实,微软在office组件中已经很好地处理了

这一问题。下面的程序演示了处理低速窗体的装入技巧,在应用程序

启动时,首先启动一个简单的快速装入窗体,可以将公司标志或其他

信息显示在上面,然后在快速窗体后台中装入慢速窗体,慢速窗体装

入后将快速窗体卸出,从而解决了让用户厌烦的等待问题。

private sub form_load()

h

load form2 ‘装入慢速窗体

‘显示慢速窗体

end sub

如果省略方法,则需装入慢速窗体后才能显示信息

窗体。refresh方法让visual basic更新显示后再执行后面的命令,缺

省情况下,visual basic只在不执行其他代码时,才有机会刷新显示。

慢速窗体form2装入后,用下列代码将快速窗体fomr1卸出:

private sub form_load()

unload form1 ‘卸出快速窗体

end sub

一旦装入窗体,它就占用了所要的资源,所以不再需要的窗体应

及时卸出,将占用的资源交还系统。另外,由于窗体装入比较慢,特

别是包含位图或其他资源的大文件装入更慢,所以应用程序运行期间

应尽量避免频繁装入/卸出窗体,而最好在应用程序启动时把窗体装入

内存,需要时再显示。

利用vb控制窗口显示风格

广州 郭少越

软件界面生动与否很大程度上决定于你对窗口的设计和控制。事

实上,windows程序员可以对系统

中的任何窗口进行操纵,它意味着,windows程序员可以直接操

纵任何正在运行的应用窗口;可以发现一个特定的应用是否在运行,

如果该应用没有运行还可以启动它;可以重新排列屏幕上的所有窗口;

还可以使其他应用的窗口最大化或最小化。下面我们探讨一种十分有

意义的应用。

我们很希望在程序激活其它窗口时仍使得封面窗口处于前台,也

就是说该窗口具有“ 总在最前面”(“always on top”)这一特性。

其实microsoft系列软件都是这样做的,当你运行word、excel或

powerpoint时,你会发现它们的封面窗口不随系统激活其它窗口而消

失。

visual basic for windows(以下简称vb)作为一种可视化编程软

件,以其优秀的图形化界面设计风格而著称。利用它可使软件开发周

期大为缩短,然而vb对windows dll(动态链接库)调用的强大功能

却易受不少程序员所忽略。事实上,灵活应用windows dll的api(应

用程序接口)才能使你开发的系统更加充满活力。正是由于vb支持dll

使得我们可以随心所欲地控制窗口显示风格,从而我们可以让系统封

面总处于前台,下面说明用到的api函数。

.setwindowpos

vb定义:

declare sub setwindowposlib“user” (bybal hwnd as

integer ,hwndinsertafter as integer,byval x as integer,byval

y as integer,byval cx as integer ,byval cy as integer,byval

wflags as integer)

说明:能改变窗口的位置和大小,并能修改窗口在内部窗口列表

中所处的位置,

以控制显示次序。

参数 类型/说明

hwnd integer-需定位的窗口

hwndinsertafter integer-窗口句柄,在窗口列表里,

窗口hwnd将放在该窗口句柄的后面,它可以取以下值:

hwnd_bottom:把窗口放在窗口列表的底部;

hwnd-top:把窗口放在z序的顶部。z序是窗口按层次级别显

示的顺序;

hwnd_top(most):把窗口放在列表的顶部,位于所有最顶窗

口之后。

x integer—窗口新的x坐标,如果hwnd是一个子窗口,x给出

的是父窗口的客户坐标。

y integer—窗口新的y坐标,如果hwnd是一个子窗口,y给出

的是父窗口的客户坐标。

cx integer—指定新窗口宽度。

cy integer—指定新窗口高度。

wflags integer—包含下列标志之一的整数:

swp_drawframe:围绕窗口画一个边框;

swp_hidewindow:隐藏该窗口;

swp_noactivate:不激活该窗口;

swp_nomove:保持当前位置(x和y被忽略);

swp_noredraw:窗口不自动重画;

swp_nosize:保持当前大小(cx和cy被忽略);

swp_nozorder:保持窗口列表中的当前位置

(hwndinsertafter被忽略);

swp_showwindow:显示该窗口。

注释:当一个窗口成为最顶窗口时,它所有的从属窗口也成为最

顶窗口;当它成为非

最顶窗口时,它全部的从属窗口和拥有窗口也成为非最顶窗口,

z序表示窗口沿着从屏幕里向外延伸的假想z轴,从顶到底的排列次

序。

vb实现窗口拥有“always on top”特性:

首先,定义全局常量及函数。

global const hwnd_topmost=-1

global const swp_noactivate=&h10

global const swp_showwindow=&h40

declare sub setwindowposlib “user” bybal hwnd as integer,

hwndinsertafter as integer,byval x as integer,byval y as

integer,byval cx as integer,byval cy as integer,byval wflags as

integer)

主程序如下编写:

sub main 0

screen.mousepointer=11使鼠标变为漏斗状

load systemcover装载系统封面窗体

setwindowpos systemcover.hwnd,hwnd_topmost,0,

0,0,0,swp_noactivate or swp_showwindow使得封面总处

于最前面

load initwindow1装载初始化窗体1

load initwindow2装载初始化窗体2

unload systemcover关闭系统封面窗体

screen.mousepointer=0

使鼠标变为缺省形状

end sub

让窗口一直在上面

很多流行软件都有这样一个选项:always on top。它可以让窗口

在最上面,别的窗口不能覆盖它。我们在 vb 中,可以使用下面的方法

来实现:

private const swp_nosize = &h1

private const swp_nomove = &h2

private const swp_nozorder = &h4

private const swp_noredraw = &h8

private const swp_noactivate = &h10

private const swp_framechanged = &h20

private const swp_showwindow = &h40

private const swp_nocopybits = &h80

private const swp_noownerzorder = &h200

private const swp_drawframe = swp_framechanged

private const swp_noreposition = swp_noownerzorder

private const hwnd_top = 0

private const hwnd_bottom = 1

private const hwnd_topmost = -1

private const hwnd_notopmost = -2

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 mbontop as boolean

private property let ontop (setting as boolean)

if setting then

setwindowpos hwnd, -1, 0, 0, 0, 0, swp_nomove

swp_nosize

else

setwindowpos hwnd, -2, 0, 0, 0, 0, swp_nomove

swp_nosize

end if

mbontop = setting

end property

private property get ontop() as boolean

return the private variable set in property let

or

or

ontop = mbontop

end property

调用 ontop=true 即可让窗口 always on top。

创建无 icon 的窗口

我们在很多时候都需要那种无 icon 的 窗口,如“关于……”“查

找”等。在 vb 中,我们可以按以下步骤来创建此类窗口:

1、设置窗口的 borderstyle = 3;

2、在 form_load 中加入: = loadpicture("")

创建不规则窗口

win32 api 有很多让你意想不到的功能。要创建特殊的不规则窗

口看上去似乎很难。但我们如果我们说我们用几行代码就可以实

现,这似乎不可思议。但事实就是如此!请试试:

private declare function createellipticrgn lib "gdi32" (byval x1

as long, byval y1 as long, byval x2 as long, byval y2 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 sub form_load()

show the form!

setwindowrgn hwnd, createellipticrgn(0, 0, 300, 200), true

end sub

上述代码可以创建一个椭圆形状的窗口。怎么样??

用vb5.0获取正在系统中运行的窗口标题

山东德州 胥智强

熟悉visual basic的读者都知道,appactivate语句是激活一个应

用程序窗口其后所带的参数是指要被子激活的应用程序窗口标题条的

字符串。如果要激活的是一个常见的应用程序,我们在编写程序时就

可以直接写上此程序的窗口标题。例如,我们想激活windows95的计

算器,可先运行程序x=shell("",1),然后再激活计算器窗口

appactivate“计算器”,则程序焦点自动转到计算器窗口上。然而单

纯使用该方法局限性非常大,比如上述例子,如果我们放在英文

windows95上运行,计算器的窗口标题就不是“计算器”,而是

“calculator”。再一个局限性就是在很多情况下我们并不知道要激活

的程序窗口标题名称,如何编制一个能自动查找程序窗口标题名称的

程序是本文要解决的问题。

我们可以采取如下办法,来获取正在系统运行的窗口标题。

在windowsapi中有一个函数:

get windows (byval hwnd as long ,byval wcmd as long) as

long

其中,hwnd是当前窗口句柄,wcmd是与hwnd有联系的常量,

其含义如下:

wcmd值

含义

gw-ghild

第一个子窗口

gw-hwndfirst

子窗口的第一兄弟窗口,其第一个顶层窗口

gw-hwndlast

子窗口的最后一个兄弟窗口,或最后一个顶层窗口

gw-hwndnext

后继窗口

gw-hwndprcv

先前窗口

gw-owner

窗口拥有者

此函数返回值是wcmd所指的窗口的句柄。

我们利用此句柄 ,再用函数get windowstext (byval hwnd as

long ,byval ipstring as string, byval cch as long) as long,将句柄

hwnd指定的窗口标题放入一个字符串变量ipstring中,cch是指放入

ipstring中的最大字符数。此函数成功时返回字符串长度,如果窗口

无标题则返回零。

在使用get windowstext函数前,还要先用函数get

windowstextlength (byval hwnd as long )as long得到hwnd指

定窗口标题的长度,放入cch中。

自编一个过程findtitle()查找系统中正在运行的所有标题,首先获

得第一个顶层窗口句柄currwnd,而后采用while…wend循环结构,

当currwnd不为零而且标题文本长度不为零时,将获得的标题存入列

表框combo1,再找后继窗口的句柄,当句

柄currwnd=0时表示已没有了后继窗口,退出循环。这样就将系

统中所有的窗口句柄及标题找出来了。

然而调试中发现用此方法找到的窗口标题非常多,这说明

windows系统运行时有许多隐含的窗口,而这些窗口是我们所不需要

的,而且用appactivate激活时也出现错误。

因此我们再自编一个过程sift ()查找可激活的窗口。其方法是用

appactivate逐个激活所有窗口,出现错误的丢掉,保留可激活的窗口

标题,放入列表框combo2。

首先新建窗体form1,caption=“获取窗口标题”,在窗体

form1上建立两个标签,label1,caption=“所有窗口标题”,

n=“可激活的窗口标题”;建立两个下拉列表框,

combo1存放系统中的所有标题名称,combo2存放可激活的标题名

称;再建立两个命令按钮,n=“激活窗体”,可

对所列窗体进行测试,命令按钮n=“刷新”,点

击它可重新查找所有在系统中的窗体名称,当本程序运行以后又运行

了新程序时使用此按钮。

从vb系统菜单上选取project中的add module,将下述api函

数及一些常量录入。

module 模块

declare function getwindow lib "user32"(byval hwnd as long,

byval wcmd as long)as long

declare function getwindowtext lib "user32"

aias"getwindowtexta" (byval hwnd as long, byval lpstring as

string,byval cch as long)as long

declare function getwindowtext length lib "user32"

aias"getwindowtextlengtha" (byval hwnd as long)as long

public const gw-hwndfirst=0

public const gw-hwndlast=1

public const gw-hwndnext=2

public const gw-hwndprev=3

public const gw-owner=4

建立两个子程序:

sub findtitle ()

查找桌面上的所有窗口标题

dim currwnd as integer

currwnd=getwindow (hwnd, gw-hwndfirst)

while currwnd<>0

length= getwindow textlength (currwnd)

listitem$=space $(length +1)

length= getwindow text (currwnd,listitem$,length+1)

if length>0 then

m listitem $

end if

currwnd= getwindow (currwnd, gw-hwndnext)

if unt>0 then

= (0)

dex =0

else

msgbox“没有发现可活动的窗口”,16,“活动”

end if

wend

end sub

sub sift ()

测试窗口能否活动

i=0

do

on local error resume next

appactivate (i)

if err =0 then

m (i)

end if

i=i+1

loop unti 1 i=unt-1

appactivate n

if unt>0 then

= (0)

dex =0

else

msgbox “没有发现可活动窗口”,16,“活动”

end if

end sub

private sub form-load ()

首先将本窗体显示出来,否则查找出的窗体标题没有

本身

msgbox "开始查找窗口标题"

call findtitle

call sift

end sub

private sub command1-click ()

f $=

on local error resume nex

t

appactivate f $

end sub

private sub command2-click ()

call findtitle

call sift

end sub

本程序在visual basic5.0上调试通过。

利用form_queryunload询问使用者是否关闭窗口

如 何 在 窗 口 关 闭 时 , 询 问 使 用 者 是 否 确 定 关 闭 , 若

否, 则 取 消 关 闭 动 作 , 若 是 则 结 束 程 序 !

这 是 一 个 很 重 要 的 问 题 , 想 想 , 如 果 还 有 编 辑 中 的

档案 尚 未 存 档 , 但 一 时 忘 了 按 下 「 关 机 」 钮 , 那 么 编 辑

中的 文 件 难 道 就 不 存 档 了 吗 ? 为 了 避 免 这 种 事 情 的 发 生 ,

windows 在 关 机 以 前 会 徵 询 每 一 个 窗 口 是 否 同 意 关 机 ,

而对 vb 程 序 而 言 , 所 收 到 「 徵 询 同 意 关 机 」 的 事 件 是

form_queryunload,如 果 程 序 不 同 意 关 机 , 可 以 将 叁 数 中

的 cancel 设 定 为 true,如 下 :

private sub form_queryunload(cancel as integer,

unloadmode as integer)

cancel = true

end sub

则 windows 便 会 终 止 关 机 的 动 作 。 只 有 在 所 有 窗 口 都

同意 关 机 的 情 况 下 , windows 才 会 真 的 关 机 。

如 何将「拒 绝 被 盖 住 的 窗 口 」还 原

如 果 form 已 执 行 过 拒 绝 被 盖 住 的 窗 口 功 能, 应 如 何 将

它 恢 复 成 正 常 的 form ?

拒绝被盖住 ret = setwindowpos(, -1, 0, 0, 0, 0, 3)

恢复正常 ret = setwindowpos(, -2, 0, 0, 0, 0, 3)

文章整理:西部数码--专业提供域名注册、虚拟主机服务

/doc/,

以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请

保留以上信息,谢谢!

方法一

这种方法是在窗体的MouseDown、MouseUp和MouseMove

等事件的处理过程中添加代码,实目前鼠标左键按下后移动时,改动

窗体的Left和Top属性,实现移动无标题栏的窗体。

进入VB,把窗体Form1的BorderStyle属性设置为0-None(无

标题栏),再窗体上添加一个ButtonCommand组件,用来关闭程式。

代码如下:

Private Type POINT

X As Single

Y As Single

End Type

Dim FormP As POINT

’记录窗体原始位置

Dim MouseP As POINT

’记录鼠标按下时的位置

Dim MouseLButtonDown As Boolean

’记录鼠标左键是否按下

Private Sub Command1_Click()

End ’退出程式

End Sub

Private Sub Form_MouseDown(Button As Integer,Shift As

Integer,X As Single,Y As Single)

FormP.X =

’记下窗体原始坐标位置

FormP.Y =

MouseP.X = X

’记下鼠标按下时的位置

MouseP.Y = Y

If Button = 1 Then

MouseLButtonDown = True

’鼠标左键按下

End If

End Sub

Private Sub Form_MouseMove(Button As Integer,Shift As

Integer,X As Single,Y As Single)

If MouseLButtonDown Then

= FormP.X + (X - MouseP.X) ’移动窗体

= FormP.Y + (Y - MouseP.Y)

End If

End Sub

Private Sub Form_MouseUp(Button As Integer,Shift As

Integer,X As Single,Y As Single)

MouseLButtonDown = False

’鼠标左键弹起

End Sub

上述方法不是非常完善,制作出的窗体被拖动时,窗体会随鼠标

的移动而移动。而在默认的视窗系统设置中拖动窗体时,被拖动的窗

体不会随窗体的移动而移动,随窗体移动的仅是个和窗体形状、大小

相同的虚框,只有释放鼠标后,窗体才会移动到释放鼠标时虚框的所

在处。要实现这种效果,请看第二种方法。

方法三

Option Explicit

'变量声明

'MoveScreen,布尔型变量,标示窗体是否处于被移动状态

Dim MoveScreen As Boolean

'鼠标位置

Dim MousX As Integer

Dim MousY As Integer

'窗体位置

Dim CurrX As Integer

Dim CurrY As Integer

'“退出”按钮

Private Sub CmdExit_Click()

End

End Sub

'当鼠标在窗体上按下时

Private Sub Form_MouseDown(Button As Integer, Shift As

Integer, X As Single, Y As Single)

'---------------------------------------------

'参数说明:

'---------------------------------------------

'button 返回一个整数,用来标识按下或释放的是哪一

'个按钮。button 参数的值为相应于左按钮(1)右按钮

'(2),以及中间按钮(4)。

'---------------------------------------------

'shift 返回一个整数,在鼠标按钮被按下或者被释放

'的同时,SHIFT,CTRL,和 ALT 键的状态,返回的shift

'参数值分别为1,2,和 4。指示这些键的状态。

'---------------------------------------------

'x, y 返回一个指定鼠标指针当前位置的数。

'---------------------------------------------

'如果是鼠标左键按下

If Button = 1 Then

'标示为移动状态

MoveScreen = True

'得到鼠标在窗体上的位置(相对与窗体内部坐标)

MousX = X

MousY = Y

End If

End Sub

'当鼠标在窗体上移过时

Private Sub Form_MouseMove(Button As Integer, Shift As

Integer, X As Single, Y As Single)

'如果处于鼠标左键按下的状态,即MoveScreen = True时

If MoveScreen Then

'计算新的窗体坐标值

'仔细想一下,看看是不是这样

CurrX = - MousX + X

CurrY = - MousY + Y

'移动窗体到新的位置

CurrX, CurrY

End If

'把新的窗体坐标显示出来,是相对于屏幕的坐标

n = CurrX

n = CurrY

'把鼠标点击的位置显示出来,是相对与窗体的坐标

n = MousX

n = MousY

End Sub

'如果鼠标松开,则停止拖动

Private Sub Form_MouseUp(Button As Integer,

Integer, X As Single, Y As Single)

MoveScreen = False

End Sub

这是移动窗体的,只要把form都改成picture,再加上

,

As Shift


发布者:admin,转转请注明出处:http://www.yc00.com/news/1719890958a2759092.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信