Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Вывод текста на Image->Canvas заданным шрифтом


Автор: SparF 6.9.2007, 00:29
С обычным выводом на канву проблем не возникает, а вот если попытаться сделать это каким-либо шрифтом - в тех координатах, куда осуществляется вывод видно лишь закрашенный прямоугольник. Вот код:
Код

        TFont *BtnFont;
...
        Image1->Picture->LoadFromFile("D:\\projects\\batoni\\but_up.bmp");
        Form1->DoubleBuffered = true;

        BtnFont = new TFont;
        BtnFont->Charset = RUSSIAN_CHARSET;
        BtnFont->Color = clWhite;
        BtnFont->Height = -16;
        BtnFont->Name = "Lucida Sans";
        BtnFont->Pitch = fpDefault;
        BtnFont->Size = 12;
        BtnFont->Style = TFontStyles()<< fsBold;

        //вывод на label данным шрифтом происходит без проблем
        Label1->Font = BtnFont;
        Label1->Caption = "Получилось";

        //а вот это- не хочет =(
        Image1->Canvas->Font = BtnFont;
        Image1->Canvas->TextOut(0,0,"werwer");


Скриншот прилагается))
(Image1 - кнопка с закругленными краями)

Добавлено через 46 секунд
Скриншот:

Добавлено через 10 минут и 10 секунд
В голову приходит поместить Label над Image - но что-то как-то это не красиво (( да и при движении Image (а мне придется его двигать) вызовет кучу запарок....

Автор: SenkraD 6.9.2007, 07:31
SparF, а на прямую зменять параметры шрифта канвы пробовал?
А в твоём способе ещё и запоминать нужно предыдущий и потом возвращать обратно!!!

Автор: SparF 6.9.2007, 22:07
Теперь вот так:
Код

BtnFont = new TFont;
        BtnFont->Charset = RUSSIAN_CHARSET;
        BtnFont->Color = clWhite;
        BtnFont->Height = -16;
        BtnFont->Name = "Lucida Sans";
        BtnFont->Pitch = fpDefault;
        BtnFont->Size = 12;
        BtnFont->Style = TFontStyles()<< fsBold;

        Image1->Canvas->Font->Charset = BtnFont->Charset;
        Image1->Canvas->Font->Color = BtnFont->Color;
        Image1->Canvas->Font->Height = BtnFont->Height;
        Image1->Canvas->Font->Name = BtnFont->Name;
        Image1->Canvas->Font->Pitch = BtnFont->Pitch;
        Image1->Canvas->Font->Size = BtnFont->Size;
        Image1->Canvas->Font->Style = BtnFont->Style;


        Label1->Font = BtnFont;
        Label1->Caption = "Получилось";
        //Image1->Canvas->Font = BtnFont;
        //SetBkMode(Image1->Canvas, TRANSPARENT);
        Image1->Canvas->TextOut(0,0,"werwer");

эффект тот же =(
Цитата(SenkraD @  6.9.2007,  07:31 Найти цитируемый пост)
А в твоём способе ещё и запоминать нужно предыдущий и потом возвращать обратно!!! 

зачем? мне просто нужно в вывести надпись на кнопку.

Автор: 586 7.9.2007, 08:28
Image1->Canvas->Brush->Color=clNone;

Автор: abrekos 7.9.2007, 08:31
Цитата(586 @ 7.9.2007,  08:28)
Image1->Canvas->Brush->Color=clNone;

Не, лучше так:
Image1->Canvas->Brush->Style = bsClear;

Автор: SenkraD 7.9.2007, 08:31
SparF,  у меня этот код работает (добавь стили fsItalic и fsUnderline и увидишь)
Цитата(SparF @  6.9.2007,  22:07 Найти цитируемый пост)
зачем? мне просто нужно в вывести надпись на кнопку.

Да, ты прав - глянул исходный код он там Assign'тся - утечки не будет

Автор: SparF 9.9.2007, 21:08
Спасибо)) как только домой доберусь - испробую))))

Автор: Rekah 9.9.2007, 22:11
А подскажите как сделать эффект перетаскивания мюшью объекта label? Я пробовал использовать MouseUp Doun, Movi объекта label и Table, но что-то не получается, есть у кого какие соображения?

Автор: Pori 10.9.2007, 21:00
Ну вот кое-что (не судите строго -писал на скорую руку):
Код


bool down;
TPoint pt;



void __fastcall TForm1::Label1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
down=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Label1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
down=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
if(down) {
 GetCursorPos(&pt);
 Label1->Top = pt.y-Form1->Top-30; //Получаем координату курсора по оси у на самой форме, а не экране (30-это высота бортика)
 Label1->Left = pt.x-Form1->Left; // Аналогично по х}
}



