عملت برنامج على جهاز محمول 15 بوصة وعندما قمت بنسخ البرنامج على جهاز محمول حجم الشاشة 14 بوصة لم تضهر الشاشة كاملة نصف شاشة بعض الايقونات غير ظاهر
كيف اضبط البرنامج على مقاس شاشة 14 بوصة واقل اواكبر
عملت برنامج على جهاز محمول 15 بوصة وعندما قمت بنسخ البرنامج على جهاز محمول حجم الشاشة 14 بوصة لم تضهر الشاشة كاملة نصف شاشة بعض الايقونات غير ظاهر
كيف اضبط البرنامج على مقاس شاشة 14 بوصة واقل اواكبر
السلام عليكم ورحمة الله
أخت ريم .. اعملي الأتي
1 - أضيفي لبرنامجك modules جديد اسمه modResizeForm
انسخي هذا الكود الطويل نوعا ما للمودويل
Option Compare Database Option Explicit Private Const DESIGN_HORZRES As Long = 1024 Private Const DESIGN_VERTRES As Long = 768 Private Const DESIGN_PIXELS As Long = 96 Private Const WM_HORZRES As Long = 8 Private Const WM_VERTRES As Long = 10 Private Const WM_LOGPIXELSX As Long = 88 Private Const TITLEBAR_PIXELS As Long = 18 Private Const COMMANDBAR_PIXELS As Long = 26 Private Const COMMANDBAR_LEFT As Long = 0 Private Const COMMANDBAR_TOP As Long = 1 Private OrigWindow As tWindow Private Type tRect left As Long Top As Long right As Long bottom As Long End Type Private Type tDisplay Height As Long Width As Long DPI As Long End Type Private Type tWindow Height As Long Width As Long End Type Private Type tControl Name As String Height As Long Width As Long Top As Long left As Long End Type Private Declare Function WM_apiGetDeviceCaps Lib "gdi32" Alias "GetDeviceCaps" _ (ByVal hdc As Long, ByVal nIndex As Long) As Long Private Declare Function WM_apiGetDesktopWindow Lib "user32" Alias "GetDesktopWindow" _ () As Long Private Declare Function WM_apiGetDC Lib "user32" Alias "GetDC" _ (ByVal hwnd As Long) As Long Private Declare Function WM_apiReleaseDC Lib "user32" Alias "ReleaseDC" _ (ByVal hwnd As Long, ByVal hdc As Long) As Long Private Declare Function WM_apiGetWindowRect Lib "user32.dll" Alias "GetWindowRect" _ (ByVal hwnd As Long, lpRect As tRect) As Long Private Declare Function WM_apiMoveWindow Lib "user32.dll" Alias "MoveWindow" _ (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _ ByVal nHeight As Long, ByVal bRepaint As Long) As Long Private Declare Function WM_apiIsZoomed Lib "user32.dll" Alias "IsZoomed" _ (ByVal hwnd As Long) As Long Private Function getScreenResolution() As tDisplay Dim hDCcaps As Long Dim lngRtn As Long On Error Resume Next hDCcaps = WM_apiGetDC(0) With getScreenResolution .Height = WM_apiGetDeviceCaps(hDCcaps, WM_VERTRES) .Width = WM_apiGetDeviceCaps(hDCcaps, WM_HORZRES) .DPI = WM_apiGetDeviceCaps(hDCcaps, WM_LOGPIXELSX) End With lngRtn = WM_apiReleaseDC(0, hDCcaps) End Function Private Function getFactor(blnVert As Boolean) As Single Dim sngFactorP As Single On Error Resume Next If getScreenResolution.DPI <> 0 Then sngFactorP = DESIGN_PIXELS / getScreenResolution.DPI Else sngFactorP = 1 End If If blnVert Then getFactor = (getScreenResolution.Height / DESIGN_VERTRES) * sngFactorP Else getFactor = (getScreenResolution.Width / DESIGN_HORZRES) * sngFactorP End If End Function Public Sub ReSizeForm(ByVal frm As Access.Form) Dim rectWindow As tRect Dim lngWidth As Long Dim lngHeight As Long Dim sngVertFactor As Single Dim sngHorzFactor As Single Dim sngFontFactor As Single On Error Resume Next sngVertFactor = getFactor(True) sngHorzFactor = getFactor(False) sngFontFactor = VBA.IIf(sngHorzFactor < sngVertFactor, sngHorzFactor, sngVertFactor) Resize sngVertFactor, sngHorzFactor, sngFontFactor, frm If WM_apiIsZoomed(frm.hwnd) = 0 Then Access.DoCmd.RunCommand acCmdAppMaximize Call WM_apiGetWindowRect(frm.hwnd, rectWindow) With rectWindow lngWidth = .right - .left lngHeight = .bottom - .Top End With If frm.Parent.Name = VBA.vbNullString Then Call WM_apiMoveWindow(frm.hwnd, ((getScreenResolution.Width - _ (sngHorzFactor * lngWidth)) / 2) - getLeftOffset, _ ((getScreenResolution.Height - (sngVertFactor * lngHeight)) / 2) - _ getTopOffset, lngWidth * sngHorzFactor, lngHeight * sngVertFactor, 1) End If End If Set frm = Nothing End Sub Private Sub Resize(sngVertFactor As Single, sngHorzFactor As Single, sngFontFactor As _ Single, ByVal frm As Access.Form) Dim ctl As Access.Control Dim arrCtls() As tControl Dim lngI As Long Dim lngJ As Long Dim lngWidth As Long Dim lngHeaderHeight As Long Dim lngDetailHeight As Long Dim lngFooterHeight As Long Dim blnHeaderVisible As Boolean Dim blnDetailVisible As Boolean Dim blnFooterVisible As Boolean Const FORM_MAX As Long = 31680 On Error Resume Next With frm .Painting = False lngWidth = .Width * sngHorzFactor lngHeaderHeight = .Section(Access.acHeader).Height * sngVertFactor lngDetailHeight = .Section(Access.acDetail).Height * sngVertFactor lngFooterHeight = .Section(Access.acFooter).Height * sngVertFactor .Width = FORM_MAX .Section(Access.acHeader).Height = FORM_MAX .Section(Access.acDetail).Height = FORM_MAX .Section(Access.acFooter).Height = FORM_MAX blnHeaderVisible = .Section(Access.acHeader).Visible blnDetailVisible = .Section(Access.acDetail).Visible blnFooterVisible = .Section(Access.acFooter).Visible .Section(Access.acHeader).Visible = False .Section(Access.acDetail).Visible = False .Section(Access.acFooter).Visible = False End With ReDim arrCtls(0) For Each ctl In frm.Controls If ((ctl.ControlType = Access.acTabCtl) Or _ (ctl.ControlType = Access.acOptionGroup)) Then With arrCtls(lngI) .Name = ctl.Name .Height = ctl.Height .Width = ctl.Width .Top = ctl.Top .left = ctl.left End With lngI = lngI + 1 ReDim Preserve arrCtls(lngI) End If Next ctl For Each ctl In frm.Controls If ctl.ControlType <> Access.acPage Then With ctl .Height = .Height * sngVertFactor .left = .left * sngHorzFactor .Top = .Top * sngVertFactor .Width = .Width * sngHorzFactor .FontSize = .FontSize * sngFontFactor Select Case .ControlType Case Access.acListBox .ColumnWidths = adjustColumnWidths(.ColumnWidths, sngHorzFactor) Case Access.acComboBox .ColumnWidths = adjustColumnWidths(.ColumnWidths, sngHorzFactor) .ListWidth = .ListWidth * sngHorzFactor Case Access.acTabCtl .TabFixedWidth = .TabFixedWidth * sngHorzFactor .TabFixedHeight = .TabFixedHeight * sngVertFactor End Select End With End If Next ctl For lngJ = 0 To lngI With frm.Controls.Item(arrCtls(lngJ).Name) .left = arrCtls(lngJ).left * sngHorzFactor .Top = arrCtls(lngJ).Top * sngVertFactor .Height = arrCtls(lngJ).Height * sngVertFactor .Width = arrCtls(lngJ).Width * sngHorzFactor End With Next lngJ With frm .Width = lngWidth .Section(Access.acHeader).Height = lngHeaderHeight .Section(Access.acDetail).Height = lngDetailHeight .Section(Access.acFooter).Height = lngFooterHeight .Section(Access.acHeader).Visible = blnHeaderVisible .Section(Access.acDetail).Visible = blnDetailVisible .Section(Access.acFooter).Visible = blnFooterVisible .Painting = True End With Erase arrCtls Set ctl = Nothing End Sub Private Function getTopOffset() As Long Dim cmdBar As Object Dim lngI As Long On Error GoTo err For Each cmdBar In Application.CommandBars If ((cmdBar.Visible = True) And (cmdBar.Position = COMMANDBAR_TOP)) Then lngI = lngI + 1 End If Next cmdBar getTopOffset = (TITLEBAR_PIXELS + (lngI * COMMANDBAR_PIXELS)) exit_fun: Exit Function err: getTopOffset = TITLEBAR_PIXELS + COMMANDBAR_PIXELS Resume exit_fun End Function Private Function getLeftOffset() As Long Dim cmdBar As Object Dim lngI As Long On Error GoTo err For Each cmdBar In Application.CommandBars If ((cmdBar.Visible = True) And (cmdBar.Position = COMMANDBAR_LEFT)) Then lngI = lngI + 1 End If Next cmdBar getLeftOffset = (lngI * COMMANDBAR_PIXELS) exit_fun: Exit Function err: getLeftOffset = 0 Resume exit_fun End Function Private Function adjustColumnWidths(strColumnWidths As String, sngFactor As Single) As String On Error GoTo Err_adjustColumnWidths Dim astrColumnWidths() As String Dim strTemp As String Dim lngI As Long Dim lngJ As Long ReDim astrColumnWidths(0) For lngI = 1 To VBA.Len(strColumnWidths) Select Case VBA.Mid(strColumnWidths, lngI, 1) Case Is <> ";" astrColumnWidths(lngJ) = astrColumnWidths(lngJ) & VBA.Mid( _ strColumnWidths, lngI, 1) Case ";" lngJ = lngJ + 1 ReDim Preserve astrColumnWidths(lngJ) End Select Next lngI lngI = 0 strTemp = VBA.vbNullString Do Until lngI > UBound(astrColumnWidths) If Not IsNull(astrColumnWidths(lngI)) And astrColumnWidths(lngI) <> "" Then strTemp = strTemp & CSng(astrColumnWidths(lngI)) * sngFactor & ";" End If lngI = lngI + 1 Loop adjustColumnWidths = strTemp Erase astrColumnWidths Exit_adjustColumnWidths: On Error Resume Next Exit Function Err_adjustColumnWidths: Erase astrColumnWidths 'Destroy array. Resume Exit_adjustColumnWidths End Function Public Sub getOrigWindow(frm As Access.Form) On Error Resume Next OrigWindow.Height = frm.WindowHeight OrigWindow.Width = frm.WindowWidth End Sub Public Sub RestoreWindow() On Error Resume Next Access.DoCmd.MoveSize , , OrigWindow.Width, OrigWindow.Height Access.DoCmd.Save End Sub
مع مراعاة تغيير المتغيرين DESIGN_HORZRES و DESIGN_VERTRES
الواردة في أعلا المودويل لمقاس الشاشة التي صمم بها البرنامج أصلا وهي هنا بالبكسل
وفي الفورم - عند حدث فتح ضعي هذا الكود
ReSizeForm Me
في كل فورم من البرنامج وهي استدعاء لوظيفة التحجيم ...... إن شاء الله يسير كل شيء معاك تمام التمام
واليك المثال المرفق بما سبق .. أجري التجربة عليه تلاحظين أنه يناسب جميع المقاسات
أو بالاصح يكيف حجمه مع مقاس الشاشة ....... والسلام
أخوك / EKSEER
تم تعديل هذه المشاركة بواسطة ekseer في 8 سبتمبر 2007 في 19:53
مشكور اخي حل اكثر من رائع
10000شكر
لكن عند استفسار لكي تتضح الصورة عندي
1- كيف عدل المتغيرات لتناسب مقاس شاشة محمول 14 بوصة كم المتغيرات التي اضعها في المتغير
2- بعد تعديل المتغيرات للتناسب مع 14 بوصة هل سوف تتناسب مع باقي مقاس الشاشات الاخري 15 و 17
3- هل هناك فرق بين شاشة المحمول والشاشات المسطحة و الشاشات غير المسطحة هل سوف يتناسب التعديل معها
أشكرك أخي إكسير على هذا الموضوع الجميل .... :)
لدي سؤال أرجو الإجابة عليه ...
أنا أريد أن يتم تحجيم الفورم حسب ال Resolution للشاشة ... فهل يمكن استدعاؤه بالكود ووضعه في المتغيرين DESIGN_HORZRES و DESIGN_VERTRES ؟
تم تعديل هذه المشاركة بواسطة Dream_Works في 9 سبتمبر 2007 في 11:37
زاد الله من علمه وفضله أخي إكسير على هذا الموضوع الهام .
ابو آلاء كتب:زادك الله من علمه وفضله أخي إكسير على هذا الموضوع الهام .
بارك الله فيك اخي اكسير مثال جميل جدا
اخي الفاضل Dream_Works
اليك ما طلبت
مواضيع ذات صلة
اعادة تحجيم النماذج
تغيير دقة الشاشة اذا كانت مخالفة
مشكور اخي حل اكثر من رائع
10000شكر
لكن عند استفسار لكي تتضح الصورة عندي
1- كيف عدل المتغيرات لتناسب مقاس شاشة محمول 14 بوصة كم المتغيرات التي اضعها في المتغير
2- بعد تعديل المتغيرات للتناسب مع 14 بوصة هل سوف تتناسب مع باقي مقاس الشاشات الاخري 15 و 17
3- هل هناك فرق بين شاشة المحمول والشاشات المسطحة و الشاشات غير المسطحة هل سوف يتناسب التعديل معها
الاخت الفاضلة / السلام عليكم ورحمة الله
التساؤل الأول /
المقصود بتغير قيم المتغيرين المشار اليهما في الموديويل
هو باختصار ( دقة الشاشة ) وليس طولها أو مقاسها وللوصول لدقة الشاشة
أذهبي لأي مكان فارغ على سطح المكتب أنقري زر الماوس اليمين تظهر لك قائمة منسدلة
أختاري خصائص سيظهر لك مربع الحوار خصائص العرض اذهبي لإعدادات وفيها تظهر لك ذقة الشاشة مثل الارقام التالية :
1024 × 768
640 × 480
800×600
1152 864
وغيرها بالطبع - المطلوب أن تضبطي المتغيرين في المودويل على حسب الجهاز والدقة التي صممتي بها البرنامج أصلا فقط
التساؤل الثاني والثالث / نعم سيضبط حجمه على جميع أجهزة العرض إن شاء الله ولا أعتقد أن هناك فرق بين شاشة المحمول والشاشات الاخرى
فيما يتعلق بدقة العرض ..... أي أن الفورم سيضبط حجمه على جميع أجهزة العرض إن شاء الله
ekseer
مشكور دائما نجد عند الحلول 10000000 شكر
هذا الموضوع مغلق.