C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[53795] Re:Re:[질문]스트링 줄이기(?)
장성호 [nasilso] 1823 읽음    2008-06-27 11:53
질문 올라왔을때 혹시 관련함수가 있나 찾아봤는데 안나와서
직접 만들어 봤었습니다.

//함수 
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 중에서 이 기능을 해주는 녀석이 있는지 궁금하네요.
: : 만들려고 하다가.. 먼저 찾아보고 쓰려구요 ^^;;
: :
: : 좋은 하루 되세요~

+ -

관련 글 리스트
53777 [질문]스트링 줄이기(?) skjoon 1219 2008/06/26
53789     Re:[질문]스트링 줄이기(?) 박지훈.임프 1716 2008/06/27
53795         Re:Re:[질문]스트링 줄이기(?) 장성호 1823 2008/06/27
53797             Re:Re:Re:위 두 분 답변 감사드립니다. ^^ skjoon 1469 2008/06/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.