窗口无系统标题,BORDERSTYLE设的是2,
运行时,用FrmMain.WindowState = 1
GActive = 0最小化,(窗体的showintaskbar=true)但是我最小化后,在任务栏点却不能还原,也没有系统的那个菜单(还原/关闭/最大化)。该如何实现呢,谢谢。

解决方案 »

  1.   

    对于这种没有标题栏的窗体,设置了showintaskbar=FALSE还好办,因为在左下方“开始”图标上方有一个缩小了的窗体,可以还原。如果设置了showintaskbar=true,任务栏上虽然有显示,但可能没有鼠标右键菜单,这时没有托盘菜单的话难办!!
      

  2.   

    怎么说的这么复杂...GActive 是什么?
      

  3.   


    GACTIVE   不用考虑 是程序控制上用的
      

  4.   

    无边框窗体应该这样设计:
    BorderStyle = 0
    ShowInTaskbar = True
    这样最小化后点任务栏按钮可以自动恢复。
      

  5.   

    这个问题不好解决,若解决了请说一下解决方法。我尝试发最大化、最小化那些WM_SYSCOMMAND消息模拟,失败了。不好解决吧。
      

  6.   


    说错了 BORDERSTYLE是设的0 ,但是 这样在任务栏右键点么系统菜单。
      

  7.   

    想要在BORDERSTYLE为0时也要有最大化/最小化的任务栏菜单是吧?好说.以前我写一个程序时也遇到这问题,不过后来解决了.思路:先将窗体的样式用SetWindowLong设置为有任务栏菜单,再用子类化去处理最大化/最小化消息.代码:'*************************************************************************
    '**模 块 名:ModStyle
    '**说    明:为无标题栏窗口添加任务栏右键菜单
    '**创 建 人:马大哈
    '**日    期:2003年10月26日
    '*************************************************************************
    Option ExplicitPrivate Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    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 Const GWL_STYLE = (-16)
    Private Const WS_SYSMENU = &H80000
    Private Const WS_SIZEBOX = &H40000
    Private Const WS_MAXIMIZEBOX = &H10000
    Private Const WS_MINIMIZEBOX = &H20000
    Private Const GWL_WNDPROC = (-4)
    Private Const WM_GETTEXT = &HD
    Private Const WM_EXITMENULOOP = &H212
    Private Const WM_DESTROY = &H2
    Private Const SC_CLOSE = &HF060&
    Private Const SC_MOVE = &HF010&
    Private Const WM_SYSCOMMAND = &H112Public PrevWndProc As LongPublic Function SubWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongSelect Case msg
        Case WM_SYSCOMMAND
            If wParam = SC_CLOSE Then        '关闭消息处理
                IsExit = True
                Unload frmMain
            ElseIf wParam = SC_MOVE Then        '不可移动
                Exit Function
            End If
    End SelectSubWndProc = CallWindowProc(PrevWndProc, hwnd, msg, wParam, lParam)     '其它消息不管End FunctionPublic Function SetStyle(ByVal WindowHwnd As Long)
        SetWindowLong WindowHwnd, GWL_STYLE, WS_SYSMENU Or WS_MINIMIZEBOX
        PrevWndProc = SetWindowLong(WindowHwnd, GWL_WNDPROC, AddressOf SubWndProc)
    End FunctionPublic Function UnloadStyle(ByVal WindowHwnd As Long)
        If PrevWndProc <> 0 Then
            SetWindowLong WindowHwnd, GWL_WNDPROC, PrevWndProc
        End If
    End Function
    调用时,在窗体LOAD事件里用:    SetStyle Me.Hwnd在窗体UnLoad事件里调用:(一定要调用,且程序不能在这之前用END跳出)    UnloadStyle Me.Hwnd最终效果可以做到点击任务栏按钮时实现显示与缩小,与BORDERSTYLE=2效果一样,并且窗体不能移动.你可以把SC_MOVE消息的处理那一环去除,如果你的窗体要求可以移动的话.
      

  8.   

    谢谢你的帮助。在调用时报了个"invalid use of addressof operator"
    然后光标停在PrevWndProc = SetWindowLong(WindowHwnd, GWL_WNDPROC, AddressOf SubWndProc)处 
      

  9.   

    老马说得对,回调函数SubWndProc要放在标准模块里面。