⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fontdlg.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        src/mac/carbon/fontdlg.cpp// Purpose:     wxFontDialog class for carbon 10.2+.// Author:      Ryan Norton// Modified by:// Created:     1998-01-01// RCS-ID:      $Id: fontdlg.cpp,v 1.39 2006/10/21 16:39:41 VZ Exp $// Copyright:   (c) Ryan Norton// Licence:     wxWindows licence/////////////////////////////////////////////////////////////////////////////// ===========================================================================// declarations// ===========================================================================// ---------------------------------------------------------------------------// headers// ---------------------------------------------------------------------------// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#if wxUSE_FONTDLG#ifdef __BORLANDC__    #pragma hdrstop#endif#ifndef WX_PRECOMP    #include "wx/intl.h"    #include "wx/wxchar.h"    #include "wx/dcclient.h"    #include "wx/frame.h"    #include "wx/textctrl.h"    #include "wx/listbox.h"    #include "wx/checkbox.h"    #include "wx/choice.h"    #include "wx/sizer.h"    #include "wx/stattext.h"    #include "wx/button.h"#endif#include "wx/fontdlg.h"#if wxMAC_USE_EXPERIMENTAL_FONTDIALOGIMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog)#include "wx/mac/private.h"// ---------------------------------------------------------------------------// wxFontDialog// ---------------------------------------------------------------------------static const EventTypeSpec eventList[] ={    { kEventClassFont, kEventFontSelection } ,} ;pascal OSStatus wxMacCarbonFontPanelHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData){    OSStatus result = eventNotHandledErr ;    wxFontDialog *fontdialog = (wxFontDialog*) userData ;    wxFontData& fontdata= fontdialog->GetFontData() ;    wxMacCarbonEvent cEvent( event );    switch(cEvent.GetKind())    {        case kEventFontSelection :        {            ATSUFontID fontId = 0 ;            if ( cEvent.GetParameter<ATSUFontID>(kEventParamATSUFontID, &fontId) == noErr )            {                FMFontStyle fontStyle = cEvent.GetParameter<FMFontStyle>(kEventParamFMFontStyle);                FMFontSize fontSize = cEvent.GetParameter<FMFontSize>(kEventParamFMFontSize);                CFStringRef cfName = NULL;#if 1                FMFontFamily fontFamily = cEvent.GetParameter<FMFontFamily>(kEventParamFMFontFamily);                ATSFontFamilyRef atsfontfamilyref = FMGetATSFontFamilyRefFromFontFamily( fontFamily ) ;                OSStatus err = ATSFontFamilyGetName( atsfontfamilyref , kATSOptionFlagsDefault , &cfName ) ;                wxASSERT_MSG( err == noErr , wxT("ATSFontFamilyGetName failed") );#else                // we don't use the ATSU naming anymore                ByteCount actualLength = 0;                char *c = NULL;                OSStatus err = ATSUFindFontName(fontId , kFontFamilyName, kFontUnicodePlatform, kFontNoScriptCode,                    kFontNoLanguageCode , 0 , NULL , &actualLength , NULL );                if ( err == noErr)                {                    actualLength += 1 ;                    char *c = (char*)malloc( actualLength );                    err = ATSUFindFontName(fontId, kFontFamilyName, kFontUnicodePlatform, kFontNoScriptCode,                        kFontNoLanguageCode, actualLength, c , NULL, NULL);                    cfName = CFStringCreateWithCharacters(NULL, (UniChar*) c, (actualLength-1) >> 1);                }                else                {                    err = ATSUFindFontName(fontId , kFontFamilyName, kFontNoPlatformCode, kFontNoScriptCode,                    kFontNoLanguageCode , 0 , NULL , &actualLength , NULL );                    if ( err == noErr )                    {                        actualLength += 1 ;                        c = (char*)malloc(actualLength);                        err = ATSUFindFontName(fontId, kFontFamilyName, kFontNoPlatformCode, kFontNoScriptCode,                            kFontNoLanguageCode, actualLength, c , NULL, NULL);                        c[actualLength-1] = 0;                        cfName = CFStringCreateWithCString(NULL, c, kCFStringEncodingMacRoman );                    }                }                if ( c!=NULL )                    free(c);#endif                                 if ( cfName!=NULL )                {                    fontdata.m_chosenFont.SetFaceName(wxMacCFStringHolder(cfName).AsString(wxLocale::GetSystemEncoding()));                    fontdata.m_chosenFont.SetPointSize(fontSize);                    fontdata.m_chosenFont.SetStyle(fontStyle & italic ? wxFONTSTYLE_ITALIC : wxFONTSTYLE_NORMAL);                    fontdata.m_chosenFont.SetUnderlined((fontStyle & underline)!=0);                    fontdata.m_chosenFont.SetWeight(fontStyle & bold ? wxFONTWEIGHT_BOLD : wxFONTWEIGHT_NORMAL);                }            }            RGBColor fontColor ;            if ( cEvent.GetParameter<RGBColor>(kEventParamFontColor, &fontColor) == noErr )                fontdata.m_fontColour.FromRGBColor((WXCOLORREF*) &fontColor);            else            {                CFDictionaryRef dict ;                if ( cEvent.GetParameter<CFDictionaryRef>(kEventParamDictionary, &dict) == noErr )                {                    CFDictionaryRef attributesDict ;                    if ( CFDictionaryGetValueIfPresent(dict, kFontPanelAttributesKey, (const void **)&attributesDict) )                    {                        CFDataRef tagsData;                        CFDataRef sizesData;                        CFDataRef valuesData;                        if ( CFDictionaryGetValueIfPresent(attributesDict, kFontPanelAttributeTagsKey, (const void **)&tagsData) &&                             CFDictionaryGetValueIfPresent(attributesDict, kFontPanelAttributeSizesKey, (const void **)&sizesData) &&                             CFDictionaryGetValueIfPresent(attributesDict, kFontPanelAttributeValuesKey, (const void **)&valuesData) )                        {                            ItemCount count = CFDataGetLength(tagsData)/sizeof(ATSUAttributeTag);                            ATSUAttributeTag *tagPtr = (ATSUAttributeTag *)CFDataGetBytePtr(tagsData);                            ByteCount *sizePtr = (ByteCount *)CFDataGetBytePtr(sizesData);                            UInt32 *bytePtr = (UInt32*)CFDataGetBytePtr(valuesData);                            ATSUAttributeValuePtr valuesPtr = bytePtr ;                            for ( ItemCount i = 0 ; i < count ; ++i)                            {                                if ( tagPtr[i] == kATSUColorTag && sizePtr[i] == sizeof(RGBColor))                                {                                    fontdata.m_fontColour.FromRGBColor((WXCOLORREF*) valuesPtr);                                    break ;                                }                                bytePtr = (UInt32*)( (UInt8*)bytePtr + sizePtr[i]);                            }                        }                    }                }            }        }            break ;    } ;    return result ;}DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacCarbonFontPanelHandler )wxFontDialog::wxFontDialog(){}wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData&  data){    Create(parent, data);}wxFontDialog::~wxFontDialog(){}bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data){    m_fontData = data;    return true ;}int wxFontDialog::ShowModal(){    OSStatus err ;    wxFont font = *wxNORMAL_FONT ;    if ( m_fontData.m_initialFont.Ok() )    {        font = m_fontData.m_initialFont ;    }    ATSUStyle style = (ATSUStyle)font.MacGetATSUStyle();    err = SetFontInfoForSelection (kFontSelectionATSUIType,1, &style , NULL);    // just clicking on ENTER will not send us any font setting event, therefore we have to make sure    // that field is already correct    m_fontData.m_chosenFont = font ;    EventHandlerRef handler ;    err = InstallApplicationEventHandler( GetwxMacCarbonFontPanelHandlerUPP(), GetEventTypeCount(eventList), eventList, this , &handler );    if ( !FPIsFontPanelVisible() )        FPShowHideFontPanel();    int retval = RunMixedFontDialog(this);    ::RemoveEventHandler(handler);    return retval ;}#else#if !USE_NATIVE_FONT_DIALOG_FOR_MACOSX#undef wxFontDialog#include "wx/mac/fontdlg.h"#include "wx/fontenum.h"#include "wx/colordlg.h"#include "wx/spinctrl.h"// ---------------------------------------------------------------------------// wxFontDialog stub for mac OS's without a native font dialog// ---------------------------------------------------------------------------static const wxChar *FontFamilyIntToString(int family);static int FontFamilyStringToInt(const wxChar *family);//-----------------------------------------------------------------------------// helper class - wxFontPreviewCtrl//-----------------------------------------------------------------------------class WXDLLEXPORT wxFontPreviewCtrl : public wxWindow{public:    wxFontPreviewCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = 0) :        wxWindow(parent, id, pos, sz, style)    {        SetBackgroundColour(*wxWHITE);    }private:    void OnPaint(wxPaintEvent& event);    DECLARE_EVENT_TABLE()};BEGIN_EVENT_TABLE(wxFontPreviewCtrl, wxWindow)    EVT_PAINT(wxFontPreviewCtrl::OnPaint)END_EVENT_TABLE()void wxFontPreviewCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)){    wxPaintDC dc(this);    wxSize size = GetSize();    wxFont font = GetFont();    if ( font.Ok() )    {        dc.SetFont(font);        // Calculate vertical centre        long w = 0, h = 0;        dc.GetTextExtent( wxT("X"), &w, &h);        dc.SetTextForeground(GetForegroundColour());        dc.SetClippingRegion(2, 2, size.x-4, size.y-4);        dc.DrawText(_("ABCDEFGabcdefg12345"),                     10, size.y/2 - h/2);        dc.DestroyClippingRegion();    }}/* * A control for displaying a small preview of a colour or bitmap */class wxFontColourSwatchCtrl: public wxControl{    DECLARE_CLASS(wxFontColourSwatchCtrl)public:    wxFontColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0);    virtual ~wxFontColourSwatchCtrl();    void OnPaint(wxPaintEvent& event);    void OnMouseEvent(wxMouseEvent& event);    void SetColour(const wxColour& colour) { m_colour = colour; SetBackgroundColour(m_colour); }    wxColour& GetColour() { return m_colour; }    virtual wxSize DoGetBestSize() const { return GetSize(); }protected:    wxColour    m_colour;DECLARE_EVENT_TABLE()};/* * A control for displaying a small preview of a colour or bitmap */BEGIN_EVENT_TABLE(wxFontColourSwatchCtrl, wxControl)    EVT_MOUSE_EVENTS(wxFontColourSwatchCtrl::OnMouseEvent)END_EVENT_TABLE()IMPLEMENT_CLASS(wxFontColourSwatchCtrl, wxControl)wxFontColourSwatchCtrl::wxFontColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style):    wxControl(parent, id, pos, size, style){    SetColour(* wxWHITE);    SetBackgroundStyle(wxBG_STYLE_COLOUR);}wxFontColourSwatchCtrl::~wxFontColourSwatchCtrl(){}void wxFontColourSwatchCtrl::OnMouseEvent(wxMouseEvent& event){    if (event.LeftDown())    {        wxWindow* parent = GetParent();        while (parent != NULL && !parent->IsKindOf(CLASSINFO(wxDialog)) && !parent->IsKindOf(CLASSINFO(wxFrame)))            parent = parent->GetParent();        wxColourData data;        data.SetChooseFull(true);        data.SetColour(m_colour);        wxColourDialog *dialog = new wxColourDialog(parent, &data);        // Crashes on wxMac (no m_peer)#ifndef __WXMAC__        dialog->SetTitle(_("Background colour"));#endif        if (dialog->ShowModal() == wxID_OK)        {            wxColourData retData = dialog->GetColourData();            m_colour = retData.GetColour();            SetBackgroundColour(m_colour);        }        dialog->Destroy();        Refresh();        wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId());        GetEventHandler()->ProcessEvent(event);    }}/*! * wxFontDialog type definition */IMPLEMENT_DYNAMIC_CLASS( wxFontDialog, wxDialog )/*! * wxFontDialog event table definition */BEGIN_EVENT_TABLE( wxFontDialog, wxDialog )    EVT_LISTBOX( wxID_FONTDIALOG_FACENAME, wxFontDialog::OnFontdialogFacenameSelected )    EVT_SPINCTRL( wxID_FONTDIALOG_FONTSIZE, wxFontDialog::OnFontdialogFontsizeUpdated )    EVT_TEXT( wxID_FONTDIALOG_FONTSIZE, wxFontDialog::OnFontdialogFontsizeTextUpdated )    EVT_CHECKBOX( wxID_FONTDIALOG_BOLD, wxFontDialog::OnFontdialogBoldClick )    EVT_CHECKBOX( wxID_FONTDIALOG_ITALIC, wxFontDialog::OnFontdialogItalicClick )    EVT_CHECKBOX( wxID_FONTDIALOG_UNDERLINED, wxFontDialog::OnFontdialogUnderlinedClick )    EVT_BUTTON( wxID_OK, wxFontDialog::OnOkClick )    EVT_BUTTON(wxID_FONTDIALOG_COLOUR, wxFontDialog::OnColourChanged)END_EVENT_TABLE()/*! * wxFontDialog constructors */wxFontDialog::wxFontDialog( ){    m_dialogParent = NULL;}wxFontDialog::wxFontDialog(wxWindow* parent, const wxFontData& fontData){    m_dialogParent = NULL;    Create(parent, fontData);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -