
窗口最大化尺寸,就是屏幕尺寸:screenwidth 宽
screenheight 高
窗口窗户区尺寸,比如窗口名form1:screenwidth -(form1width-form1scalewidth) 宽
screenheight-(form1height-form1scaleheight) 高
要使运行时窗体大小等于屏幕大小,可以在设计阶段在属性窗口中设置窗体的WindowState属性的值为2-Maximized。或者在代码窗口,窗体加载时设置如下代码:
Private Sub Form_Load()
MeWindowState = 2
End Sub
现在宽屏,大屏幕显示器越来越普遍,原来在800600下设计的软件界面,在大屏幕显示器(16801050)上界面总是缩到一角,非常难看,要将老程序的界面按照不同的分辨率在重新进行设计编程,整个过程比较复杂而且实用性不大,如果原来程序比较大且界面比较多的话那么工作量也将是巨大的,而且还可能出现其他错误,有没有一种重要增加少许代码就能将所有的界面自动适应不同的分辨率呢,在网上搜索了一下有很多现成的方法,但或多或少都有些问题,总之没有完美的解决方案,我经过研究找到了一种方法基本可以解决所有问题,与大家共享,当然该代码中所考虑的控件不完全,有些控件还需要特别处理,这个我在后面的常见问题说明里会提到,具体的代码需要你自己去添加。
代码如下:
1、新建一个模块(generalbas),在上面添加两个函数;
Public Type CONTROLRECT
Left As Single
Top As Single
Width As Single
Height As Single
End Type
Public Const HORZRES = 8
Public Const VERTRES = 10
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
'取得界面原始控件的位置及大小,并保存到数组里
Public Sub GetSourcePos(this As Object, rc() As CONTROLRECT, Optional bigFont As Boolean = True)
Dim tempX As Integer, tempY As Integer
tempX = thisScaleWidth '1024
tempY = thisScaleHeight '768
'此处原来如果在1024768分辨率下显示正常的话,就可以直接赋值1024和768
Dim temp As Control
Dim nSum As Integer
nSum = 0
For Each temp In this
'此处要注意,有些控件没有width,height等属性,在此要做出判断
If TypeOf temp Is ComboBox Then
With rc(nSum)
Left = tempLeft / tempX
Width = tempWidth / tempX
Top = tempTop / tempY
End With
' ElseIf TypeOf temp Is MSComm Then
' 'none
' ElseIf TypeOf temp Is StatusBar Then
' 'none
Else
With rc(nSum)
Left = tempLeft / tempX
Width = tempWidth / tempX
Top = tempTop / tempY
Height = tempHeight / tempY
End With
End If
nSum = nSum + 1
Next
End Sub
'根据比例调整控件的大小
Public Sub SetNewPos(this As Object, rc() As CONTROLRECT)
Dim tempX As Integer, tempY As Integer
tempX = thisScaleWidth '1024
tempY = thisScaleHeight '768
' '如果初始界面显示始终是以最大化的方式显示的话,此处就可以调用系统分辨率进行设置tempx,tempy
' hwnd = GetDesktopWindow()
' ' Get the device context for the desktop
' hdc = GetWindowDC(hwnd)
' If hdc Then
' Dim a As Long, b As Long
' a = GetDeviceCaps(hdc, HORZRES)
' b = GetDeviceCaps(hdc, VERTRES)
' tempX = a
' tempY = b
' End If
' ReleaseDC hwnd, hdc
Dim temp As Control '//用于取各种控件
Dim nSum As Integer
nSum = 0
For Each temp In this
'此处要注意,有些控件没有width,height等属性,在此要做出判断
If TypeOf temp Is ComboBox Then
tempLeft = rc(nSum)Left tempX
tempWidth = rc(nSum)Width tempX
tempTop = rc(nSum)Top tempY
' ElseIf TypeOf temp Is MSComm Then
' 'none
' ElseIf TypeOf temp Is StatusBar Then
' 'none
Else
tempLeft = rc(nSum)Left tempX
tempWidth = rc(nSum)Width tempX
tempTop = rc(nSum)Top tempY
tempHeight = rc(nSum)Height tempY
End If
nSum = nSum + 1
Next
End Sub
2、在form窗体中定义如下变量
Dim oldpos() As CONTROLRECT
Private Sub Form_Load()
ReDim oldpos(MeControlsCount)
GetSourcePos Me, oldpos
End Sub
Private Sub Form_Resize()
SetNewPos Me, oldpos
End Sub
常见问题及解决:
(1) 以上代码单纯的form窗体,根据窗口大小自动调整窗体控件时没有任何问题的,但是如果该窗体是mdi子窗体的话这种办法就会失灵,请看问题2;
(2) 如果form是mdi子窗体的话怎么解决呢,将各个窗体的初始窗体啊全都设置为最大化窗体,然后根据分辨率的大小来调整窗体(上面代码中注释的部分,以固定比例来修改控件大小)。但是这样就缺少灵活性,不能随窗口的大小的改变而自动改变大小,大多数mdi程序,其子窗体都是最大化显示的,只跟系统分辨率有关;
(3) 如果有line,shape等控件放在picture控件里,且picture控件的坐标模式在form_load期间又改变了,则这些控件在每次resize时其大小和位置也会相应的改变,这个问题的解决办法就是在每次resize之前将picture的scalemode改为pixel状态,(还有问题,改过之后定位可能不准确了);还有一个好办法,就是SetNewPos函数每次load后只调用一次。
(4) 对于在form_load事件中就开始画图,并设置picture等控件的坐标时会出问题,设置的坐标为控件更改前的大小,而不是更改后的大小。
(5) 发现sstab控件的兼容性有问题,修改大小后,点击sstab,隐藏界面无法显示,根据其特性(隐藏界面的控件位置left-75000)重新写函数进行处理。
如果背景需要自动调整大小的话,可加入以下代码(在窗体中引入背景,将AutoRedraw设置为true)
Private Sub Form_Resize()
Dim objPicBuf As IPictureDisp
AutoRedraw = True
Set objPicBuf = Picture
PaintPicture objPicBuf, 0, 0, ScaleWidth, ScaleHeight
End Sub
在有些软件里当鼠标移到某单词上,其注释就会显示单词的中文解释这样的软件是如何制作的呢下面我就介绍以下获取鼠标所在单词的方法,至于中文结实要关系到数据库及字库问题在此我不做解释
首先建立新工程,在FORM上添加一个TEXT文本框
声明SendMessage函数
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const EM_CHARFORMPOS=&HD7注释:在API浏览器里无此值请自己加上
自定义过程:
Private Sub Text1_MouseDown(Button As Intege,Shift As Integer,x As Single, y As Single)
注释:获取鼠标所点的是第几行第几个字符
Dim pos As Long,Lc As Long
Dim Line As Integer,CharPos As Integer
x=x/ScreenTwipsPerPixelX
y=y/ScreenTwipsperPixelY
pos=x+y65536
Lc=SendMessage(Text1hwnd,EM_CHARFROMPOS,0,ByVal pos)
Line=Lc65536 注释:第几行
CharPos=Lc MOD 65536 注释:第几个字符
End Sub
注释:接下来才是真正的读取函数
Function GetWord(txt As TextBox,pos As Integer) As String
Dim bArr()As Byte,pos1 As Integer,pos2 As Integer, i As Integer
bArr=StrConv(txtText,vbFromUnicode)注释:转换成Byte数组
pos1=0:pos2=UBound(bArr)
注释:向前搜索分格符的位置
For i=pos-1 To 0 Step -1
If IsDelimiter(bArr(i)) Then
pos1=i+1
Exit For
End If
Next
注释:向后搜寻分隔符字符的位置
For i=pos To UBound(bArr)
If IsDelimiter(bArr(i)) Then
pos2=i-1
Exit For
End If
Next
注释:截取pos1-pos2之间的字符,以构成一个单词
If pos2>pos1 Then
ReDim bArr2(pos2-pos1) As Byte
For i=pos1 To Pos2
bArr2(i-pos1)=bArr(i)
Next
GetWord=StrConv(bArr2,vbUnicode)
Else
GetWord=""
End If
End Function
注释:IsDelimiter函数
Functon IsDelimiter(ByVal Char As Byte) As Boolean
Dim S As String
S=Chr(Char)
IsDelimiter=False
If S=" " Or S="," Or S="" Or S="" Or S="vbCr Or S=vbLf Then
IsDelimiter=True
End If
End Function
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 Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Const SWP_HIDEWINDOW = &H80 '隐藏视窗
Const SWP_SHOWWINDOW = &H40 '显示视窗
'在程序中若要隐藏任务栏
Private Sub Command1_Click()
Dim Thwnd As Long
Thwnd = FindWindow("Shell_traywnd", "")
Call SetWindowPos(Thwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW)
Command1Top = 0
'下面三句是form全屏
MeWindowState = 0
MeMove 0, 0, ScreenWidth, ScreenHeight
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim Thwnd As Long
Thwnd = FindWindow("Shell_traywnd", "")
Call SetWindowPos(Thwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW)
End Sub
Private Sub Form_Load()
Dim x As Integer, y As Integer
x = ScreenWidth / ScreenTwipsPerPixelX
y = ScreenHeight / ScreenTwipsPerPixelY
MsgBox x
MsgBox y
End Sub
以上就是关于vb窗体最大化的高度与宽度是多少全部的内容,包括:vb窗体最大化的高度与宽度是多少、vb 怎样使窗体大小等于屏幕大小、关于VB窗口调整大小的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)