Mailing Lists: Apple Mailing Lists

Image of Mac OS face in stamp
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

How to use Unicode with Carbon



Hi,

I would like to created a carbon application and use UTF-8 encoded
strings for it's controls (if necessary I can also first convert to
UTF-16 and then send the string to Carbon.

How can I do this? I tryed something like this:

 ignoreResult := CreatePushButtonControl(nil, GetQDRect(200, 200, 100, 50),
  CFSTRP('Showñãłø Dialog'), button2);

But it doesn't work

Here is compilable application that I used to test this (which won't
show the UTF-8 Chars):

{
controldemo.pas

*****************************************************************************
*                                                                           *
*  This demonstration program is public domain, which means no copyright,   *
* but also no warranty!                                                     *
*                                                                           *
*  This program is distributed in the hope that it will be useful,          *
*  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                     *
*                                                                           *
*****************************************************************************

This application will create a window with two buttons in it

When you click the button 'Hello Button',
 it will show or hide (alternating with each click) a text on the window

When you click the button 'Show Dialog', it will show a modal message dialog

Author: Felipe Monteiro de Carvalho

Contributors: Ingemar Ragnemalm
}
program controldemo;

{$mode delphi}

uses
SysUtils, FPCMacOSAll, MacPas;

var
 mainWindow: WindowRef;
 contentView: HIViewRef;
 button1, button2: ControlRef;
 staticText: ControlRef;
 showTextFlag: Boolean = false;

const
 kButtonHello = 'HELO';
 kButtonMessage = 'MSGE';

{ implementation of the functions }

{ Functions to easely generate carbon structures }

function GetQDRect(Left, Top, Width, Height: Integer): FPCMacOSAll.Rect;
begin
 result.Left := Left;
 result.Top := Top;
 result.Right := Left + Width;
 result.Bottom := Top + Height;
end;

{ Shows a message box }

procedure DoShowMessage(ATitle, AMsg: string);
var
 outItemHit: SInt16;
 err: OSErr;
begin
 err := StandardAlert(kAlertNoteAlert, ATitle, AMsg, nil, outItemHit);
end;

{ Event handling routines }

{  Here we alternate the visibility status of the static text
 with each button click }
function ButtonHelloPressed: OSStatus;
begin
 result := 0;

 showTextFlag := not showTextFlag;

 if showTextFlag then HIViewSetVisible(staticText, True)
 else HIViewSetVisible(staticText, False);
end;

function ButtonMessagePressed: OSStatus;
begin
 result := 0;

 DoShowMessage('Standard message dialog', 'This dialog is modal');
end;

{ Message handling function }

function WindowCommandHandler(nextHandler: EventHandlerCallRef;
theEvent: EventRef; userDataPtr: UnivPtr): OSStatus;
var
 status: OSStatus;
 ignoreresult: OSStatus;
 aCommand: HICommand;
begin
 status := eventNotHandledErr;

 ignoreresult := GetEventParameter(theEvent, kEventParamDirectObject,
  typeHICommand, nil, sizeof(aCommand), nil, @aCommand);

 if aCommand.commandID = FOUR_CHAR_CODE(kButtonHello) then status :=
ButtonHelloPressed()
 else if aCommand.commandID = FOUR_CHAR_CODE(kButtonMessage) then
status := ButtonMessagePressed();

 result := status;
end;

{ Initialization and finalization routines }

procedure Initialize;
var
 status, ignoreResult: OSStatus;
 cmdEvent: EventTypeSpec;
 eventHandler: EventHandlerUPP;
 fontStyle: ControlFontStyleRec;
begin
 status := CreateNewWindow(kDocumentWindowClass,
  (kWindowStandardDocumentAttributes or kWindowStandardHandlerAttribute
   or kWindowCompositingAttribute),
  GetQDRect(100, 100, 350, 350), mainWindow);

 if (status <> noErr) or (mainWindow = nil) then
 begin
   DoShowMessage('Error', 'CreateNewWindow failed');
   Exit;
 end;

 ignoreResult := SetWindowTitleWithCFString(mainWindow,
CFSTRP('Carbonñãłø FPC Controls Demo'));

 ignoreResult := HIViewFindByID(HIViewGetRoot(mainWindow),
kHIViewWindowContentID, contentView);

 { Add events }

 cmdEvent.eventClass := kEventClassCommand;
 cmdEvent.eventKind := kEventCommandProcess;
 eventHandler := NewEventHandlerUPP(@WindowCommandHandler);
 ignoreResult := InstallEventHandler(GetWindowEventTarget(mainWindow),
  eventHandler, 1, @cmdEvent, nil, nil);

 { Creates the hello button }

 ignoreResult := CreatePushButtonControl(nil, GetQDRect(50, 200, 100, 50),
  CFSTRP('Hello Button'), button1);

 ignoreResult := HIViewAddSubview(contentView, button1);
 ignoreResult := SetControlCommandID(button1, FOUR_CHAR_CODE(kButtonHello));
 ignoreResult := HIViewSetVisible(button1, TRUE);

 { Creates the message button }

 ignoreResult := CreatePushButtonControl(nil, GetQDRect(200, 200, 100, 50),
  CFSTRP('Showñãłø Dialog'), button2);

 ignoreResult := HIViewAddSubview(contentView, button2);
 ignoreResult := SetControlCommandID(button2, FOUR_CHAR_CODE(kButtonMessage));
 ignoreResult := HIViewSetVisible(button2, TRUE);

 { Creates the text control }

 fontStyle.flags := kControlUseJustMask or kControlUseSizeMask;
 fontStyle.just := teCenter;
 fontStyle.size := 30;

 ignoreResult := CreateStaticTextControl(mainWindow,
  GetQDRect(0, 50, 350, 50), nil, @fontStyle, staticText);

 ignoreResult := HIViewAddSubview(contentView, staticText);
 ignoreResult := HIViewSetVisible(staticText, FALSE);

 HIViewSetText(staticText, CFSTRP('Hello ñãłø Controls!'));

 { Shows the window }

 ShowWindow(mainWindow);
end;

procedure DoCloseWindow(theWind: WindowRef);
var
 theEvent: EventRef;
begin
 CreateEvent(nil, kEventClassWindow, kEventWindowClose,
GetCurrentEventTime, kEventAttributeNone, theEvent);
 SetEventParameter(theEvent, kEventParamDirectObject, typeWindowRef,
sizeof(WindowRef), theWind);
 SendEventToEventTarget(theEvent, GetWindowEventTarget(theWind));
end;

{ Closes all windows, so they have time to save any user data (none in
this case) }

procedure Finalize;
begin
 DoCloseWindow(mainWindow);
end;

{ Main program section }

begin
 Initialize();

 RunApplicationEventLoop();

 Finalize();
end.
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Carbon-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/carbon-dev/email@hidden

This email sent to email@hidden



Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2007 Apple Inc. All rights reserved.