| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1430 人关注过本帖
标题:微软没有发现的VB与VBA的BUG——关于窗体子类化
取消只看楼主 加入收藏
me4405801
Rank: 2
等 级:论坛游民
帖 子:37
专家分:17
注 册:2006-8-31
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:2 
微软没有发现的VB与VBA的BUG——关于窗体子类化
很多人认为理论上VB与VBA没有区别,可是事实真的如此吗?

 因为程序需要,我用WORD在VBA中插入了一个用户窗体USERFORM1,并且将该窗体子类化了。

  但是程序运行后,窗体的标题栏似乎是一个“禁区”,无论在标题栏鼠标左击、右击,或者左击窗体右上角的关闭按钮,都会导致程序停止响应,包括WORD,可是在VB环境中却不会出现这种现象……

 我实在就迷茫了,不知道为什么,怎么解决?

  跪求各位大神不吝赐教啊~!!~!


  相关代码如下:
  '在USERFORM1中
  Private Sub UserForm_Click()
  Unload UserForm1
  End Sub

  Private Sub UserForm_Initialize()
      FrmHwnd = FindWindow(vbNullString, UserForm1.Caption)
      lpPrevWndProc = SetWindowLong(FrmHwnd, GWL_WNDPROC, AddressOf WindowProcTest)

  End Sub

  Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
      SetWindowLong FrmHwnd, GWL_WNDPROC, lpPrevWndProc
  End Sub

  '在模块中
  Public Const GWL_WNDPROC = -4

  Public lpPrevWndProc   As Long

  Public FrmHwnd As Long

  Public Declare Function SetWindowLong _
                 Lib "user32" _
                 Alias "SetWindowLongA" (ByVal hwnd As Long, _
                                         ByVal nIndex As Long, _
                                         ByVal dwNewLong As Long) As Long
  Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

  Public 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
  Public Function WindowProcTest(ByVal hwnd As Long, _
                             ByVal uMsg As Long, _
                             ByVal wParam As Long, _
                             ByVal lParam As Long) As Long


      WindowProcTest = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)

  End
搜索更多相关主题的帖子: 标题栏 用户 
2013-04-16 17:02
me4405801
Rank: 2
等 级:论坛游民
帖 子:37
专家分:17
注 册:2006-8-31
收藏
得分:0 
感谢2楼大大的回复~!

难道就没有好一点的解决方案吗?

而且VBA中的用户窗体和VB中还有很多不同,例如VBA中用户窗体好像无法设置为TOPMOST

SetWindowPos Frmhwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_SHOWWINDOW

测函数对VBA的用户窗体无效~!
2013-04-16 17:51
me4405801
Rank: 2
等 级:论坛游民
帖 子:37
专家分:17
注 册:2006-8-31
收藏
得分:0 
算了,还是我给一个解决方法吧,这个方法没有解决问题,而是逃避了问题,就是把窗体的标题栏隐藏。

具体代码如下,在窗体的Initialize事件中插入以下代码。(相应声明请自行补齐)
Private Sub UserForm_Initialize()
    FrmHwnd = FindWindow(vbNullString, UserForm1.Caption)
    Dim FrmStl As Long
    FrmStl = GetWindowLong(FrmHwnd, GWL_STYLE)
    FrmStl = FrmStl - WS_CAPTION + WS_EX_TOOLWINDOW
    SetWindowLong FrmHwnd, GWL_STYLE, FrmStl
    DrawMenuBar FrmHwnd
    lpPrevWndProc = SetWindowLong(FrmHwnd, GWL_WNDPROC, AddressOf WindowProc)
   
End Sub
2013-04-16 22:08
快速回复:微软没有发现的VB与VBA的BUG——关于窗体子类化
数据加载中...
 
   



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

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