Работает вроде, но хватается за 0,0 лэйбела

Для того, чтобы было не так, сделай аналогично приведенному выше коду.

Автор: GIK 11.9.2007, 17:27
Помойму не получиться, Label1MouseMove - передвижение по самой Label мышью, а не объета по форме. Теперерь вопрос, как это реализовать?  Через MouseMove самой формы тоже не получиться, нужно как-то припоять объект label вместо mouse.

Автор: SparF 11.9.2007, 19:41
Цитата(abrekos @  7.9.2007,  08:31 Найти цитируемый пост)

Не, лучше так:
Код

Image1->Canvas->Brush->Style = bsClear; 

Спасибо большое, это работает)
вот только никак не получается заставить ее выводить надпись нужным цветом (цветом шрифта)
извращения с
Код

Image1->Canvas->Brush->Color

не помогают (

Автор: Pori 11.9.2007, 20:15
Цитата(GIK @  11.9.2007,  17:27 Найти цитируемый пост)
Помойму не получиться, Label1MouseMove - передвижение по самой Label мышью, а не объета по форме. Теперерь вопрос, как это реализовать?  Через MouseMove самой формы тоже не получиться, нужно как-то припоять объект label вместо mouse.


хм, все получится.
Вы посмотрите внимательней, нам же главное не движение мышью объекта (собственно это мы и собираемся реализовать), а движение мыши(просто движение мыши!), а то что мы отлавливаем это движение в нужный момент, это гарантирует переменная bool down

Или же вы имеете в виду, что координаты будут не верны???
Ну так для этого мы и не берем переменные X и Y из функции Label1MouseMove, а используем WinAPI функцию GetCursorPos, которая возвращает координаты мыши относительно экрана

P.S.:я не силен в объяснениях

Автор: Pori 11.9.2007, 20:48
Цитата(Pori @  10.9.2007,  21:00 Найти цитируемый пост)
Работает вроде, но хватается за 0,0 лэйбела


А вот усовершенствованный вариант, в котором положение мыши относительно лэйбела остается неизменным:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

bool down;
TPoint pt;
int lb_X, lb_Y;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Label1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
down=true;
GetCursorPos(&pt);
lb_X=pt.x; lb_Y=pt.y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
down=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
  if(down) {
 GetCursorPos(&pt);

 Label1->Top = Label1->Top+(pt.y-lb_Y);
 Label1->Left = Label1->Left+(pt.x-lb_X);
 lb_X=pt.x; lb_Y=pt.y;

 }
}
//---------------------------------------------------------------------------


Для тех, кто не верит что работает, приведен весь файл cpp. Остается только добавить на форму Label и проверить работоспособность самим ;)

Автор: abrekos 12.9.2007, 09:02
Цитата(SparF @ 11.9.2007,  19:41)
Цитата(abrekos @  7.9.2007,  08:31 Найти цитируемый пост)

Не, лучше так:
Код

Image1->Canvas->Brush->Style = bsClear; 

Спасибо большое, это работает)
вот только никак не получается заставить ее выводить надпись нужным цветом (цветом шрифта)
извращения с
Код

Image1->Canvas->Brush->Color

не помогают (

Да не, Brush - это кисть, а цвет шрифта определяется так:
Image1->Canvas->Font->Color = ... ;

Автор: GIK 12.9.2007, 09:12
Цитата

P.S.:я не силен в объяснениях

Да нет, нормально объяснил  smile , щас догнал что к чему  smile 

Автор: Rekah 12.9.2007, 21:13
Pori, еще момент есть, не учли раположение курсора на самом Labele smile

Код

TForm1 *Form1;

bool down;
TPoint pt;
       int d_x=0, d_y=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
};
//---------------------------------------------------------------------------



//---------------------------------------------------------------------------
void __fastcall TForm1::Label1MouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    down=true;
    d_x=X;    //А еще надо учесть расположение курсора на самом Label :)
    d_y=Y;

}
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void __fastcall TForm1::Label1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    down=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Label1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
 if(down) {
 GetCursorPos(&pt);
// относительно формы       относительно окна
   Label1->Top       =    (pt.y - Form1->Top )- 30 - d_y;   //Получаем координату курсора по оси у на самой форме, а не экране (30-это высота бортика)
   Label1->Left      =    (pt.x - Form1->Left) - 3 - d_x;   // Аналогично по х}
 }                                     /*3 - левые бортик формы*/
}

Автор: SparF 14.9.2007, 12:48
Цитата(abrekos @  12.9.2007,  09:02 Найти цитируемый пост)
Да не, Brush - это кисть, а цвет шрифта определяется так:
Image1->Canvas->Font->Color = ... ; 

Это уже давно сделано (самый первый листинг в теме), все равно на цвете не отражается ((

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)