Προς το περιεχόμενο

Διαστάσεις του Form.Border


pantelee

Προτεινόμενες αναρτήσεις

Δημοσ.

Σε ένα πρόγραμμα που δημιουργούσα (στη Visual Basic) χρειάστηκε να καθορίσω τις διαστάσεις της φόρμας.

Πιο συγκεκριμένα ήθελα το πρόγραμμα να έχει δύο καταστάσεις, που σε αυτές να χρησιμοποιώ σα φόντο στη φόρμα (form.picture) φωτογραφίες με διαφορετικές διαστάσεις.

Θα αναφέρω κάποια νούμερα σαν παράδειγμα.

 

Ας πούμε ότι στην κατάσταση Α θέλω να χρησιμοποιήσω μία εικόνα, την imga.gif ως φόντο και ομοίως στην κατάσταση Β την εικόνα imgb.gif όπου οι διαστάσεις της πρώτης είναι 100χ100 και της δεύτερης είναι 300χ300.

 

Ας πούμε πως το πρόγραμμα μεταβαίνει στην κατάσταση Α και θέλω να ορίσω τις διαστάσεις της φόρμας. Αν δώσω την εντολή form.width = imga.width ή αλλιώς form.width = 100 το αποτέλεσμα θα είναι λάθος διότι ένα μέρος του form.width το τρώει το περίγραμμα (form.border). Και το ίδιο πρόβλημα θα έχω και με το ύψος όπου εκεί μέρος του form.height το τρώει και το περίγραμμα και ο χώρος της επικεφαλίδας και του μενού.

 

Και οι ερωτήσεις μου είναι:

Πώς μπορώ να γνωρίζω τις διαστάσεις του περιγράμματος; Υπάρχει κάποια τιμή του ελεγκτηρίου form που να αφορά κάτι τέτοιο; Αν όχι, πώς μπορώ να διαχειριστώ το πρόγραμμα ώστε να έχω το επιθυμητό αποτέλεσμα;

 

Θα ήθελα να αποφύγω τη λύση "βρες το πάχος του περιγράμματος και πρόσθεσέ το στις διαστάσεις που θέλεις" διότι, αν και το έχω κάνει, αυτό θα αφορά ένα συγκεκριμένο λειτουργικό. Θυμίζω πως τα Windows XP έχουν μεγαλύτερα περιγράμματα από τα 98, χώρια που κάποιος μπορεί να έχει XP αλλά να έχει επιλέξει την εμφάνιση των παραθύρων στις διαστάσεις του 98.

 

:-?

Δημοσ.

Βάλε τον παρακάτω κώδικα στο code module της φόρμας

 

>
Option Explicit

Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long
Private Const SM_CXBORDER As Long = 5
Private Const SM_CYBORDER As Long = 6
Private Const SM_CYCAPTION As Long = 4
Private Const SM_CYFRAME As Long = 33
Private Const SM_CXFRAME As Long = 32
Private Const SM_CXSIZEFRAME As Long = SM_CXFRAME
Private Const SM_CYSIZEFRAME As Long = SM_CYFRAME
Private Const SM_CYMENU As Long = 15


Private Sub Form_Load()
Dim xBorder As Long, yBorder As Long, formCaptionHeight As Long, formMenuHeight As Long

' Υποθέτω ότι το ScaleMode της φόρμας και της εικόνας είναι σε twips

Me.Picture1.Left = 0: Me.Picture1.Top = 0

' < κάπου εδώ φορτώνουμε την εικόνα >

' Θέτουμε τις διαστάσεις της εικόνας (δεν χρειάζεται αν AutoSize = True)
' Βασική προϋπόθεση για την εικόνα BorderStyle = 0 (σε άλλη περίπτωση πρέπει
' να υπολογιστεί και το frame της εικόνας)
Me.Picture1.Width = ScaleX(Me.Picture1.Picture.Width, vbHimetric, vbTwips)
Me.Picture1.Height = ScaleY(Me.Picture1.Picture.Height, vbHimetric, vbTwips)

' xBorder = πλάτος περιγράμματος φόρμας
' yBorder = ύψος περιγράμματος φόρμας
' formCaptionHeight = ύψος του τίτλου της φόρμας
' formMenuHeight = ύψος του μενού της φόρμας
' όλα σε pixels
xBorder = GetSystemMetrics(SM_CXSIZEFRAME)
yBorder = GetSystemMetrics(SM_CYSIZEFRAME)
formCaptionHeight = GetSystemMetrics(SM_CYCAPTION)
formMenuHeight = GetSystemMetrics(SM_CYMENU)

' Θέτουμε width και height της φόρμας (με μετατροπή των pixels σε twips)
Me.Width = ScaleX(2 * xBorder, vbPixels, vbTwips) + Me.Picture1.Width
Me.Height = ScaleY(2 * yBorder + formCaptionHeight + formMenuHeight, vbPixels, vbTwips) + _
   Me.Picture1.Height

End Sub

Δημοσ.

UserXP, ήταν αυτό που έψαχνα. Σ' ευχαριστώ πολύ.

Τώρα τελευταία διάβαζα για συναρτήσεις API (που αν δεν απατώμαι η GetSystemMetrics είναι τέτοια), αλλά ήταν πολύ νωρίς για να βγάλω τέτοια άκρη.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...