| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2354 人关注过本帖
标题:无标题栏窗体的问题?
只看楼主 加入收藏
dkp88
Rank: 1
等 级:新手上路
帖 子:235
专家分:5
注 册:2004-10-18
结帖率:33.33%
收藏
 问题点数:0 回复次数:8 
无标题栏窗体的问题?
我想得到的效果:
    窗体无标题栏,可以:最大化,还原,最小化,拖动窗体大小,四个小角带弧度,保留Form的Caption值和ICON图标,任务栏有本窗口的任务按钮(在按钮点击右键保留以前的菜单),最大化时跟正常窗体一样(不要覆盖全屏)。

我遇到的问题:
    当窗体BorderStyle设为0,showInTaskbar设为true时:运行窗体:最大化时,他会将状态栏盖掉;状态栏中的按钮点击右键也没有菜单;
[bold]其实我就想得到:把窗体BorderStyle设为0时,最大化后,不覆盖任务栏。[/bold]

我下载的窗体源码:
漂亮的窗体.rar (46.07 KB)


请各位大哥帮小弟看看,帮小弟实现效果,感激不尽!

[[italic] 本帖最后由 dkp88 于 2008-1-21 10:52 编辑 [/italic]]
搜索更多相关主题的帖子: 标题栏 窗体 按钮 任务 效果 
2008-01-19 18:25
dkp88
Rank: 1
等 级:新手上路
帖 子:235
专家分:5
注 册:2004-10-18
收藏
得分:0 
急啊!
能有哪位大哥指点一下吗?感激啊!

学程序真有味!
2008-01-21 10:46
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:0 
子类化窗体,让窗体的最大化时的高度始终小于或等于屏幕高度减去任务栏高度。

VB QQ群:47715789
2008-01-22 09:52
随风逐流
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:passerby
等 级:版主
威 望:8
帖 子:4054
专家分:271
注 册:2007-6-13
收藏
得分:0 
偶像,问下。
子类化窗体有何作用?
速度快还是代码方便还是?

[url=http://www./html/6/6694/]极道金丹[/url][url=http://www./html/2/2849/]九阴九阳[/url][url=http://www./html/2/2596/]凡人修仙传[/url]
2008-01-22 10:15
dkp88
Rank: 1
等 级:新手上路
帖 子:235
专家分:5
注 册:2004-10-18
收藏
得分:0 
再次求助,能否帮忙简单做一个!
具体的操作能否做一个简单的程序!谢谢。

[[italic] 本帖最后由 dkp88 于 2008-1-24 18:25 编辑 [/italic]]

学程序真有味!
2008-01-24 17:31
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:0 
这是一个简单的演示,这里只演示了状态栏在底部的情况下,具体使用的时候要考虑到状态栏在其它方向时的状态,如靠左、靠右等。
在工程中添加一个窗体,一个模块,窗体设为无边框模式,并添加三个按钮,窗体中代码如下:
程序代码:
Option Explicit

Private Sub Command1_Click()
  Me.WindowState = vbMinimized
End Sub

Private Sub Command2_Click()
  Me.WindowState = Me.WindowState Xor vbMaximized
End Sub

Private Sub Command3_Click()
  Unload Me
End Sub

Private Sub Form_Load()
  FormSizeHook Me.hWnd
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  UnFormSizeHook
End Sub
模块中代码如下:
程序代码:
Option Explicit

Private Type POINTAPI
  X As Long
  Y As Long
End Type

Private Type MINMAXINFO
  ptReserved        As POINTAPI
  ptMaxSize         As POINTAPI
  ptMaxPosition     As POINTAPI
  ptMinTrackSize    As POINTAPI
  ptMaxTrackSize    As POINTAPI
End Type

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam 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 Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long

Private Const SPI_GETWORKAREA = 48
Public Const GWL_WNDPROC = (-4)
Public Const WM_GETMINMAXINFO = &H24

Private OldProc&, mhWnd&

'==================================================
'回调
Function FormSizeWinProc&(ByVal hWnd&, ByVal wMsg&, ByVal wParam&, ByVal lParam&)
  Dim RectVal As RECT
    Select Case wMsg&
        Case WM_GETMINMAXINFO
            Dim MinMax As MINMAXINFO
            
            CopyMemory MinMax, ByVal lParam, Len(MinMax)
            SystemParametersInfo SPI_GETWORKAREA, 0, RectVal, 0

            MinMax.ptMaxTrackSize.Y = RectVal.Bottom
            
            CopyMemory ByVal lParam, MinMax, Len(MinMax)
            
            FormSizeWinProc& = 1
            Exit Function
    End Select
    
    FormSizeWinProc& = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)
End Function
'==================================================


'==================================================
'挂钩
Sub FormSizeHook(ByVal nhWnd&)
    If OldProc <> 0 Then Exit Sub
    mhWnd& = nhWnd&
    OldProc = SetWindowLong(nhWnd&, GWL_WNDPROC, AddressOf FormSizeWinProc)
End Sub
'==================================================


'==================================================
'脱钩
Sub UnFormSizeHook()
    If OldProc = 0 Then Exit Sub
    SetWindowLong mhWnd, GWL_WNDPROC, OldProc
    OldProc = 0
End Sub
'==================================================
收到的鲜花
  • geziang2008-02-05 21:42 送鲜花  2朵   附言:精品文章

VB QQ群:47715789
2008-01-25 15:32
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:0 
原帖由 [bold][underline]随风逐流[/underline][/bold] 于 2008-1-22 10:15 发表 [url=http://bbs.bccn.net/redirect.php?goto=findpost&pid=1185549&ptid=198043][/url]
偶像,问下。
子类化窗体有何作用?
速度快还是代码方便还是?


主要是方便,因为如果只是简单的在Form的最大化里控制大小的话,如果用户自己拉高状态栏的高度话,程序就又没法控制了,但这上面的方法的话,不管是拉大窗口本身还是状态栏都会自动调整的。这是一个一劳永逸的方式。

VB QQ群:47715789
2008-01-25 17:04
wyfandy
Rank: 1
来 自:深圳
等 级:新手上路
帖 子:376
专家分:0
注 册:2006-12-11
收藏
得分:0 
Joforn这方法不错,很好

不论什么事,只要认准了一个目标,然后朝之不懈地努力,就一定实现。编程爱好者QQ群:21318556
2008-01-26 10:53
dkp88
Rank: 1
等 级:新手上路
帖 子:235
专家分:5
注 册:2004-10-18
收藏
得分:0 
真不错,谢谢Joforn
Joforn解决问题很实在!谢谢!请各位路过的朋友保留源码!难得。
    想再请教一下:我将窗体的BorderStyle设为0,ShowInTaskbar设为True后。任务栏中的此任务图标右键菜单没有了。请问如何才能保留。
    如果用鼠标拖动窗体上、下、左、右、左上、左下、右上、右下角或者只拖[bo]右下角[/bo]时,窗体随拖动而改变大小呢!

[[it] 本帖最后由 dkp88 于 2008-1-29 13:54 编辑 [/it]]

学程序真有味!
2008-01-29 13:50
快速回复:无标题栏窗体的问题?
数据加载中...
 
   



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

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