Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sir Pereira

Forçar resolução

Recommended Posts

Sir Pereira

Boas pessoal,

tenho uma aplicação a correr em Fullscreen, e já tentei entender-me, mas não consigo fazer nada de jeito com os Anchors.

Uma aplicação que em 800*600 aparece bem, em 1366*768 fica totalmente desfigurada, e eu queria que ficasse exactamente igual.

Será que não dá para mudar para outra resolução ao início do programa de forma a que fique tudo direito, e ao sair voltar tudo ao normal?

Qualquer outra sugestão também é bem-vinda.

Cmpts

Share this post


Link to post
Share on other sites
pmaster

Eu precisei quando fiz uma aplicação, em que os controlos se adaptavam á resolução, tu em escala, e até funcionava bem embora precisa-se apenas de alguns ajustes.

Encontrei um modulo com as funções já feitas e só precisava de dizer qual a escala, no entanto não sei se é isso que pretendes..

Se quiseres posso postar aqui o modulo ou enviar-te, ou posso tentar encontra-lo de novo e posto o link.

É de algo assim, que precisas?

Share this post


Link to post
Share on other sites
pmaster

o modulo é um bocado extenso, posto aqui na mesma? É que ja não sei onde o encontrei.

Share this post


Link to post
Share on other sites
pmaster

OK cá vai  :cheesygrin:

Module Resize
    Public Class ResizeFormClass
        'Original form width.
        Private Shared m_FormWidth As Long
        Private Shared m_FormHeight As Long



        Public Shared Sub SubResize(ByVal F As Form, ByVal percentW As Double, ByVal percentH As Double)
            Dim FormHeight As Long
            Dim FormWidth As Long
            Dim HeightChange As Double, WidthChange As Double



            Call SaveInitialStates(F)




            'Calculate the new height and width the form needs to be resized to, based on the current avaible screen area.
            FormHeight = Int((Screen.PrimaryScreen.WorkingArea.Height) * (percentH / 100))
            FormWidth = Int((Screen.PrimaryScreen.WorkingArea.Width) * (percentW / 100))



            'Use the Form that is to be resized.
            With F
                'Change the demensions and position of the form.

                .Height = FormHeight
                .Width = FormWidth

                HeightChange = .ClientSize.Height / m_FormHeight
                WidthChange = .ClientSize.Width / m_FormWidth

            End With
            'Calculate ratio current avaible screen area/form size

            'Notify the class that the form has been resized.
            SubChangeWithRatio(F, WidthChange, HeightChange)

        End Sub

        Private Shared Sub SaveInitialStates(ByVal F As Form)

            'Use the form that is being resized.
            With F
                'Check if the form is a MDI form.

                'Set the FormWidth and FormHeight variables to the Form's Scale Width and Height.
                m_FormWidth = .ClientSize.Width
                m_FormHeight = .ClientSize.Height

            End With

        End Sub


        Public Shared Sub SubChangeWithRatio(ByVal F As Form, ByVal RapportoW As Single, ByVal RapportoH As Single)
            'uses a recursive routine
            For Each ctl As Control In F.Controls
                ResizeControlAndIncludedControls(ctl, RapportoW, RapportoH)
            Next

        End Sub

        Private Shared Sub ResizeControlAndIncludedControls(ByRef ctl As Control, ByVal RapportoW As Single, ByVal RapportoH As Single)



            Dim ChildCtl As Control

            For Each ChildCtl In ctl.Controls

                ResizeControlAndIncludedControls(ChildCtl, RapportoW, RapportoH)

            Next
            ResizeControl(ctl, RapportoW, RapportoH)
        End Sub

        Private Shared Sub ResizeControl(ByRef ctl As Control, ByVal RapportoW As Single, ByVal RapportoH As Single)
            Dim lb As New ListBox, intlH As Boolean
            Try
                If TypeOf ctl Is ListBox Then


                    lb = CType(ctl, ListBox)
                    intlH = lb.IntegralHeight
                    lb.IntegralHeight = False

                    ctl.Left = CInt(ctl.Left * RapportoW)
                    ctl.Top = CInt(ctl.Top * RapportoH)
                    ctl.Width = CInt(ctl.Width * RapportoW)
                    ctl.Height = CInt(ctl.Height * RapportoH)

                Else

                    ctl.Left = CInt(ctl.Left * RapportoW)
                    ctl.Top = CInt(ctl.Top * RapportoH)
                    ctl.Width = CInt(ctl.Width * RapportoW)
                    ctl.Height = CInt(ctl.Height * RapportoH)

                End If

                lb.IntegralHeight = intlH
                If TypeOf ctl Is ListView Then
                    Try
                        ResizeColumns(ctl, RapportoW, RapportoH)
                    Catch ex As Exception
                    End Try
                End If
                Try
                    ResizeControlFont(ctl, RapportoW, RapportoH)

                Catch ex As Exception
                End Try
            Catch ex As Exception
            End Try

        End Sub

        Private Shared Sub ResizeControlFont(ByRef Ct As Control, ByVal RapportoW As Single, ByVal RapportoH As Single)

            'Resizes the control font and, in the case of some controls, as the listview
            ' resizes the columns also

            Try

                Dim FSize As Double = Ct.Font.Size
                Dim FStile As FontStyle = Ct.Font.Style
                Dim FNome As String = Ct.Font.Name
                Dim NuovoSize As Double = FSize



                NuovoSize = FSize * Math.Sqrt(RapportoW * RapportoH)
                Dim NFont As New Font(FNome, CSng(NuovoSize), FStile)
                Ct.Font = NFont

            Catch

            End Try

        End Sub

        Private Shared Sub ResizeColumns(ByRef ct As Control, ByVal RapportoW As Single, ByVal RapportoH As Single)

            Dim c As ColumnHeader
            For Each c In CType(ct, ListView).Columns
                c.Width = CInt(c.Width * RapportoW)
            Next

        End Sub
    End Class
