pantelee Δημοσ. 13 Ιουλίου 2005 Δημοσ. 13 Ιουλίου 2005 Σε ένα πρόγραμμα που δημιουργούσα (στη 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. :-?
Dikemou Δημοσ. 13 Ιουλίου 2005 Δημοσ. 13 Ιουλίου 2005 megaleh, ama de mas peis kai gia ti glossa milas, de tha deis kai poli boitheia...
UserXP Δημοσ. 13 Ιουλίου 2005 Δημοσ. 13 Ιουλίου 2005 Βάλε τον παρακάτω κώδικα στο 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
pantelee Δημοσ. 13 Ιουλίου 2005 Μέλος Δημοσ. 13 Ιουλίου 2005 UserXP, ήταν αυτό που έψαχνα. Σ' ευχαριστώ πολύ. Τώρα τελευταία διάβαζα για συναρτήσεις API (που αν δεν απατώμαι η GetSystemMetrics είναι τέτοια), αλλά ήταν πολύ νωρίς για να βγάλω τέτοια άκρη.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.