یه common dialog سفارشی ، کمک کنید تکمیل شه

rouzbeh_ziafati

New Member
این برنامه رو ببینید .
http://www.sharemation.com/ebifans1/2.rar

یه کادر انتخاب فونت هست که در وسط صفحه نمایش داده میشه .
برنامه بدون مشکل کار میکنه اما من می خوام که قبل از اینکه پنجره انتخاب فونت باز بشه ، بتونم فونت دلخواه خودم رو با مشخصات دلخواهش توی اون کادر بطور پیش فرض نشون بده .
مثلا قبل از اجرای کادر انتخاب فونت ، فونت پیش فرض times new romans , size 12 , bold & red color باشه .
کسی می تونی این کار رو انجام بده روی این کد ؟
 

the_king

مدیرکل انجمن
این برنامه رو ببینید .
http://www.sharemation.com/ebifans1/2.rar

یه کادر انتخاب فونت هست که در وسط صفحه نمایش داده میشه .
برنامه بدون مشکل کار میکنه اما من می خوام که قبل از اینکه پنجره انتخاب فونت باز بشه ، بتونم فونت دلخواه خودم رو با مشخصات دلخواهش توی اون کادر بطور پیش فرض نشون بده .
مثلا قبل از اجرای کادر انتخاب فونت ، فونت پیش فرض times new romans , size 12 , bold & red color باشه .
کسی می تونی این کار رو انجام بده روی این کد ؟

این کد را خودتان نوشته اید؟ خیلی آشفته نوشته شده، پارامتر های API را هم با مقادیر نامربوطی ارسال می کند.
به هر حال سطر زیر را در روتین ShowFont بیابید :
کد:
    ret = ChooseFont(FontDialog)

و درست پیش از آن، سطر های زیر را اضافه کنید :
کد:
    Dim FontName() As Byte, Index As Long
    FontName = StrConv("[B]Times New Roman[/B]", vbFromUnicode)
    With lfLogFont
        For Index = 0 To UBound(FontName)
            .lfFaceName(Index) = FontName(Index)
        Next
        .lfWeight = [B]700[/B]
        .lfHeight = [B]12[/B] * (4 / 3)
    End With
    FontDialog.rgbColors = [B]vbRed[/B]
 

rouzbeh_ziafati

New Member
این کد را خودتان نوشته اید؟ خیلی آشفته نوشته شده، پارامتر های API را هم با مقادیر نامربوطی ارسال می کند.
به هر حال سطر زیر را در روتین ShowFont بیابید :
کد:
    ret = ChooseFont(FontDialog)

و درست پیش از آن، سطر های زیر را اضافه کنید :
کد:
    Dim FontName() As Byte, Index As Long
    FontName = StrConv("[B]Times New Roman[/B]", vbFromUnicode)
    With lfLogFont
        For Index = 0 To UBound(FontName)
            .lfFaceName(Index) = FontName(Index)
        Next
        .lfWeight = [B]700[/B]
        .lfHeight = [B]12[/B] * (4 / 3)
    End With
    FontDialog.rgbColors = [B]vbRed[/B]



نه خودم ننوشتم . یه برنامه بود که من تا اونجا که می تونستم از کداش حذف کردم که فقط این قسمت که به کارم میاد رو داشته باشم .
راستش من یه برنامه دارم که فونت و جزئیات اون رو در بانک نگه میداره . می خوام هر موقع که این دیالوگ باز شد . از بانک اطلاعات فونت رو بازیابی کنه و در دیالوگ نشون بده . برای همین نیاز دارم که بتونم به دیالوگ ارسال داشته باشم .
حالا با این تفاصیل این کد شما به کارم میاد ؟
و آیا اون آشفتگی که گفتید رو می تونید حذف کنید برام تا حدی ؟
و میشه یه خورده در مورد کدی که نوشتید توضیح بدید . بتونم درکش کنم . فقط این خطش برام قابل فهم است FontDialog.rgbColors = vbRed




Dim sFont As SelectedFont
Adodc2.RecordSource = "select * from font where index = '" + "1" + "'"
Adodc2.Refresh​


sFont = ShowFont(Me.hWnd)​

Adodc2.Recordset.Fields(1).Value = sFont.sSelectedFont
Adodc2.Recordset.Fields(2).Value = sFont.nSize
Adodc2.Recordset.Fields(3).Value = sFont.bBold
Adodc2.Recordset.Fields(4).Value = sFont.bItalic
Adodc2.Recordset.Update​


