**************************************************************************
      被问题困扰数月,多方求教,怎奈何程序太平洋内外,VB情报局上下,菜鸟茫茫,大都不明白问题,还胡乱作答,哎~
  无奈,只好来CSDN开个“聚英堂”,恳请大侠们现身说法。
**************************************************************************
问题如下:大家知道一般程序生成的窗口都会在任务栏上创建一个按钮,在这个按钮上右击可以弹出sysmenu,而如果用鼠标左键单击任务栏按钮,则窗口会最小化,再点一下任务栏按钮则窗口又恢复到桌面显示。
    
   但如用以下(VB)代码后,就失去了以上特性!请问如何恢复!
'-------------------------------------------------------------------------Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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
Const GWL_STYLE = (-16)
Const WS_CAPTION = &HC00000Private Sub Form_Load()
Form1.WindowState = 1
SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(Me.hwnd, GWL_STYLE) And Not WS_CAPTION
End Sub
'-------------------------------------------------------------------------
强调一下:   
 我所谓的“失去的特性”是指:
 用了以上代码后,鼠标左键单击窗口在任务栏里相应的按钮无法使窗口最小化。

解决方案 »

  1.   

    '-------------------------------------------------------------------------Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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
    Const GWL_STYLE = (-16)
    Const WS_CAPTION = &HC00000Private Sub Form_Load()
    Form1.WindowState = 1
    SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(Me.hwnd, GWL_STYLE) 
    End Sub
    '-------------------------------------------------------------------------
    用这段就可解决问题.
    实际上这段代码没什么用,因为直接在Form里设置相应属性,就可得到你要的效果.
    请问你要的效果是什么?
    hehe.......
      

  2.   

    To welon(辉哥):   不改变窗体风格,问题还存在吗?我还用来问吗?←这个两个问题你一定能答对,我相信。
      

  3.   

    Option ExplicitPrivate Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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
    Const GWL_STYLE = (-16)
    Const WS_CAPTION = &HC00000
    Const WS_SYSMENU = &H80000
    Const WS_THICKFRAME = &H40000
    Const WS_SIZEBOX = WS_THICKFRAME
    Const WS_OVERLAPPED = &H0&
    Const WS_TILED = WS_OVERLAPPED
    Const WS_MINIMIZEBOX = &H20000
    Const WS_MAXIMIZEBOX = &H10000
    Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
    Const WS_TILEDWINDOW = WS_OVERLAPPEDWINDOWPrivate Sub Form_Load()
    Form1.WindowState = 1
    SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(Me.hwnd, GWL_STYLE) And Not (WS_OVERLAPPEDWINDOW)
    End Sub-----------------------------------------
    这样就再2000下失效了,反向设置就可以解除。
      

  4.   

    晕~~ 我不明白你要干吗?
    getwindowlong 后保存原来的窗体信息,再用 setwindowlong 设回去不就成了?我真的不明白你要干吗
      

  5.   

    哎~ 这年头,找个高手还真难~  
    看看这个帖子就明白了:   http://www.5ivb.net/club/dispbbs.asp?boardID=1&ID=13250
      

  6.   

    因为你去掉了WS_CAPTION呀,你说的那个弹出系统菜单的效果必须要WS_CAPTION,在电脑爱好者的细水长流API中有一篇文章就是专门说这个窗体样式的,可以看一看就能明白了...不好意思,在公司上网,没法给出例子,如需实例,Mail给我[email protected]夜已深,还有什么人,像我这样,醒着在编程
    -------------------------------
    海纳百川,有容乃大;
    壁立千仞,无欲则刚。
      

  7.   

    晕~各位老大,回答前,请看看这这个帖子吧~http://www.5ivb.net/club/dispbbs.asp?boardID=1&ID=13250