2003. 10. 16. 16:19

너~무

OldPapers/gallery 2003. 10. 16. 16:19
이제 카메라에 너무 미련갖지마..

어차피 잃어버려서 찾을수 없는거자나??

그거땜에..신경쓰고 그럼 형아 한테만 도움 안되고 그러니깐

잊을건 잊고..기분좋게..할건 하고살아야지..

그것땜에 다른일 못하면 형아만 손해니깐..

오늘은 시험이 없어서..컴터하다가 그냥 들어와봤어..

어제 문자 보냈는데 시험 잘봤나??

난 어제께 별로..ㅋㅋ첫째날이랑 둘째날은 한과목씩 거의 다 맞았는데

이번에도 장학금은 힘들듯..ㅋㅋ

아직 모르는게 넘 많아서..

누나는 시험 너무 잘봤다그러던데..

나중엔 꼭 셋이서 장학금 타자고!!
2003. 7. 22. 00:28

in freezing.....

OldPapers/gallery 2003. 7. 22. 00:28
3개월째.

이곳은 얼어있다.

숨소리마져 집어삼킬듯

침묵을 가진한채

참을수 없을 정도로...


왜냐하면 여기를 채우던

자그마한 추억들이 더이상 채워지지 않기 때문이다.

잃어버린 나의 카메라와 함께..

정말 인정하기 싫은 현실과 함께..
2003. 7. 21. 06:28

history

OldPapers/History 2003. 7. 21. 06:28

추억은 아름답다....

그래서 간직할 필요가 있다.....
2003. 7. 20. 21:05
아 얼어붙어 버렸따..

어쨋든 당분간 사진을 찍지 못하게 되었으니..
(이게 무슨 변고였는지..ㅜ.ㅜ)

어쨋든..

간만에 오랜 휴식 기간이 되려나.....
2003. 7. 5. 16:28
아무것도 보이지 않는다.
무엇인가 나는.
온몸을 감싸고 도는 이 감정은
처음으로 주체하기 힘들어 보인다.
강하지는 않다.
내 모든 감각 기관을 자극하는 이것은
나를 무너뜨릴 수는 없다.
하지만 나는 떨쳐낼 수가 없다....
무엇일까...

수많은 갈등과 혼란, 슬픔
사랑, 그리움
고독, 친구

그리고 진실

차라리 내가 몰랐으면 좋았을런지도...

가슴이 저며온다.
가슴끝이 시리고 아프다.

이건 용기도 아니다.
그렇다고 의리도 아니다.
그렇다고 사랑도 아니다.

그무엇도 아니다.
수많은 감정들이 뒤섞여
나를 에워싸고 있다.....

두렵진 않다.

하지만 말로 표현할 수 없는
이 감정들을 주체하기 힘들다..

슬프다...그립다..
보고싶다.....
가고싶다.
기억하고 싶다.

진실은 어디에 있을까...

당황스럽다.

나는 이런 감정들에 익숙하지 못하다.

내스스로 부정하거나 외면해서 일까.

아니면 내가 버린 죄일까........

이제사 되찾은 나에게

너무나도 가혹한....

아직도 혼미한 정신 속에는
나와 그 익숙하지 않은
감정만이 다시 살아나

내 몸을 에워싸고 있다.

슬프다.
그립다.
보고싶다.
가고 싶다.

하지만 갈수 없다.
볼수 없다.

가고 싶어 갈등해도
소용없고

그리워 하여 슬퍼도
내눈에는 있으되 안으로 들어오지는 않는다.

진실로 보는 눈이 있어도
소용이 없다.

진실은 나를 더욱더
더욱더
혼란스럽게 한다.

처음으로
행복하고 싶다.
2003. 6. 19. 23:58
위저드에서 생성된 두개의 생   성자에 아래 코드를 추가하십시오...

  

    m_psh.dwFlags |= PSH_NOAPPLYNOW;    // 적용버튼 없애기

    m_psh.dwFlags &= ~PSH_HASHELP;        // 프로퍼티시트의 헬프버튼 없애기



    m_Page1.m_psp.dwFlags &= ~PSP_HASHELP;    // 이건 시트 위의 페이지마다 하셔야합니다

    m_Page2.m_psp.dwFlags &= ~PSP_HASHELP;

2003. 6. 19. 23:56
CPropertySheet에 맴버 함수로 BOOL ExitCheck()를 만들어줍니다.



각각 Page에 OnQueryCancel() 함수에서 부모에 ExitCheck함수를 불러 메시지 박스를 띄워주고