با این کد اطلاعات فونت انتخابی رو میریزم تو بانک حالا باید قبل از این هم اطلاعات رو از بانک بیارم بریزم توی دیالوگ .
ممنون میشم کمک کنید . مرسی​


راستی اینم اصل برنامه است که من اون قسمت ها رو ازش درآوردم .
http://www.sharemation.com/ebifans1/3.rar
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ماژول پیوستی ModuleFontDialog را به پروژه تان اضافه کنید و بجای ماژول IDBAS_CommonDialog از این ماژولی که من
نوشتم استفاده کنید (فایل پیوست پروژه شده است) :

کد:
Option Explicit

Private Const DEFAULT_PITCH As Long = 0
Private Const FF_DONTCARE As Long = 0
Private Const CLIP_DEFAULT_PRECIS As Long = 0
Private Const OUT_DEFAULT_PRECIS As Long = 0
Private Const DEFAULT_QUALITY As Long = 0
Private Const FW_BOLD As Long = 700
Private Const FW_NORMAL As Long = 400
Private Const LOGPIXELSY As Long = 90
Private Const LF_FACESIZE As Long = 32
Private Const CF_EFFECTS As Long = &H100&
Private Const CF_INITTOLOGFONTSTRUCT As Long = &H40&
Private Const CF_NOVECTORFONTS As Long = &H800&
Private Const CF_SCREENFONTS As Long = &H1
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_NOZORDER As Long = &H4
Private Const SWP_NOACTIVATE As Long = &H10
Private Const HCBT_ACTIVATE As Long = 5
Private Const WH_CBT As Long = 5

Private Type RECT
    left As Long
    top As Long
    Right As Long
    Bottom As Long
End Type

Private Type LOGFONT
    lfHeight As Long
    lfWidth As Long
    lfEscapement As Long
    lfOrientation As Long
    lfWeight As Long
    lfItalic As Byte
    lfUnderline As Byte
    lfStrikeOut As Byte
    lfCharSet As Byte
    lfOutPrecision As Byte
    lfClipPrecision As Byte
    lfQuality As Byte
    lfPitchAndFamily As Byte
    lfFaceName(1 To LF_FACESIZE) As Byte
End Type

Private Type ChooseFont
    lStructSize As Long
    hWndOwner As Long
    hDC As Long
    lpLogFont As Long
    iPointSize As Long
    flags As Long
    rgbColors As Long
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
    hInstance As Long
    lpszStyle As String
    nFontType As Integer
    forAlignment As Integer
    nSizeMin As Long
    nSizeMax As Long
End Type

Private Declare Function ChooseFontA Lib "comdlg32.dll" (ByRef pChoosefont As ChooseFont) As Long
Private Declare Function GetActiveWindow Lib "user32.dll" () As Long
Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hDC As Long, ByVal nIndex As Long) As Long
Private Declare Function MulDiv Lib "kernel32.dll" (ByVal nNumber As Long, ByVal nNumerator As Long, ByVal nDenominator As Long) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long, ByVal hDC As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32.dll" () As Long

Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function GetCurrentThreadId Lib "KERNEL32" () As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long

Private hHook As Long

Public Function ShowFont(Optional ByRef Font As Variant, Optional ByRef Color As Variant, Optional ByVal CenterScreen As Boolean = True) As StdFont
    Dim Result As Long
    Dim SelectedFont As LOGFONT
    Dim Info As ChooseFont
    With Info
        .lStructSize = Len(Info)
        .hWndOwner = Form1.hWnd
        .hDC = 0
        .lpLogFont = VarPtr(SelectedFont.lfHeight)
        .iPointSize = 0
        .flags = CF_NOVECTORFONTS Or CF_SCREENFONTS
        If IsMissing(Color) = False Then
            .flags = .flags Or CF_EFFECTS
            .rgbColors = Color
        End If
        .lCustData = 0
        .lpfnHook = 0
        .lpTemplateName = vbNullString
        .hInstance = 0
        .lpszStyle = vbNullString
        .nFontType = 0
        .nSizeMin = 0
        .nSizeMax = 0
        If IsMissing(Font) = False Then
            If TypeName(Font) = "String" Then
                .flags = .flags Or CF_INITTOLOGFONTSTRUCT
                SelectedFont = StdFontToLOGFont(Font)
            ElseIf Not Font Is Nothing Then
                .flags = .flags Or CF_INITTOLOGFONTSTRUCT
                SelectedFont = StdFontToLOGFont(Font)
            End If
        End If
    End With
    If CenterScreen Then
        If hHook <> 0 Then UnhookWindowsHookEx hHook
        hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProcHook, App.hInstance, GetCurrentThreadId)
    End If
    Result = ChooseFontA(Info)
    If Result <> 0 Then
        Set ShowFont = LOGFontToStdFont(SelectedFont)
        If IsMissing(Color) = False Then
            Color = Info.rgbColors
        End If
    Else
        Set ShowFont = Nothing
    End If
End Function

Private Function StdFontToLOGFont(ByRef Font As Variant) As LOGFONT
    Dim FontName() As Byte
    Dim Pos As Long
    Dim hWnd As Long
    Dim hDC As Long
    Dim Value As StdFont
    If TypeName(Font) = "String" Then
        Set Value = New StdFont
        Value.Name = Font
    Else
        Set Value = Font
    End If
    hWnd = GetDesktopWindow
    hDC = GetDC(hWnd)
    With StdFontToLOGFont
        .lfHeight = -MulDiv(Value.Size, GetDeviceCaps(hDC, LOGPIXELSY), 72)
        .lfWidth = 0
        .lfEscapement = 0
        .lfOrientation = 0
        .lfWeight = IIf(Value.Bold, FW_BOLD, FW_NORMAL)
        .lfItalic = IIf(Value.Italic, 255, 0)
        .lfUnderline = IIf(Value.Underline, 255, 0)
        .lfStrikeOut = IIf(Value.Strikethrough, 255, 0)
        .lfCharSet = (Value.Charset And 255&)
        .lfOutPrecision = OUT_DEFAULT_PRECIS
        .lfClipPrecision = CLIP_DEFAULT_PRECIS
        .lfQuality = DEFAULT_QUALITY
        .lfPitchAndFamily = DEFAULT_PITCH Or FF_DONTCARE
        FontName = StrConv(Value.Name, vbFromUnicode)
        For Pos = 0 To UBound(FontName)
            .lfFaceName(Pos + 1) = FontName(Pos)
        Next
    End With
    ReleaseDC hWnd, hDC
End Function

Private Function LOGFontToStdFont(ByRef Value As LOGFONT) As StdFont
    Dim Font As New StdFont
    Dim FontName As String
    Dim Pos As Long
    Dim hWnd As Long
    Dim hDC As Long
    hWnd = GetDesktopWindow
    hDC = GetDC(hWnd)
    FontName = StrConv(Value.lfFaceName, vbUnicode)
    Pos = InStr(FontName, vbNullChar)
    If Pos > 0 Then FontName = left(FontName, Pos - 1)
    With Font
        .Name = FontName
        .Charset = Value.lfCharSet
        If Value.lfHeight <> 0 Then
            .Size = MulDiv(Abs(Value.lfHeight), 72, GetDeviceCaps(hDC, LOGPIXELSY))
        End If
        .Weight = Value.lfWeight
        .Bold = CBool(Value.lfWeight >= FW_BOLD)
        .Italic = CBool(Value.lfItalic <> 0)
        .Underline = CBool(Value.lfUnderline <> 0)
        .Strikethrough = CBool(Value.lfStrikeOut <> 0)
    End With
    ReleaseDC hWnd, hDC
    Set LOGFontToStdFont = Font
End Function