End Module

Para chamar

 ResizeFormClass.SubResize(Me, percentW, percentH)

Espero ter ajudado.

Share this post


Link to post
Share on other sites
duduml

Se funcionar ajudas e muito;) e como funciona, pelo menos contigo, ajudas... :D

Abraço


"use windows, você merece!"

Share this post


Link to post
Share on other sites
duduml

só uma coisinha...

como declaras-te estas variáveis que passas para a classe??

ResizeFormClass.SubResize(Me, percentW, percentH)

e colocas no evento load certo?

CUMPS


"use windows, você merece!"

Share this post


Link to post
Share on other sites
pmaster

Ele mexe um pouco com a  posição dos controlos, por exemplo pode desalinhar alguns controlos mas é um questão de ajustar :D

duduml são variaveis inteiras que vão ter a percentagem de redimencionamento que lhe quiseres dar

Share this post


Link to post
Share on other sites
duduml
duduml são variaveis inteiras que vão ter a percentagem de redimencionamento que lhe quiseres dar

e qual o valor indicado?? qual poses-te tu?

EDIT:

já percebi a ideia, mas assim sendo, vou dar ao user a hipótese de redimensionamento....:D

CUMPS


"use windows, você merece!"

Share this post


Link to post
Share on other sites
duduml

eu tenho a 100, porque para o meu ecrã esta bem...

mas se for para outro ecrã, o user tem de redefinir a percentagem....

CUMPS


"use windows, você merece!"

Share this post


Link to post
Share on other sites
duduml

POis, se ele ajusta-se automaticamente era bem melhor... :S

mas assim também marcha....que remédio! lol


"use windows, você merece!"

Share this post


Link to post
Share on other sites
pmaster

ResizeFormClass.SubResize(Me, percentW, percentH)

Neste caso o "me" é a form que pretendes, ele aplica a todos os controlos da form. Ou não era isto que pretendias?

Share this post


Link to post
Share on other sites
pmaster

Faz o seguinte. Na percentagem coloca a 100, e vê como fica e ajustas até ficar bem, no caso de 100 não ficar.

E depois ficará igual em todas as resoluções a principio :D

Share this post


Link to post
Share on other sites
pmaster

Sir Pereira, muito cinseramente não usei nenhum Anchor quando utilizei este modulo, e a mim funcionou, e ao que parece ao duduml tambem mas não sei se ele usa Anchors ou não. Não queria dizer para os tirares e depois não funcionar.

Se experimentasses criar um form com 2 ou 3 controlos e fazer ai a experiencia, ou fazes um backup do teu projecto e experimentas sem Anchors..

Espero ter ajudado, mas como não tenho a certeza se irá resultar é melhor testar em algo pequeno :D

Share this post


Link to post
Share on other sites
Sir Pereira

Boas novamente,

é assim, o principal desenho da aplicação está a 1024x768 (até a janela de desenho a tenho assim), apesar de a minha resolução no pc ser de 1366x768, quero que a GUI fique desenhada com os padrões mínimos actuais de hoje em dia.

Sem as anchors, fica-me tudo chegado para um lado, pois não tenho nenhuma anchor do lado direito a puxar.

Mas, utilizando ou não o código

        ResizeFormClass.SubResize(Me, 100, 100)

Não acontece rigorosamente nada, pois eu tenho o estado da janela pré-definido para Maximizado, será por isso?

EDIT: Era mesmo este o problema.

Bom, conclusões, pah, ficou muito porreiro (dentro do possível), mas há ali duas labels que me saiem de cima de uma picturebox onde supostamente eram para ficar em cima. Há forma de as prender lá?

Share this post


Link to post
Share on other sites
ribeiro55

Em máquinas mais lentas, esses forms devem ser um festim brutal para os que sofrem de epilepsia :D

Evita processamento desnecessário quando as anchors podem fazer perfeitamente o trabalho.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.