종료하시겠습니까?? 에서.......종료한다면..... return TRUE, 종료하시 않겠다면 return FALSE를 해주면 됩니다..



예제)



BOOL CSheetPropertySheet::ExitCheck()

{

    if ( AfxMessageBox("종료하시겠습니까?", MB_YESNO|MB_ICONQUESTION) == IDYES )

        return TRUE;

    else

        return FALSE;

}



BOOL CPropertyPage::OnQueryCancel()

{

    if( ((CSheetPropertySheet*)GetParent())->ExitCheck() )

        return CPropertyPage::OnQueryCancel();

    else

        return FALSE;

}



이렇게 하면 되지요.
2003. 6. 19. 20:46
안녕하세요?
김태인입니다. (이름 말한다고 누가 아나 ㅡ_ㅡ)

김윤환(alf76)님의 요청으로 꼴에 강좌도 하게됐습니다 ㅡ_ㅡ

다이얼로그에 관련된 또는 Document-View 방식의 스킨 씌우는 방법이
참 많죠? 근대 저는 그거 예제들 보면 솔직히 뭔 소린지 모르겠더군요 ㅡ_ㅡ

또한 최근에 나오는 소규모 어플리케이션들(메신저, 간단한 온라인 게임등)을 보면
다 스킨이 씌워져있죠...

그것에 관한 강좌를 간단히 하겠습니다.

최근에 MS 에서 Media Player 7.0 SDK 를 발표하면서 그안에 스킨 기능이 첨가
되었는데...역시 COM 이라서 이쪽에 지식이 없는 사람은 접근하기도 힘들죠...(저도 지식이 없어서 ㅡ_ㅡ)

그래서 저는 주로 MFC에서 모든걸 처리를 하는데...
MFC 기반의 제가 사용하는 법(?)의 스킨을 알려드릴께여...

스킨 = 그림, 스킨에 있는 클릭 가능한(?) 그림 = 이미지 버튼 이라고 생각하면 좋습니다.

예제를 보면서 설명하겠습니다.

void CMyDialog::OnPaint()
{
    CPaintDC dc(this);
    CDC MemDC;
    MemDC.CreateCompatibleDC(&dc);
    CBitmap bitmap;
    BITMAP bm;
    bitmap.LoadBitmap(IDB_BACKGROUND);
    bitmap.GetBitmap(&bm);
    CBitmap* pOld = dc.SelectObject(&bitmap);
    dc.BitBlt(0, 0, bm.bmWidth, bm.Height, &MemDC, 0, 0, SRCCOPY);
    dc.SelectObject(pOld);
    MemDC.DeleteDC();
}

스킨을 씌우고자 하는 다이얼로그의 OnPaint 이벤트 안에 위의 코드를 추가합니다.
저기서 IDB_BACKGROUND 는 이미지 파일 리소스인데...백그라운드로 쓸이미지를
리소스에 추가하면 됩니다.

위의 소스는 보시면 알겠지만 단순히 그림을 다이얼로그에 출력을 합니다.
그리고 그 그림에 쓸 이미지 버튼들을 만들어야 하는데...
CBitmapButton 이라는 클래스로 만들면 됩니다.

다이얼로그 헤더에 사용할 버튼을 선언합니다.

public:
    CBitmapButton click;

void CMyDialog::OnInitDialog()
{
    click.Create(NULL, BS_OWNERDRAW | WS_VISIBLE | WS_CHILD, CRect(114, 320, 180, 360), this,
2001);
    click.LoadBitmaps(IDB_BITBUTTON);
    click.SizeToContent();
}

위의 코드는 비트맵 버튼을 만드는데 IDB_BITBUTTON 이라는 이미지를 사용한다는 뜻입니다.
SizeToContent() 함수는 버튼을 그 이미지 크기만큼 자동으로 조정해줍니다.
그리고 버튼 Create 시에 BS_OWNERDRAW 속성이 있어야 비트맵 버튼으로 생성이 됩니다.
그 버튼에 ON_BN_CLICKED 이벤트만 추가해 주면 되겠죠?
그럼 클릭이 생기죠....

별거 아니죠?

이게 전부입니다.

정리를 하자면...
OnPaint() 에서 그 백그라운드에 쓸 이미지를 불러서 걍 뿌려줍니다.
그리고 OnInitDialog 에서는 비트맵 버튼으로 사용할 버튼을 쭉 만들어서 로딩하면 되고
그 버튼에 대한 이벤트만 추가한 후 처리를 하면 됩니다.
아주아주 간단하죠?
더 간단한 방법이 있을지 모르겠지만 ㅡ_ㅡ
위의 방법이 제가 주로 사용하는 다이얼로그에서의 스킨 방법입니다.


