질문 올라왔을때 혹시 관련함수가 있나 찾아봤는데 안나와서
직접 만들어 봤었습니다.
//함수
String __fastcall StrToFitStr(TCanvas *Canvas,int CanvasWid,String str)
{
const String c=" ... ";
WideString wStr=str;
if(Canvas->TextWidth(str)>CanvasWid)
{
int tLen=0;
String tmpS;
for(int i=1;iTextWidth(tmpS);
if(tLen>=CanvasWid)
{
return wStr.SubString(1,i-1)+c;
}
}
return str;
}
else
return str;
}
//사용예
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TCanvas *Can=new TCanvas;
Can->Handle=GetDC(Panel1->Handle);
Can->Font=Panel1->Font;
String str=Edit1->Text;
Panel1->Caption=StrToFitStr(Can,Panel1->Width-5,str);
delete Can;
}
그런데 임프님의 답변을 보고 검색해보니
PathCompactPath 라는 api 가 있네요
http://msdn.microsoft.com/en-us/library/bb773575(VS.85).aspx
이 함수는 File_Path를 줄여주는 함수인데요
"C:\Program Files\Borland\CBuilder6\Bin\bcb.exe" 라는 파일명이 있으면
"C:\...bcb.exe" 뭐 이런식으로 바꿔주는 함수입니다.
즉 말줄임표("...") 가 가운데나 앞에 붙습니다.
그런데 file path가 아니라 그냥 string이면 말줄임표("...")가 뒤에 붙습니다.
예를 들어
String "ABCDEFGHIJKLMN" 의 경우 "ABCD..." 뭐 이런식으로 나오죠
#include
//link: Shlwapi.lib
void __fastcall TForm1::Button8Click(TObject *Sender)
{
char szShortPath[30];
String str1="my name is jang sung ho";
String str2="C:\\Program Files\\Borland\\CBuilder6\\Bin\\bcb.exe";
PathCompactPathEx(szShortPath, str2.c_str(), 28,0);
ShowMessage(szShortPath); //결과 = "C:\Program Files...\bcb.exe"
PathCompactPathEx(szShortPath, str1.c_str(), 20,1);
ShowMessage(szShortPath); //결과 = "my name is jang ..."
}
정리하면
1. 직접 Draw하시는 경우라면 임프님이 소개한 DrawTextEx 함수를 쓰면 될것 같구요
2. 그냥 string을 가져오려면 StrToFitStr 나 PathCompactPath 함수를 쓰시면 될듯 합니다.
그럼
박지훈.임프 님이 쓰신 글 :
: 원하시는 기능의 함수로는 VCL에서는 MinimizeName()이라는 함수가 있는데..
: 이 함수는 정확하게는 아무 문자열이나 쓰기 위한 것이 아니라 길쭉한 파일 경로명만을 위한 함수이기 때문에, 적절하지는 않습니다. 실제로 써보시면, 비슷하게는 동작하지만 뭔가 좀 이상할 겁니다.
:
: 그 목적에 딱 맞는 함수는 Win32 함수중의 DrawTextEx() 함수입니다.
: 이 함수는 원래는 단순히 문자열을 지정한 Rect 영역에 그리기 위한 함수인데, DWORD 타입인 마지막 인자에 DT_END_ELLIPSIS와 DT_MODIFYSTRING 값을 넣어주면 원하시는 것처럼 문자열이 지정 Rect 영역을 벗어나는 뒷부분을 줄임표시(...)로 대체해서 줄여줍니다.
:
: 그럼...
:
:
: skjoon 님이 쓰신 글 :
: : 첨부한 그림은 윈도우 탐색기의 일부를 캡쳐한 것인데요.
: : 텍스트가 지정된 Width를 넘어서면 뒷부분을 자르고 "..."을 붙여서 텍스트가 줄여짐을 나타내줍니다.
: : 혹시 vcl이나 윈도우 api 중에서 이 기능을 해주는 녀석이 있는지 궁금하네요.
: : 만들려고 하다가.. 먼저 찾아보고 쓰려구요 ^^;;
: :
: : 좋은 하루 되세요~