Private Function WinProcHook(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim WinRect As RECT
    Dim PosX As Long, PosY As Long
    Dim Width As Long
    Dim Height As Long
    If lMsg = HCBT_ACTIVATE Then
        GetWindowRect wParam, WinRect
        With WinRect
            Width = .Right - .left
            Height = .Bottom - .top
        End With
        PosX = (Screen.Width / Screen.TwipsPerPixelX - Width) / 2
        PosY = (Screen.Height / Screen.TwipsPerPixelY - Height) / 2
        SetWindowPos wParam, 0, PosX, PosY, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE
        If hHook <> 0 Then
            UnhookWindowsHookEx hHook
            hHook = 0
        End If
    End If
    WinProcHook = 0
End Function

تابع ()ShowFont این ماژول جدید خروجی های فونت استاندارد (StdFont) را برمی گرداند.
اگر کاربر با استفاده از دکمه Cancel هیچ فونتی را انتخاب نکرد، مقدار Nothing را برمی گرداند. بنابر این پیش از استفاده از
مقدار بازگردانده شده، بایستی بررسی کنید که آیا Nothing است یا خیر.

این تابع سه پارامتر های اختیاری دارد، یعنی می توانید یک یا چندین یا همه آن پارامتر ها را وارد نکنید :

پارامتر Font مشخصات فونتی است که می خواهید در ابتدای نمایش پنجره انتخاب شده باشد، مثلا می تواند Label1.Font
یا هر متغیری از نوع StdFont باشد.
حتی به عنوان یک قابلیت اضافی، کدهایی را به تابع اضافه کردم که بتواند تنها نام یک فونت باشد، مثلا "Arial" یا "Tahoma"

پارامتر Color رنگی است که می خواهید در ابتدای نمایش پنجره انتخاب شده باشد، مثلا vbRed یا Label1.ForeColor
اگر این پارامتر اختیاری را مشخص نکنید، قابلیت انتخاب رنگ در پنجره نمایش داده نمی شود و امکان انتخاب رنگ توسط کاربر
نخواهد بود.
این پارامتر Color بایستی یک متغیر باشد، چون اگر کاربر رنگی را انتخاب کرد، مقدار این متغیر تغییر خواهد کرد.

پارامتر CenterScreen مشخص می کند که آیا پنجره در وسط صفحه نمایش نشان داده شود (True) و یا خیر(False).
مقدار پیشفرض آن True است، یعنی اگر آنرا مشخص نکنید، در وسط صفحه نمایش داده می شود.

و چند مثال :
کد زیر ساده ترین شکل استفاده از تابع ()ShowFont است، اگر کاربر فونتی را انتخاب کرد، فونت دکمه Command1 را روی
آن قلم تنظیم می کند :
کد:
    Dim NewFont As StdFont
    Set NewFont = [B]ShowFont[/B]()
    If Not NewFont Is Nothing Then
        Set Command1.Font = NewFont
    End If

کد زیر با کد بالا این تفاوت را دارد که پیش از انتخاب فونت توسط کاربر، فونت Command1 را به عنوان پیشفرض انتخاب می کند :
کد:
    Dim NewFont As StdFont
    Set NewFont = [B]ShowFont[/B](Command1.Font)
    If Not NewFont Is Nothing Then
        Set Command1.Font = NewFont
    End If

کد زیر به عنوان فونت پیشفرض از قلم "Arial" استفاده می کند :
کد:
    Dim NewFont As StdFont
    Set NewFont = [B]ShowFont[/B]("Arial")
    If Not NewFont Is Nothing Then
        Set Command1.Font = NewFont
    End If

در کد زیر علاوه بر انتخاب قلم، کاربر رنگ ForeColor برچسب Label1 را هم انتخاب خواهد کرد :
کد:
    Dim NewFont As StdFont
    Dim Color As OLE_COLOR
    Color = Label1.ForeColor
    Set NewFont = [B]ShowFont[/B](Label1.Font, Color)
    If Not NewFont Is Nothing Then
        Set Label1.Font = NewFont
        Label1.ForeColor = Color
    End If

در کد زیر فونت Command1 انتخاب می شود ولی پنجره در وسط صفحه نمایش نمی یابد :
کد:
    Dim NewFont As StdFont
    Set NewFont = [B]ShowFont[/B](Command1.Font, , False)
    If Not NewFont Is Nothing Then
        Set Command1.Font = NewFont
    End If

در کد زیر یک فونت NewFont توسط کاربر انتخاب می شود بطوری که فونت پیشفرض انتخاب شده، Tahoma با اندازه 14 و
بصورت Bold است :
کد:
    Dim NewFont As StdFont
    Set NewFont = New StdFont
    With NewFont
        .Name = "Tahoma"
        .Size = 14
        .Bold = True
    End With
    Set NewFont = [B]ShowFont[/B](NewFont)

در کد زیر، یک فونت از داخل بانک اطلاعاتی خوانده می شود و پس از تغییر آن توسط کاربر، مجددا ذخیره می گردد :
کد:
    Dim NewFont As StdFont
    Adodc1.RecordSource = "select * from font where index = '" + "1" + "'"
    Adodc1.Refresh
    With Adodc1.Recordset
        Set NewFont = New StdFont
        NewFont.Name = .Fields(1).Value
        NewFont.Size = .Fields(2).Value
        NewFont.Bold = .Fields(3).Value
        NewFont.Italic = .Fields(4).Value
        Set NewFont = [B]ShowFont[/B](NewFont)
        If Not NewFont Is Nothing Then
            .Fields(1).Value = NewFont.Name
            .Fields(2).Value = NewFont.Size
            .Fields(3).Value = NewFont.Bold
            .Fields(4).Value = NewFont.Italic
            .Update
        End If
    End With

ماژول ModuleFontDialog بصورت zip شده ضمیمه این پست می باشد.
 

پیوست ها

  • FontDialog.zip
    2.1 کیلوبایت · بازدیدها: 2

جدیدترین ارسال ها

بالا