조만간에... ^^;

국내의 열악한 개발 환경에 치를 떨다가...
와 같은 것은 아니고...
인생 머 있나요...
한번 사는 거... 딴데선 어케 사는지 구경도 할겸...
지금까지 먹고 살아왔던 기술을 버리고,
새론 기술을 배우고 싶어서 갑니다.
라고 이야기는 합니다만,
실제로 어떻게 될지는 아무도 모르지요. ^^;
그것이 궁금해서 갑니다.

조만간에 소식 올립져. ^^;

굉장히 좋은 글귀이다.

나도 그리 되도록 해봐야지...풀팔팔팔

죽인다~
신한은행 프로리그 2007
[CJ vs 공군] 1 경기
임요환 T vs 마재윤 Z 의 대결
솔직히 믿어지지 않는다...
좌우지당간, 군인은 군인이다.
G.I 요환.
임요환이 승을 했을 때 나왔던 음악.
MC sniper 4집의 Better Than Yesterday.... 헐~
함 들어보라... 막상 들어보니... 죽음이다... ^^;

사용자 삽입 이미지    


[ROOM9]


나 선적 없던 저 무댄 그래
풋내기 나의 목적 견적 없는 삶은 오기로
시적 rhyme을 출력
출생 출신 2bz 삶에 깊게 새긴 이력
노력과 실력 협력 인내력이 슬로건
난 눈먼 장님이라 오직 한길로만 걸어
걱정 아닌 격정 결정적 삶의 여정
내 설정은 열정 뜨건 심장이
날 대변 시련 비련 미련도 날 멈출 수가 없어
좀더 나답게 사납게 남과 다른 우리답게
거침없이 거칠게
현실에 맞서 싸우네 온실 속
너와는 다르게 허울의 실타래 속
이 세상관 정반대
나 향하리 혹 사막 위 큰 오아시스 찾기처럼
보이지 않는 길이라도 두려움은 없으니
난 발하리 또 날으리 내 무대위에 올라서
내 숨과 꿈 작은 혼과 땀을 남김없이 태우리


[Zenio7]

아직 눈을 덜 뜬 자아 세상이라는 바다
그 속 몸을 낮춘 갓 난 창조물중에 하나
길 잃은 전략가 등 뒤를 보인 격투가
지난 19년 걸어온 나의 모습 같아
그렇게 걸었어 난 길 잃은 이방
낯선 자 자신을 찾기 위한 시험의 낙선자
핑계 속 몸을 숨긴 바람 앞에 고
개 숙인 용기를 잃고 등져버린
내 바램의 배신자
나 이제 두발 딛고 세상 향해 걸어가
이 가슴으로 원했던 것 내 의지를 걸어가
목적을 향한 쇄도 세상에 원안
괴도 그 속에 몸을 싣고 그 무엇도 꺽는다
2S신에 선택 누구도 절대 막지마
2bz에 맘에 선택 경고를 울려 마지막
어제를 등졌대도 어제를 다시 원한대도
나 새로운 발을 딛고 내일을 향해 걷는다


[TakTak36]

since 1983 날 녹인 내 신센 긴급 상황
그래 난 쉴 세 없이 뛰었지만
무자비 했던 많은 날이 내 귀를 스쳐
가늘은 내 팔을 겨눠
내안에 얼어붙은 언어를 녹여내어
정면으로 맞섰고
의욕만 앞선 내게 현실이 욕만 앞서도
기어코 역경들을 발판삼아 나는
어제보다 더 나은 오늘을 다짐해
코 묻은 연습장속에 내한의 잉크색을 더 짙게
yeah 2bz 투지 속에 난 꿈을 꿨지
내 심장 박동 소리에 작두를 탔지
세상의 난시에 내 모습과
내 시가 먹구름에 드리워도
난 절대 태양이 날 바라보고 있음에
의심한적 없어
yo! 이 확성기로 악써보네
더 빡세게 나 낙서들을 다 싹쓰리 한 후
당신의 가슴 안에 외쳐
이 썩은 물의 흐름을 증명하여
나는 내일도 악역이다 높은 곳으로 higher


[DJR2]

yeah~ king of dj DJ R2 2bz 절대 멈추지 않아
마지막 고지에 깃발을 꽂아 never don`t stop
스나이퍼, BK, ROOM9, 배치기, Outsider, K.T.C.OB Let`s get it on~


[BK]

가식과 겉멋뿐인 껍데기
이미 지나버린 시기 패기는 사라져버린 준비되지 않은 시인
그렇게 기회는 아무 상관없는 듯
날 맴돌며 날 흔들고 있었지
무너지는 나를 막기 위해
공사판을 전전하던 그때 화려한 조명아래
밝게 빛나던 형제를 위해
거칠어진 손으로 힘껏 난 박수를 쳤네
이젠 어제보단 나을 거라는 믿음에
떠오르는 오늘을 보며 내손에 펜을 꽉 쥐고
병든 팔을 도려내 죽을듯한 고통은
얼룩진 추억으로 견뎌내 이를 악물고
내안에 전쟁 이겨내 나를 위해 보다
냉정하게 절대 쓰러질 순 없기에
어제의 상처는 오늘의 기쁨으로 발전해
멈출 순 없네 보다 나은 내일을 위해


[Outsider]

나는 순수혈통 전투민족의 마지막 생존자
100% 고집불통 내 길을 걷는 삶의 개척자
아무리 죽고 싶어도 죽지 못하는 생은
죽음의 고비를 넘기면
언제나 자신을 몇 배로 단단히 성장시켜. 자!
미래로 향하는 열쇠를 짊어진
내 눈과 두 귀는 변함없이
나를 높은 곳으로 이끌어가
나비처럼 날아서 벌처럼 쏴
난 끝없이 고개를 숙여!
인내와 노력을 가슴에 새겨
고통은 성장의 밑거름 난 언제나 자신을 믿거든!
굶주림으로 한길만을 바라보고
달려왔던 지난날을 되새기며
끊임없이 노래하는 어제보다 발전하는
내일처럼 빛을 향해 미친 듯이 달려가다
쓰러지면 어때 부러지면 어때
구겨지면 어때 뭐 때문에 망설이니
무너지면 어때
날을 갈아 거침없이 칼을 뽑아
다가오는 적을 향해 목을 베고
확실하게 숨을 끊어라!
내 적이라면 칼을 맞대 형제라면 살을 맞대
너 아니면 내가 죽고
나 아니면 니가 죽는 빌어먹을 전쟁은
파도와도 같아
박차고 일어나서 갈 때 까지 가는 거야
떠나려면 떠나가라
있는 힘껏 밀어붙여
머리부터 뼛속까지 계속해서 소리 질러 아!
오늘부터 내 이름을 가슴속에 되새기거라!


[MC SNIPER]

충청북도 제천 꼬맹이 나는 전투개미
깡다구에 불알 두 쪽뿐인 난 칼든 맹인
하루를 벌어 하루를 살던
나의 어제는 비틀거리는 팽이
인생이 젖동냥 걸인과 같아
위태위태 혼수상태 저기 발끝 밑에
라면 한봉에 하루를 살던 그때
습기 가득한 지하 방에서
훗날을 도모한 나는 증오와 분노와
깊은 밤을 함께 했네 꿈을 이루기 위해
기회는 누구에게나 다가온다
얼마나 절실하니?
너의 꿈과 미래를 위해 무엇을 포기했니?
패기와 용기 어금니 꽉 문
너의 오기는 대체 네 삶 어디에 투자됐니?
batter than yesterday
필요하다면 자지 않고 필요하다면
쓰지 않으며 게릴라전의 게바라처럼
욕심과 사심에 총을 겨누며
나 초년의 꿈을 위해 달림에 여념이 없네
여기서 멈추지 않고 끊임없이 달려
달리고 달려 지쳐 쓰려져
모든 걸 잃어 빌어먹어도 후회할일은 없다
세계의 지붕 에베레스트를 정복하듯
올라 2bz의 4번타자 스나이퍼의 도약
독약을 거침없이 마시는 줄리엣
그녀와 같은 사람이 많아 나의 주위엔
어제보다 나은 오늘 좀 더 나은 미래를 위해
회계하는 창녀마냥 마녀사냥을 떠나

