IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

[SRC] PB Hint de l'application en UNICODE


Sujet :

C++Builder

  1. #1
    Membre du Club

    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 54
    Points
    54
    Par défaut [SRC] PB Hint de l'application en UNICODE
    j'utilise differents objet composants et ocx avec builder V6 Pro
    de plus , je compile en unicode.

    mon pb est le suivant , lorsque j'affecte un chaine unicode à un composant dans son hint est une WideString , l'application m'affiche des ?????? car le Hint de l'application est une AnsiString. grace au forum j'ai trouvé des composant unicode les tntunicodecontrols , qui marche tres bien , car il gere lui meme les tooltip ou Hint.

    Mais pas le reste de mon application , alors comment faire ?
    quels messages intercepter pour avoir çà propre gestion des tooltip , sans utiliser le Hint de l'application qui tronque les donnée ?

    merci pour une réponse .

    @+

  2. #2
    Membre du Club

    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 54
    Points
    54
    Par défaut
    j'ai fait une erreur , le hint de l'application est bien une WideString , c'est le hint d'un ocx TOleControl qui est une AnsiString.
    j'essaie d'utilise THintWindow , mais j'y arrive toujours pas !

    @+

  3. #3
    Membre du Club

    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 54
    Points
    54
    Par défaut
    j'ai utilisé la dérivation de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application->OnShowHint
    çà marche plutot bien !

  4. #4
    Membre du Club

    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 54
    Points
    54
    Par défaut
    voila le travail apres 3 jours de recherches ....

    j'utilise a la fois la Deriavation de ThintWindows

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //---------------------------------------------------------------------------
    class TMyHintWindow : public THintWindow
    {
       private:
     
       protected:
            virtual void __fastcall Paint(void);
            virtual TRect __fastcall CalcHintRect(int MaxWidth, AnsiString AHint, void * AData);
     
       public:
            virtual __fastcall TMyHintWindow(Classes::TComponent* AOwner) : Controls::THintWindow(AOwner) { }
            virtual __fastcall TMyHintWindow(HWND ParentWindow) : Controls::THintWindow(ParentWindow) { }
    };
    //---------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    /---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    void __fastcall THintWindow::NCPaint(HDC DC)
    {
            // rien faire
           // evite l'erreur de linkage
    }
     
    //---------------------------------------------------------------------------
    WideString g_GlobalHint = "" ;
    //---------------------------------------------------------------------------
     
    TRect __fastcall TMyHintWindow::CalcHintRect(int MaxWidth, AnsiString AHint, void * AData)
    {
            _tString Text = g_GlobalHint ;
     
            Canvas->Font->Size = 14;
            Canvas->Font->Color = clYellow;
            Canvas->Font->Name = "Arial";
     
            TSize size ;
            GetTextExtentPoint(Canvas->Handle,Text.GET_DATA(),Text.Length(),&size);
     
            TRect rect = THintWindow::CalcHintRect(MaxWidth, AHint, AData);
            rect.Right = 10 + rect.Left + size.cx + 10 ;
            return rect;
    }
     
    void __fastcall TMyHintWindow::Paint(void)
    {
            _tString Text = g_GlobalHint ;
     
            TRect Rect = GetClientRect();
     
            HRGN WindowRegion = CreateRoundRectRgn( 1,
                                                    1,
                                                    Rect.Width(),
                                                    Rect.Height(),
                                                    20,
                                                    20);
     
            SetWindowRgn(Handle, WindowRegion, true);
     
     
            HBRUSH hbr = CreateSolidBrush((COLORREF)clBlack);
            HBRUSH hbr_old = SelectObject(Canvas->Handle,hbr);
            FillRect(Canvas->Handle,&Rect,hbr);
            SelectObject(Canvas->Handle,hbr_old);
            if (hbr != NULL) DeleteObject(hbr);
     
            TRect RectEx = GetClientRect();
            RectEx.Top += 1 ;
            RectEx.Left += 1 ;
            RectEx.Right -= 3 ;
            RectEx.Bottom -= 3 ;
     
            hbr = CreateSolidBrush((COLORREF)0x00FFA0A0);
            hbr_old = SelectObject(Canvas->Handle,hbr);
            HPEN Pen = CreatePen(PS_SOLID,1,(COLORREF)0x00FFA0A0);
            HPEN OldPen = SelectObject(Canvas->Handle,Pen);
            RoundRect(Canvas->Handle,RectEx.Left,RectEx.Top,RectEx.Right,RectEx.Bottom,20,20);
            SelectObject(Canvas->Handle,hbr_old);
            if (hbr != NULL) DeleteObject(hbr);
            SelectObject(Canvas->Handle,OldPen);
            if (Pen != NULL) DeleteObject(Pen);
     
            Canvas->Font->Size = 14;
            Canvas->Font->Color = clYellow;
            Canvas->Font->Name = "Arial";
     
            SelectObject(Canvas->Handle, Canvas->Font->Handle);
            SetBkMode(Canvas->Handle, TRANSPARENT);
            SetTextColor(Canvas->Handle, clYellow);
            DrawText(Canvas->Handle,Text.GET_DATA(),Text.Length(), &RectEx,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    }
    //---------------------------------------------------------------------------
    Puis la derivation de OnShowHint

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     void __fastcall MyOnShowHint(AnsiString &HintStr, bool &CanShow, THintInfo &HintInfo);
    dans le constructeur de ma form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application->OnShowHint = MyOnShowHint ;
    puis


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    extern WideString g_GlobalHint ;
     
    void __fastcall TForm2::MyOnShowHint(AnsiString &HintStr, bool &CanShow, THintInfo &HintInfo)
    {
            AnsiString csName = HintInfo.HintControl->ClassName() ;
     
            g_GlobalHint = "" ;
     
            if (csName == "TNMButon") g_GlobalHint = (WideString)((TNMButon*)HintInfo.HintControl)->ToolTip ;
            else if (csName == "TShapebleu") g_GlobalHint = (WideString)((TShapebleu*)HintInfo.HintControl)->Hint ;
            else if (csName == "TButton") g_GlobalHint = (WideString)((TButton*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntButton") g_GlobalHint = (WideString)((TTntButton*)HintInfo.HintControl)->Hint ;
            else if (csName == "TSpeedButtonBlue") g_GlobalHint = (WideString)((TSpeedButtonBlue*)HintInfo.HintControl)->Hint ;
            else if (csName == "TPanel") g_GlobalHint = (WideString)((TPanel*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntPanel") g_GlobalHint = (WideString)((TTntPanel*)HintInfo.HintControl)->Hint ;
            else if (csName == "TPanelNetia") g_GlobalHint = (WideString)((TPanelNetia*)HintInfo.HintControl)->Hint ;
            else if (csName == "TNewSplitter") g_GlobalHint = (WideString)((TNewSplitter*)HintInfo.HintControl)->Hint ;
            else if (csName == "TInfoSpectre") g_GlobalHint = (WideString)((TInfoSpectre*)HintInfo.HintControl)->Hint ;
            else if (csName == "TLogPanel") g_GlobalHint = (WideString)((TLogPanel*)HintInfo.HintControl)->Hint ;
            else if (csName == "MyScrollBar") g_GlobalHint = (WideString)((MyScrollBar*)HintInfo.HintControl)->Hint ;
            else if (csName == "TGenCounter") g_GlobalHint = (WideString)((TGenCounter*)HintInfo.HintControl)->Hint ;
            else if (csName == "TMenuPopUp") g_GlobalHint = (WideString)((TMenuPopUp*)HintInfo.HintControl)->Hint ;
            else if (csName == "GenCart") g_GlobalHint = (WideString)((GenCart*)HintInfo.HintControl)->Hint ;
            else if (csName == "GenCartToAff") g_GlobalHint = (WideString)((GenCartToAff*)HintInfo.HintControl)->Hint ;
            else if (csName == "TListCart") g_GlobalHint = (WideString)((TListCart*)HintInfo.HintControl)->Hint ;
            else if (csName == "TLabel") g_GlobalHint = (WideString)((TLabel*)HintInfo.HintControl)->Hint ;
            else if (csName == "TEdit") g_GlobalHint = (WideString)((TEdit*)HintInfo.HintControl)->Hint ;
            else if (csName == "TCheckBox") g_GlobalHint = (WideString)((TCheckBox*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntLabel") g_GlobalHint = (WideString)((TTntLabel*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntEdit") g_GlobalHint = (WideString)((TTntEdit*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntCheckBox") g_GlobalHint = (WideString)((TTntCheckBox*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTimeCtrl") g_GlobalHint = (WideString)((TTntCheckBox*)HintInfo.HintControl)->Hint ;
     
            if (g_GlobalHint.IsEmpty() == false)
            {
                    HintInfo.HintWindowClass = __classid( TAHintWindow );
                    CanShow = true;
            }
            else
            {
                    HintInfo.HintWindowClass = __classid( THintWindow );
                    CanShow = false ;
            }
    }
    je suis oblige d'utiliser un variable global entre MyOnShowHint et TMyHintWindow comme çà je lis directement la valeur du Hint en WideString de l'objet.
    Pour le pb de l'ocx j'ajoute à l'ocx une propriete ToolTip en BSTR que l'appelle directement

    IMAGE ...

    CEPENDANT

    cela marche tres bien dans mon appli de test , mais pas dans la BIG appli
    j'arrive dans la fonction MyOnShowHint , je passe les bon parametre ,
    mias je passe pas des les fonctions de TMyHintWindow comme l'appli de test .

    LA JE COMPRENDS PLUS RIEN ....

  5. #5
    Membre du Club

    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 54
    Points
    54
    Par défaut
    j'ai trouvé, il y avait un pb de la fonction MyShowHint

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    void __fastcall TForm1::MyOnShowHint(AnsiString &HintStr, bool &CanShow, THintInfo &HintInfo)
    {
            HintInfo.HintWindowClass = __classid( TMyHintWindow );
            HintInfo.ReshowTimeout = 0 ;
            HintInfo.HideTimeout = 2500 ;
     
            AnsiString csName = HintInfo.HintControl->ClassName() ;
     
            g_GlobalHint = "" ;
     
            if (csName == "TNMButon") g_GlobalHint = (WideString)((TNMButon*)HintInfo.HintControl)->ToolTip ;
            else if (csName == "TShapebleu") g_GlobalHint = (WideString)((TShapebleu*)HintInfo.HintControl)->Hint ;
            else if (csName == "TButton") g_GlobalHint = (WideString)((TButton*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntButton") g_GlobalHint = (WideString)((TTntButton*)HintInfo.HintControl)->Hint ;
            else if (csName == "TSpeedButtonBlue") g_GlobalHint = (WideString)((TSpeedButtonBlue*)HintInfo.HintControl)->Hint ;
            else if (csName == "TPanel") g_GlobalHint = (WideString)((TPanel*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntPanel") g_GlobalHint = (WideString)((TTntPanel*)HintInfo.HintControl)->Hint ;
            else if (csName == "TPanelNetia") g_GlobalHint = (WideString)((TPanelNetia*)HintInfo.HintControl)->Hint ;
            else if (csName == "TNewSplitter") g_GlobalHint = (WideString)((TNewSplitter*)HintInfo.HintControl)->Hint ;
            else if (csName == "TInfoSpectre") g_GlobalHint = (WideString)((TInfoSpectre*)HintInfo.HintControl)->Hint ;
            else if (csName == "MyScrollBar") g_GlobalHint = (WideString)((MyScrollBar*)HintInfo.HintControl)->Hint ;
            else if (csName == "TGenCounter") g_GlobalHint = (WideString)((TGenCounter*)HintInfo.HintControl)->Hint ;
            else if (csName == "TMenuPopUp") g_GlobalHint = (WideString)((TMenuPopUp*)HintInfo.HintControl)->Hint ;
            else if (csName == "GenCart") g_GlobalHint = (WideString)((GenCart*)HintInfo.HintControl)->Hint ;
            else if (csName == "GenCartToAff") g_GlobalHint = (WideString)((GenCartToAff*)HintInfo.HintControl)->Hint ;
            else if (csName == "TListCart") g_GlobalHint = (WideString)((TListCart*)HintInfo.HintControl)->Hint ;
            else if (csName == "TLabel") g_GlobalHint = (WideString)((TLabel*)HintInfo.HintControl)->Hint ;
            else if (csName == "TEdit") g_GlobalHint = (WideString)((TEdit*)HintInfo.HintControl)->Hint ;
            else if (csName == "TCheckBox") g_GlobalHint = (WideString)((TCheckBox*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntLabel") g_GlobalHint = (WideString)((TTntLabel*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntEdit") g_GlobalHint = (WideString)((TTntEdit*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntCheckBox") g_GlobalHint = (WideString)((TTntCheckBox*)HintInfo.HintControl)->Hint ;
            else if (csName == "TImage") g_GlobalHint = (WideString)((TImage*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTntImage") g_GlobalHint = (WideString)((TTntImage*)HintInfo.HintControl)->Hint ;
            else if (csName == "TTimeCtrl") g_GlobalHint = (WideString)((TTntCheckBox*)HintInfo.HintControl)->Hint ;
            else if (csName == "TMyProgressBar") g_GlobalHint = (WideString)((TMyProgressBar*)HintInfo.HintControl)->Hint ;
     
            if (g_GlobalHint.IsEmpty() == false)
            {
                    HintStr = g_GlobalHint ;
                    HintInfo.HintStr = g_GlobalHint ;
     
                    CanShow = true;
            }
    }
    LA CA MARCHE ....

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [D7] Application compatible UNICODE
    Par Zepeq dans le forum Composants VCL
    Réponses: 3
    Dernier message: 11/03/2008, 16h56
  2. Bien créer une application multi-langues ? Unicode ou non ?
    Par Maxime Abbey dans le forum Composants VCL
    Réponses: 28
    Dernier message: 10/09/2007, 17h20
  3. Application Unicode et DELPHI?
    Par kheldoun ahmed dans le forum Delphi
    Réponses: 5
    Dernier message: 14/05/2007, 11h50
  4. Réponses: 4
    Dernier message: 21/07/2006, 10h41
  5. [Unicode] Internationalisation d'une application
    Par Thierry Laborde dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2003, 20h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo