Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sir Pereira

Forçar resolução

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmaster

OK cá vai  :biggrin:

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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á?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.