yeah~ 2bz follow me now
우리가 왜 우리냐 How bad do you want it?
탁탁36! "내한의 시를 써",
BK "2BZ의 투지",
ROOM9 "내 숨과 꿈을 다 실어",
Outsider "우리는 변함없이 믿음으로 맏서 싸워"
Zenio7 "이건 마지막 경고",
K.T.C.OB "King of DJ"
SNIPER SOUND!! SNIPER SOUND!!


1년이 3년 같으면 좋겠다...라는 생각을 해본다.
하는 짓도 없는데 나이만 먹는구나....
아~배부르다~

앗...^^; 므흣...
그래도 10분 후면 퇴근할거다~~~~~

식사부터 하세요~ 풀팔팔팔

우리가 윈도 플밍을 할 때, 종종 사용하는 Shell 관련 함수들 중에서 폴더만 선택하게 하는 SHBrowseForFolder()이라는 함수가 있슴다..

주로 아래와 같이 사용을 합니다.
CString SelectFolder(HWND hWnd, TCHAR* pszInitPath)
{
     CString  strFolder = _T("");
     ITEMIDLIST* pidlBrowse;
     TCHAR  achPath[MAX_PATH];
     BROWSEINFO brInfo;

     if (pszInitPath && *pszInitPath)
        strcpy(achPath, pszInitPath);

     memset(&brInfo, 0x00, sizeof(BROWSEINFO));
     wcscpy(achPath, _T("풀팔팔팔. 폴더 선택하삼 ^^a"));

     brInfo.hwndOwner  = hWnd;
     brInfo.pidlRoot   = NULL;
     brInfo.pszDisplayName = achPath;
     brInfo.lpszTitle  = achPath;
     brInfo.ulFlags   = BIF_RETURNONLYFSDIRS;
     brInfo.lpfn    = NULL;
     pidlBrowse    = ::SHBrowseForFolder( &brInfo );

     if(pidlBrowse != NULL) {
          SHGetPathFromIDList( pidlBrowse, achPath );

          // pszPathname에 선택한 폴더가 들어있습니다.
         strFolder = achPath;
      }

     return strFolder;
}

이러한 코드를 주면 아래의 다이얼로그를 만날 수 있습니다.

사용자 삽입 이미지

여러분이 위의 코드로 했을 때 만나는 다이얼로그 ^^a


그런데,
조기 조 화면이 그닥 맘에 안들지요... 맞습니다.
누구도 그럴 거에요...
'풀팔팔팔. 폴더 선택하삼 ^^a' 이거 빼고 싶지요...
풀팔팔팔이 모야.. 도대체... 저기에 글이 왜 들어갓..? 이런 생각이 듭니다.
그렇다고 글을 빼면 저 공간이 훵해집니다.
'다시 글을 넣을까...' 이런 고민을 하게 됩니다...
아~ 나는 새폴더 만들기... 라는 버튼이 있슴 얼마나 좋을까... 이런 생각도 할 겁니다.

먼가 좋은 방법이 없을까요.... ^^; 있습니다.
바로 인자로 사용되는 BROWSEINFO.lpfn를 이용하는 방법입니다.

MSDN을 잘 살펴보면
(참조 : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/browseinfo.asp)
lpfn에 CALLBACK 을 하나 넣어 줄 수 있습니다.

형식은 아래의 코드를 참조 하시면 됩니다.

CString SelectFolder(HWND hWnd, TCHAR* pszInitPath)
{
     CString  strFolder = _T("");
     ITEMIDLIST* pidlBrowse;
     TCHAR  achPath[MAX_PATH];
     BROWSEINFO brInfo;

     if (pszInitPath && *pszInitPath)
        strcpy(achPath, pszInitPath);

     memset(&brInfo, 0x00, sizeof(BROWSEINFO));
     wcscpy(achPath, _T("풀팔팔팔. 폴더 선택하삼 ^^a"));

     brInfo.hwndOwner  = hWnd;
     brInfo.pidlRoot   = NULL;
     brInfo.pszDisplayName = achPath;
     brInfo.lpszTitle  = _T("");
     brInfo.ulFlags   = BIF_NEWDIALOGSTYLE|BIF_RETURNONLYFSDIRS|BIF_DONTGOBELOWDOMAIN;
     brInfo.lpfn    = BrowseCallbackProc;
     pidlBrowse    = ::SHBrowseForFolder( &brInfo );

     if(pidlBrowse != NULL) {
          SHGetPathFromIDList( pidlBrowse, achPath );

          // pszPathname에 선택한 폴더가 들어있습니다.
         strFolder = achPath;
      }

     return strFolder;
}

다음은 CALLBACK 함수 입니다.

int CALLBACK BrowseCallbackProc(HWND hwnd,
        UINT uMsg,
        LPARAM lParam,
        LPARAM lpData)
{
 switch (uMsg) {
 case BFFM_INITIALIZED :
  {
   // 해당 Control ID는 shell32.dll version 5.0 이상에서 사용된다.
   // 하위 버전에서는 현재 tree control이 id가 다르며
   // 새폴더 버튼을 생성할 수 없다.
   HWND hShell = GetDlgItem(hwnd, 0);  // 0x00000000(Shell Class)
   HWND hTree = GetDlgItem(hShell, 100); // 0x00000064(Tree Control)
   HWND hNew = GetDlgItem(hwnd, 14150); // 0x00003746(New Folder Button)
   HWND hOK = GetDlgItem(hwnd, 1);  // 0x00000001(OK Button)
   HWND hCancel= GetDlgItem(hwnd, 2);  // 0x00000002(Cancel Button)
   HWND hStatic= GetDlgItem(hwnd, 14146); // 0x00003742(Static Control)

   // 하나라도 못가져오면 기본 구성으로 처리한다.
   if (!hShell || !hTree || !hNew || !hOK || !hCancel)
    return 0;

   // 상단 표시줄 삭제
   if (hStatic) {
    EnableWindow(hStatic, FALSE);
    ShowWindow(hStatic, SW_HIDE);
   }

   CRect rectWnd;
   CRect rectNew;
   CRect rectOK;
   CRect rectCancel;
   GetClientRect(hwnd, &rectWnd);
   GetClientRect(hNew, &rectNew);
   GetClientRect(hOK, &rectOK);
   GetClientRect(hCancel, &rectCancel);

   // Tree 크기조정
   // Tree를 가지는 shell의 크기조정
   MoveWindow(hShell,
        rectWnd.left+10,
        rectWnd.top+10,
        rectWnd.Width()-22, // 20이지만 실제로 보면 작아 보인다. 따라서 2를 추가로 빼준다.
        rectWnd.Height()-rectNew.Height()-30,
        TRUE);
   // 새 폴더 Button 변경
   MoveWindow(hNew,
        rectWnd.left+10,
        rectWnd.bottom-rectNew.Height()-10,
        rectNew.Width(),
        rectNew.Height(),
        TRUE);
   // 확인 Button
   MoveWindow(hOK,
        rectWnd.right-10-rectCancel.Width()-5-rectOK.Width(),
        rectWnd.bottom-rectOK.Height()-10,
        rectOK.Width(),
        rectOK.Height(),
        TRUE);
   // 취소 Button
   MoveWindow(hCancel,
        rectWnd.right-10-rectCancel.Width(),
        rectWnd.bottom-rectCancel.Height()-10,
        rectCancel.Width(),
        rectCancel.Height(),
        TRUE);
  }
  break;
 case BFFM_SELCHANGED :
 case BFFM_VALIDATEFAILED :
  break;
 }
 return 0;
}

이와 같이 하면 나타나는 컨트롤의 위치를 변경시켜 자신이 원하는 UI를 나타낼 수 있습니다.

자! 이제 변한 그림을 보여드리겠슴다...
위와 같은 코드를 해주면 아래와 같은 다이얼로그를 만날 수 있습니다.
안녕.. 반가워 다이얼로그.. ^^; 난 풀팔이야...

사용자 삽입 이미지

여러분이 UI 변경 코드로 했을 때 만나는 다이얼로그 ^^a


자~ 어떻습니까? ^^; 함 바까보삼.. 풀팔팔팔..
아... 중요한 건, 저녀석은 shell32.dll의 버전에 따라서 지원되는 옵션이 틀립니다.
현재의 그림은 5.0 이상 버전을 기준으로 했으며,
버전에 따라서는 저 control들의 id가 틀린 것도 있으니까 주의해야 겠죠? ^^;
요즘 뜨고 있다는 티스토리다.
풀팔팔팔

+ Recent posts