Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Form FullScreen

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος AlKiS στις 22-09-2012, 21:07. Υπάρχουν 1 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-09-2012, 21:06 71229

    Form FullScreen

    Καλησπέρα κοινότητα του .NetZone!

    Σύντομα θα πρέπει να αρχίσω την ανάπτυξη ενός νέου προγράμματος (προορίζεται για εξαιρετικά πολύ μικρές οθόνες, για ειδική χρήση). Η ανάλυση του θα είναι 640χ400 και θα πρέπει να καλύπτει ολόκληρη την οθόνη. Εύκολο... όμως κάπου εδώ αρχίζουν τα προβλήματα..

    Οι περισσότερες οθόνες που θα το έχουν, θα έχουν πράγματι 640χ400 ανάλυση. Τι θα γίνει όμως αν μπει σε ένα τάμπλετ με μεγαλύτερη ανάλυση?


    Χρειάζομαι ένα τρόπο να κάνω το πρόγραμμα FullScreen, όπως στα παιχνίδια ένα πράγμα.. Το Warcraft ΙΙΙ που παίζω για παράδειγμα, έχει ανάλυση 1280χ1024, ενώ η οθόνη μου έχει ανάλυση 1920χ1080. παρόλαυτά όμως, όταν ανοίγει το warcraft, αλλάζει η ανάλυση της οθόνης στην ανάλυση που υποδεικνύει το Warcraft III (για όσο παίζει), και αν πατήσω Alt+Tab (ή το WinKey for that matter), τότε γίνεται minimize το παιχνίδι και η οθόνη αλλάζει την ανάλυση σε αυτή που είχε πριν.

    Ακριβώς αυτό θέλω να πετύχω και εγώ.

    Έψαχνα με τις ώρες στο google σκεπτόμενος "δεν μπορεί, σίγουρα θα έχει λύσει το google... αποκλείεται να είμαι ο μόνος που θέλω κάτι τέτοιο...". Turns out δεν είμαι ο μόνος, αλλά οι λύσεις που δίνουν είναι πρόχειρες

    Είδα κώδικες του τύπου:

    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     With Me
     .MaximizeBox = False
     .MinimizeBox = False
     ' .TopMost = True
     .FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
     .WindowState = System.Windows.Forms.FormWindowState.Maximized
     End With
     End Sub

    ή του τύπου:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    '''<summary>
    ''' It will return current resolution parameters. 
    ''' It can make a form FULLSCREEN ... 
    '''</summary> 
    '''IPStudents.Info - Its all about creativity and ideas. 
    '''Author  : Yash Bharadwaj and Chander Prakash 
    '''Copyright :  Free to use.Don't remove this Sticker.
    '''Usage: Just call function fullscreen with form name as parameter.
    '''It can detect client resolution as width-x and height-y
    '''It can maximize form as fullscreen.
    '''You can make form Topmost as optional 
    '''<author>Yash Bharadwaj</author>
    '''<remarks></remarks>
    
    
    
    
    Public Class FullscreenClass
    
    
    
    Public Declare Function SetWindowPos Lib user32.dll Alias SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndIntertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags
    As Integer) As Boolean 
    
    
    
    'You also need an alias to the API function called GetSystemMetrics, like this : 
     Private Declare Function GetSystemMetrics Lib user32.dll Alias GetSystemMetrics (ByVal Which As Integer) As Integer
    
    
    'Following this you need to declare 4 constants : 
        Private Const SM_CXSCREEN As Integer = 0
        Private Const SM_CYSCREEN As Integer = 1
        Public Shared HWND_TOP As IntPtr = IntPtr.Zero
        Public Const SWP_SHOWWINDOW As Integer = 64
    
    
    'Then 2 public properties : 
    
    Public ReadOnly Property ScreenX() As Integer
           Get 
               Return
            GetSystemMetrics(SM_CXSCREEN)
           End Get
    End Property
    
    
    Public ReadOnly Property ScreenY() As Integer
            Get
                Return
            GetSystemMetrics(SM_CYSCREEN)
            End Get 
    End Property 
    
    
    Public Sub FullScreen(ByVal frm As Form, ByVal boolTopOptional As Boolean)
    
            frm.WindowState = FormWindowState.Maximized
            frm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
            Me.TopMost = boolTopOptional
            SetWindowPos(frm.Handle, HWND_TOP, 0,0, ScreenX, ScreenY, SWP_SHOWWINDOW)
    
    End Sub
    
    End Class      

    και άλλα πολλά

    Οι ιστοσελίδες που επισκέφτηκα περιλαμβάνουν, αλλά δεν περιορίζονται σε:

    • http://www.daniweb.com/software-development/vbnet/threads/78323/full-screen-apps
    • http://softwaredevelopmentinchicago.com/2009/01/03/writing-full-screen-apps-in-vbnet/
    • http://www.codeproject.com/Articles/25039/Fullscreen-the-form-in-VB-NET-using-a-class
    • http://softwaredevelopmentinchicago.com/2009/01/03/writing-full-screen-apps-in-vbnet/
    • http://weblogs.asp.net/ashben/archive/2003/10/17/32325.aspx
    • http://stackoverflow.com/questions/4649877/making-winforms-fullscreen
    • http://stackoverflow.com/questions/8657991/can-you-run-a-vb-application-in-full-screen
    • http://bytes.com/topic/visual-basic-net/answers/386016-full-screen
    • http://dhresta.wordpress.com/2010/09/24/fullscreen-in-vb-net-2010/
    • http://www.codeproject.com/Articles/16618/How-To-Make-a-Windows-Form-App-Truly-Full-Screen-a
    • http://www.daniweb.com/software-development/vbnet/threads/78323/full-screen-apps

    (και άλλα)


    Δυστυχώς δεν βρήκα λύση, και ελπίζω ότι θα μπορέσουμε να βρούμε κάτι μαζί.


    Η εναλλακτική είναι να χρησιμοποιήσω αυτό που γράφουν και όλοι οι άλλοι (δλδ maximize το παράθυρο, border style = none) και να προγραμματίσω resize για το κάθε τι μέσα στη φόρμα..

    Το θέμα είναι ότι η φόρμα θα έχει 5*4=20 εικονίδια στο πρότο tab, και άλλα 5-6 ακόμα στο δεύτερο, μαζί με textboxes, listbox, buttons...

    Κι αν θέλω να αλλάξω κάτι και να βάλω κάτι άλλο.. άντε πάλι προγραμμάτισε resize για το control..

    και δεν ξέρω καν αν μπορώ να τα κουνάω προγραμματιστικά και να φαίνονται σωστά... δεν μιλάμε μόνο για αλλαγή στο .width/height αλλά θα πρέπει και να κουνιούνται, δλδ αλλαγή και του .location(x,y).


    γιαυτό πιστεύω ότι το fullscreen είναι η σωστή λύση..

    Πείτε μου τι πιστεύετε κι εσείς.


  •  22-09-2012, 21:07 71280 σε απάντηση της 71229

    Απ: Form FullScreen

    Τελικά βρήκα ένα συνδυασμό που με μερικές αλλαγές που έκανα, σχεδόν δουλεύει..

    1) Πρώτον αυτή η κλάση για FullScreen 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Public Class clsFullScreen
    
        Public Declare Function GetSystemMetrics Lib "user32.dll" Alias "GetSystemMetrics" (ByVal which As Integer) As Integer
        Public Declare Sub SetWindowPos Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hwndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal flags As UInteger)
    
        Private Const SM_CXSCREEN As Integer = 0
        Private Const SM_CYSCREEN As Integer = 1
        Private Shared HWND_TOP As IntPtr = IntPtr.Zero
        Private Const SWP_SHOWWINDOW As Integer = 64 ' 0x0040
    
        Public Shared ReadOnly Property ScreenX As Integer
            Get
                Return GetSystemMetrics(SM_CXSCREEN)
            End Get
        End Property
    
        Public Shared ReadOnly Property ScreenY As Integer
            Get
                Return GetSystemMetrics(SM_CYSCREEN)
            End Get
        End Property
    
        Public Shared Sub SetWinFullScreen(ByVal hwnd As IntPtr)
            SetWindowPos(hwnd, HWND_TOP, 0, 0, ScreenX, ScreenY, SWP_SHOWWINDOW)
        End Sub
    End Class
    
    ' Class used to preserve / restore / maximize state of the form
    Public Class FormState
        Private winState As FormWindowState
        Private brdStyle As FormBorderStyle
        Private topMost As Boolean
        Private bounds As Rectangle
    
        Private IsMaximized As Boolean = False
    
        Public Sub Maximize(ByVal targetForm As Form)
            If Not IsMaximized Then
                IsMaximized = True
                Save(targetForm)
                targetForm.WindowState = FormWindowState.Maximized
                targetForm.FormBorderStyle = FormBorderStyle.None
                targetForm.TopMost = True
                clsFullScreen.SetWinFullScreen(targetForm.Handle)
            End If
        End Sub
    
        Public Sub Save(ByVal targetForm As Form)
            winState = targetForm.WindowState
            brdStyle = targetForm.FormBorderStyle
            topMost = targetForm.TopMost
            bounds = targetForm.Bounds
        End Sub
    
        Public Sub Restore(ByVal targetForm As Form)
            targetForm.WindowState = winState
            targetForm.FormBorderStyle = brdStyle
            targetForm.TopMost = topMost
            targetForm.Bounds = bounds
            IsMaximized = False
        End Sub
    End Class

    2) και μετά αυτό το module για αλλαγή ανάλυσης

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    Imports System.Runtime.InteropServices
    
    Module modChangeResolution
    
        Public OriginalScreenWidth As Integer = My.Computer.Screen.Bounds.Width
        Public OriginalScreenHeight As Integer = My.Computer.Screen.Bounds.Height
    
        Const ENUM_CURRENT_SETTINGS As Integer = -1
        Const CDS_UPDATEREGISTRY As Integer = &H1
        Const CDS_TEST As Long = &H2
    
        Const CCDEVICENAME As Integer = 32
        Const CCFORMNAME As Integer = 32
    
        Const DISP_CHANGE_SUCCESSFUL As Integer = 0
        Const DISP_CHANGE_RESTART As Integer = 1
        Const DISP_CHANGE_FAILED As Integer = -1
    
        Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Integer, ByVal iModeNum As Integer, ByRef lpDevMode As DEVMODE) As Integer
        Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByRef DEVMODE As DEVMODE, ByVal flags As Integer) As Integer
    
        <StructLayout(LayoutKind.Sequential)> Public Structure DEVMODE
            <MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)> Public dmDeviceName As String
            Public dmSpecVersion As Short
            Public dmDriverVersion As Short
            Public dmSize As Short
            Public dmDriverExtra As Short
            Public dmFields As Integer
            Public dmOrientation As Short
            Public dmPaperSize As Short
            Public dmPaperLength As Short
            Public dmPaperWidth As Short
            Public dmScale As Short
            Public dmCopies As Short
            Public dmDefaultSource As Short
            Public dmPrintQuality As Short
            Public dmColor As Short
            Public dmDuplex As Short
            Public dmYResolution As Short
            Public dmTTOption As Short
            Public dmCollate As Short
            <MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=CCFORMNAME)> Public dmFormName As String
            Public dmUnusedPadding As Short
            Public dmBitsPerPel As Short
            Public dmPelsWidth As Integer
            Public dmPelsHeight As Integer
            Public dmDisplayFlags As Integer
            Public dmDisplayFrequency As Integer
        End Structure
    
        Public Sub ChangeResolution(ByVal Width As Integer, ByVal Height As Integer, Optional ByVal ShowSuccessMessage As Boolean = False, Optional ByVal ShowErrorMessage As Boolean = True, Optional ShowRestartInfo As Boolean = True)
            Try
                Dim DevM As DEVMODE
    
                DevM.dmDeviceName = New [String](New Char(32) {})
                DevM.dmFormName = New [String](New Char(32) {})
                DevM.dmSize = CShort(Marshal.SizeOf(GetType(DEVMODE)))
    
    
                If 0 <> EnumDisplaySettings(Nothing, ENUM_CURRENT_SETTINGS, DevM) Then
                    Dim lResult As Integer
    
                    DevM.dmPelsWidth = Width
                    DevM.dmPelsHeight = Height
    
                    lResult = ChangeDisplaySettings(DevM, CDS_TEST)
    
                    If lResult = DISP_CHANGE_FAILED Then
                        If ShowErrorMessage Then MsgBox(strModLanguage(104), MsgBoxStyle.Critical) 'Screen Resolution Change Failed.
                    Else
    
                        lResult = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
    
                        Select Case lResult
                            Case DISP_CHANGE_RESTART
                                If ShowRestartInfo Then MsgBox(strModLanguage(101), MsgBoxStyle.Critical, strModLanguage(102)) 'You must restart your computer to apply these changes. Screen Resolution has Changed
                            Case DISP_CHANGE_SUCCESSFUL
                                If ShowSuccessMessage Then MsgBox(strModLanguage(103), MsgBoxStyle.Information) 'Screen Resolution change was Successful.
                            Case Else
                                If ShowErrorMessage Then MsgBox(strModLanguage(104), MsgBoxStyle.Critical) 'Screen Resolution Change Failed.
                        End Select
                    End If
    
                End If
    
            Catch ex As Exception
                CreateCrushFile(ex, True)
            End Try
        End Sub
    
        Public Sub RestoreResolution()
            If My.Computer.Screen.Bounds.Width <> OriginalScreenWidth OrElse My.Computer.Screen.Bounds.Height <> OriginalScreenHeight Then
                ChangeResolution(OriginalScreenWidth, OriginalScreenHeight, False, False, False)
            End If
        End Sub
    
    End Module

    Πράγματι μοιάζει αρκετά με FullScreen, η ανάλυση γίνεται αυτή του προγράμματος, το πρόγραμμα γίνεται maximized και κρύβει και το taskbar..


    Όμως υπάρχουν 2 βασικά προβλήματα!

    1) Έχω το StarDock ObjectDock στον υπολογιστή μου, και φαίνεται πάνω από το TopMost πρόγραμμά μου. Το ίδιο ισχύει και για το παραθυράκι του WinAmp που μου ενημερώνει όταν αλλάζει τραγούδι

    2) Όταν πατάω το κουμπί της έναρξης, το taskbox φαίνεται και πάλι, ενώ θα έπρεπε το πρόγραμμα να γίνεται minimize. Το ίδιο θα έπρεπε να γίνεται και όταν πατάω alt+Tab... Έλα όμως που δεν υπάρχει Event για το Application.LostFocus! και δεν μπορώ να βάλω frmMain.LostFocus διότι μπορεί κάποια άλλη φόρμα του δικού μου προγράμματος έχει focus... το θέμα είναι να βάλω να γίνεται minimize όταν ολόκληρο το πρόγραμμα χάνει focus


Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems