JS+
Усиленный язык сценариев для Windows
с возможностью встраивания
в ваши приложения
О языке JS+ Справочник Скачать JS+ DLL
Контакты
СПРАВОЧНИК ПО ЯЗЫКУ JS+ Содержание

DrawText

- функция WinAPI
Функции WinAPI
Отображает указанный текст в указанном прямоугольнике, форматируя его указанным способом.
Синтаксис
function DrawText(
  hDC,
  Text,
  Count,
  Rect,
  Format
): Number;

Параметры
Параметр Тип Описание
hDC Number дескриптор контекста устройства
Text String текст для вывода
Count Number количество отображаемых символов, либо -1 для отображения всего текста
Rect TRect прямоугольник, в котором текст должен быть выведен
Format Enumset параметры форматирования текста (см. ниже)

Параметр Format
Значение Описание
DT_BOTTOM выравнивает текст по основанию указанного прямоугольника. Этот флаг используется только с флагом DT_SINGLELINE
DT_CALCRECT если получается несколько строк текста, функция использует ширину указанного прямоугольника и увеличивает его высоту, чтобы поместить последнюю строку текста. Если самое большое слово шире прямоугольника, его ширина увеличивается. Если текст меньше ширины прямоугольника, его ширина уменьшается.
Если получается только одна строка текста, функция изменяет ширину прямоугольника так, чтобы она вмещала последнюю букву в строке.
При использовании этого флага функция возвращает высоту отформатированного текста, но не выводит текст
DT_CENTER центрирует текст горизонтально в указанном прямоугольнике
DT_EDITCONTROL функция дублирует текст в многострочном поле редактирования. Затем средняя ширина символа рассчитывается так же, как и для зтого поля редактирования, и в результате на экране не может оказаться частично видимая последняя строка текста
DT_END_ELLIPSIS если конец строки не помещается в указанный прямоугольник, отображаемый на экране текст переносится на новую строку с добавлением тире. Если слово, находящееся не в конце строки, выходит за пределы указанного прямоугольника, оно переносится без добавления тире. Этот флаг действует совместно с флагом DT_MODIFYSTRING
DT_EXPANDTABS увеличивает число символов в табуляции. Заданное по умолчанию число символов в табуляции - восемь. При установке этого флага, флаги DT_WORD_ELLIPSIS, DT_PATH_ELLIPSIS и DT_END_ELLIPSIS не могут быть использованы
DT_EXTERNALLEADING включает межстрочное расстояние шрифта в высоту строки
DT_HIDEPREFIX игнорирует символ префикса & как подчеркивание следующей буквы, но символы префикса && продолжают работать
DT_INTERNAL использует системный шрифт для рассчета метрик текста
DT_LEFT выравнивает текст влево
DT_MODIFYSTRING изменяет строку в соответствии с отображаемым текстом. Этот флаг действует совместно с флагами DT_END_ELLIPSIS или DT_PATH_ELLIPSIS
DT_NOCLIP выводит текст без обрезки по указанному прямоугольнику
DT_NOFULLWIDTHCHARBREAK устанавливает разрывы строки в двухбайтовой кодировке в соответствии с однобайтовой. Этот флаг действует совместно с флагом DT_WORDBREAK
DT_NOPREFIX выключает обработку символов префикса & и &&
DT_PATH_ELLIPSIS заменяет символы в середине текста многоточием, чтобы результат поместился в указанный прямоугольник. Этот флаг действует совместно с флагом DT_MODIFYSTRING
DT_PREFIXONLY выводит подчеркивание в позиции символа после префикса &, без вывода самого символа
DT_RIGHT выравнивает текст вправо
DT_RTLREADING выводит текст в справа налево, например текст на иврите
DT_SINGLELINE выводит весь текст на единственной строке, возвраты каретки и переводы строки игнорируются
DT_TABSTOP устанавливает шаги табуляции. Биты 15-8 (старший байт младшего слова) параметра Format задают число символов для табуляции. Флаги DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP и DT_NOPREFIX не могут быть использованы с этим флагом
DT_TOP выравнивает текст по верху указанного прямоугольника
DT_VCENTER центрирует текст вертикально в указанном прямоугольнике. Этот флаг используется только с флагом DT_SINGLELINE
DT_WORDBREAK разрывает строки между словами при выходе текста за правую границу указанного прямоугольника. Символы возврата каретки или перевода строки (CR/LF) также разрывают текст на строки
DT_WORD_ELLIPSIS заменяет любое слово, не помещающееся в указанный прямоугольник, на многоточие
Возвращаемое значение
В случае успеха: высота текста или (при установке флагов DT_VCENTER или DT_BOTTOM) расстояние от верха указанного прямоугольника до основания текста.
В случае ошибки: 0.
Пример (JS+)
var Folder,ColWidth_0,VSW=GetSystemMetrics(SM_CXVSCROLL);