냠...별거 아니었나여 ㅡ_ㅡ
그래도 DevChip 좀 눌러줘여 ^^;
그럼 즐푸하세여~
2003. 6. 19. 20:44
몇일전에 질문란에 질문으로 올라왔던 에디트 컨트롤에서 ReadOnly 시켰을때 글자가 잘안보인다고,

에디트 컨트롤에 배경색을 좀 바꿨으면 한다는 글을 읽었었는데..

그때 좀 바빠서 답변을 못했었는데, 혹시라도 지금도 찾고 계실까봐 팁란에 올립니다.


다이얼로그 박스 안에 여러개의 에디트 컨트롤이 있는데...

오직 한개의 컨트롤에 다른 컨트롤과 다른 색상을 주고 싶을때...

이것을 어떻게 구현해야 할까요??

간단합니다. 아래의 예를 보시죠.. ^^;

[일반적인 예]

먼저 들어가기에 앞서.. m_Brush 즉 브러쉬를 검은색으로 잡았다고 가정하고...

ClassWizard를 이용하여, WM_CTLCOLOR 메시지에 대한 Method를 작성합니다.

HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  
CEdit * pEdit = (CEdit *)GetDlgItem(IDC_EDIT_TEST); //에디트 컨트롤의 포인터를 얻음
  
if((nCtlColor == CTLCOLOR_EDIT) && (pEdit->GetSafeHwnd() == pWnd->GetSafeHwnd())) {
  
pDC->SetBkMode(TRANSPARENT); //백그라운드 모드를 설정
  
pDC->SetTextColor(RGB(255,255,255)); //텍스트의 색깔을 흰색으로..
  
return m_Brush; //브러시를 리턴
}

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}

nCtlColor값과 CTLCOLOR_EDIT값이 동일하고,

pEdit->GetSafeHwnd()와 pWnd->GetSafeHwnd()의 핸들이 동일할 경우에

(여기서 포인터를 비교하지 않고 핸들을 비교하는 이유는 포인터는 유동적, 즉 임시적이지만

핸들은 거의 유동적이지 않기 때문입니다.)

텍스트의 색깔을 흰색으로 처리하고 브러쉬 객체를 삭제해 줍니다.


  
[읽기 전용일때]

설정은 위에서와 마찬가지 이고...

HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  
CEdit * pReadOnlyEdit = (CEdit *)GetDlgItem(IDC_EDIT_READONLY); //Read Only 에디트 컨트롤의 포인터
HWND hWndReadOnly = pReadOnlyEdit->GetSafeHwnd();
  
if(nCtlColor == CTLCOLOR_STATIC && hWndReadOnly == pWnd->GetSafeHwnd()) {
  
pDC->SetBkColor(RGB(0,0,0)); //배경색을 브러시와 같은 색깔로 설정
  
pDC->SetTextColor(RGB(255,255,255)); //텍스트의 색깔을 흰색으로....
  
return m_Brush; //브러쉬를 리턴
}
  
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}

백그라운드 모드를 TRANSPARENT로 두지 않고 적당한 컬러로 텍스트의 백 컬러를 설정할수 있습니다.

위에 보인 예에서 처럼요.. ^^;;

팁으로 위장한 팁이었습니다. ^^;
2003. 6. 19. 20:43
// 0. ListControl을 상속한 클래스의 헤더파일에 다음과 같은 함수를 선언해 줍니다.



afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);



// 1. ListControl을 상속한 클래스 CPP파일의  메세지 맵에 다음과 같이 적어줍니다.

ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)



// 2. 메시지 처리함수를 다음과 같이 만듭니다.

void CMyListControl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)

{

LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;



int iRow;

switch(lplvcd->nmcd.dwDrawStage)

{

case CDDS_PREPAINT:

     *pResult = CDRF_NOTIFYITEMDRAW;      

     break;

case CDDS_ITEMPREPAINT:

     *pResult = CDRF_DODEFAULT;

     iRow = lplvcd->nmcd.dwItemSpec;

     lplvcd->clrTextBk = RGB(220, 220, 220);

     lplvcd->clrText = RGB(0, 0, 0);

     break;

default:

     *pResult = CDRF_DODEFAULT;

}

}



// 3. 코드 중간에 보이는 iRow의 값은 현재 그릴 Row의 숫자이고, 그 아랫줄의

// RGB 를 편집하면, 각 Row 마다 각각 다른 글자색과 배경색을 가지고 ListControl을

// 만들수 있습니다.