// Главная форма
frm=new TForm();
frm.Caption="JS+ - функция WinAPI DrawText";
frm.Width =600;
frm.Height=600;

// Строка состояния
stb=new TStatusBar(frm);
stb.SimpleText=" Пример работы с файловыми функциями поиска";

// Значки папок и файлов
(ic1=new TIcon()).LoadFromFile(JSPlus.HelpDir+"IMAGE\\Function\\Fld_Opn.ico");
(ic2=new TIcon()).LoadFromFile(JSPlus.HelpDir+"IMAGE\\Function\\Fld_Cls.ico");
(ic3=new TIcon()).LoadFromFile(JSPlus.HelpDir+"IMAGE\\Function\\Doc_Cls.ico");

// Список дисков
cmb=new TComboBox(frm);
cmb.Style=csDropDownList;
cmb.Left=cmb.Top=10;
cmb.Width=frm.ClientWidth-cmb.Left*2;
cmb.OnSelect=cmb_Select;
for (i=0,w=GetLogicalDrives();i<26;i++) {
  if ((w>>i) & 1) {
    tmp_str="Диск "+(dsk_str=String.fromCharCode(65+i)+":");
    if (GetDriveType(dsk_str)==DRIVE_FIXED)
      cmb.Items.Add(tmp_str+" "+DiskLabel(i+1));
  }
}
cmb.ItemIndex=0;

// Таблица строк
stg=new TStringGrid(frm);
stg.BorderStyle=bsSingle;
stg.ScrollBars=ssBoth;
stg.Options=goFixedHorzLine | goFixedVertLine | goRowSelect | goThumbTracking;
stg.ColCount=3;
stg.RowCount=2;
stg.FixedRows=1;
stg.Left=cmb.Left;
stg.Top =cmb.Top+cmb.Height+10;
stg.Width =cmb.Width;
stg.Height=stb.Top-stg.Top-10;
stg.DefaultRowHeight=stg.TextHeight("Q")+4;
stg.Cells[0][0]="Имя файла/каталога";
stg.Cells[1][0]="Дата";
stg.Cells[2][0]="Размер";
stg.ColWidths[1]=stg.TextWidth("00.00.0000")+20;
stg.ColWidths[2]=stg.TextWidth("0000000000")+20;
stg.ColWidths[0]=ColWidth_0=
stg.ClientWidth-stg.ColWidths[1]-stg.ColWidths[2]-2;
stg.OnDblClick=stg_DblClick;
stg.OnDrawCell=stg_DrawCell;
cmb_Select(cmb);
stg.OnSelectCell=stg_SelectCell;

frm.ShowModal();

// Формирует список файлов и каталогов
function Make_fList(Fld_Str)
{
  var i,j,str,spl_lst,src=new TSearchRec();

  // Начать поиск файлов и каталогов
  if (FindFirst(Folder+"*.*",faAnyFile,src)!=0) {
    FindClose(src);
    src.Delete();
    return false;
  }

  str=new TStrings();
  if (src.Name!=".")
    str.Add(((src.Attr & faDirectory) ? "D" : "F")+"|"+
    src.Name+"|"+DateToStr(FileDateToDateTime(src.Time))+"|"+
    src.Size);

  // Продолжить поиск
  while (FindNext(src)==0) {
    if (src.Name=="..")
      continue;
    str.Add(((src.Attr & faDirectory) ? "D" : "F")+"|"+
    src.Name+"|"+DateToStr(FileDateToDateTime(src.Time))+"|"+
    src.Size);
  }

  // Завершить поиск
  FindClose(src);
  src.Delete();

  str.Sort();
  if (Folder.split("\\").length>2)
    str.Insert(0,"D|..||");

  for (i=stg.RowCount;i>0;i--)
    stg.Rows[i].Clear();
  stg.Row=1;
  stg.RowCount=str.Count+1;

  for (i=0;i<str.Count;i++) {
    spl_lst=str[i].split("|");
    if ((stg.Cells[0][j=i+1]=spl_lst[1])==Fld_Str)
      stg.Row=j;
    stg.Cells[1][j]=spl_lst[2];
    stg.Cells[2][j]=(spl_lst[0]=="D") ? "-" : spl_lst[3];
  }

  i=ColWidth_0;
  if (stg.RowCount<=(stg.VisibleRowCount+stg.FixedRows))
    i+=VSW;
  stg.ColWidths[0]=i;

  return true;
}

// Обработчик события OnSelect
function cmb_Select(cmb)
{
  Folder=cmb.Items[cmb.ItemIndex].split(" ")[1]+"\\";
  Make_fList("");
  stg.SetFocus();
}

// Обработчик события OnDblClick
function stg_DblClick(stg)
{
  var row,spl_lst,stg_str,old_fld=Folder,fld_str="";
  var pnt=new TPoint(),grc=new TGridCoord();

  GetCursorPos(pnt);
  pnt=stg.ScreenToClient(pnt);
  stg.MouseToCell(pnt.x,pnt.y,grc);
  pnt.Delete();
  row=grc.Y;
  grc.Delete();

  if ((row<1) || (stg.Cells[2][row]!="-"))
    return;

  if ((stg_str=stg.Cells[0][row])=="..") {
    spl_lst=Folder.split("\\");
    fld_str=spl_lst[i=spl_lst.length-2];
    spl_lst.splice(i,1);
    Folder=spl_lst.join("\\");
  }
  else
    Folder+=stg_str+"\\";

  if (Make_fList(fld_str)==false)
    Folder=old_fld;
}

// Обработчик события OnDrawCell
function stg_DrawCell(stg,col,row,rct,state)
{
  var stg_str=stg.Cells[col][row],cnv=stg.Canvas;
  var ttl_str,bclr=stg.Color,fclr=stg.Font.Color;
  var icn,y,out_Style=DT_VCENTER+DT_SINGLELINE;

  if (state & gdFixed)
    bclr=stg.FixedColor;
  else
  if (state & gdSelected) {
    if (stg.RowCount>1) {
      bclr=clHighlight;
      fclr=clHighlightText;
    }
  }
  else
  if ((row % 2==0) &&
    (((col==0) && (stg.Cells[2][row]!="-")) ||
     ((col> 0) && (stg.Cells[2][row]!="-"))))
    bclr=0xF0F0F0.toTColor();

  // Закрасить ячейку
  cnv.Brush.Color=bclr;
  rct.Right+=1;
  cnv.FillRect(rct);

  // Вывести текст ячейки
  cnv.Font.Color=fclr;
  if (row==0)
    out_Style+=DT_CENTER;
  else
  switch (col) {
    case 0: switch (stg.Cells[2][row]) {
              case "-": icn=(stg_str=="..") ? ic1 : ic2; break;
               default: icn=ic3;
            }
            y=rct.Top+(rct.Height()-icn.Height)/2;
            cnv.Draw(rct.Left+=4,y,icn);
            rct.Left+=icn.Width+4;
            break;

    case 1: out_Style+=DT_CENTER; break;

    case 2: if (stg_str=="-")
              return;
            rct.Right-=stg.TextWidth(" ");
            out_Style+=DT_RIGHT;
  }
  DrawText(cnv.Handle,stg_str,-1,rct,out_Style);
}

// Обработчик события OnSelectCell
function stg_SelectCell(stg,col,row)
{
  var stb_str=Folder+stg.Cells[col][row];
  var cnv=stb.Canvas,dx=cnv.ClipRect.Width()-20;

  if (stg.RowCount==1)
    return false;

  if (col!=stg.LeftCol) {
    stg.Col=stg.LeftCol;
    stg.Row=row;
    return false;
  }

  stb.SimpleText=" "+MinimizeName(stb_str,cnv,dx);
}
Совместимость
Windows API
См. также
JS+Руководство пользователя
Адрес этой страницы: http://jsplus.ru/MANUAL/JSPlus/WinAPI/Function/DrawText.htm
© 2024,