이것보다 더 좋은 ListCtrl 사용법은 없을 듯 싶네요!!

1. 리스트컨트롤 추가 

2. 멤버변수 추가 
m_list 

3. 체크박스 레이아웃 
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES ); 

4. 초기화 
m_list.DeleteAllItems(); 

5. 칼럼명 설정 
m_list.InsertColumn(0, _T("번호"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(1, _T("제목"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(2, _T("작성자"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(3, _T("코멘트"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(4, _T("파일"), LVCFMT_LEFT, 100, -1); 
//칼럼 추가 인덱스, 칼람명, 정렬방향, 칼럼길이, 서브아이템 갯수 

6. 데이터 추가 
int seq = 0; 
CString seq_string; 
seq_string.Format(_T("%d"),seq); 
CString title=_T("test"); 
CString writer=_T("이대한"); 
CString comment=_T("없음"); 
CString file=_T("파일경로"); 

m_list.InsertItem(seq,seq_string); 
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL); 
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL); 
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL); 
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL); 

seq = 1; 
seq_string.Format(_T("%d"),seq); 
title=_T("test2"); 
writer=_T("이대한2"); 
comment=_T("있음"); 
file=_T("파일경로"); 

m_list.InsertItem(seq,seq_string); 
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL); 
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL); 
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL); 
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL); 


7. 아이템 선택(1개 이상 선택 및 확인) 
POSITION pos = m_list.GetFirstSelectedItemPosition(); 

if (pos == NULL) 
AfxMessageBox(_T("No items were selected!\n")); 
else 
{ 
while (pos) 
{ 
int nItem = m_list.GetNextSelectedItem(pos); 
CString temp = m_list.GetItemText(nItem,0); 
temp.Format(_T("%s seq가 선택됨"),temp); 
AfxMessageBox(temp); 


// you could do your own processing on nItem here 
} 
} 


8. 체크박스 전체 체크 
int nCount=m_list.GetItemCount(); 
for(int i = 0; i< nCount;i++) 
m_list.SetCheck(i); 

9. 체크박스 전체 해제 
//헤더파일에 
#ifdef ListView_SetCheckState 
#define ListView_SetCheckState(hwndLV,i,fCheck) \ 
ListView_SetItemState(hwndLV,i, \ 
INDEXTOSTATEIMAGEMASK((fCheck)+1),LVIS_STATEIMAGEMASK) 
#endif 

//소스파일에 
CListCtrl* tmp; 
tmp=&m_list; 
int nCount=m_list.GetItemCount(); 
for(int i = 0; i< nCount;i++) 
ListView_SetCheckState(tmp->GetSafeHwnd(),i,FALSE); 

10. 체크 확인(1개 이상) 
int nCount=m_list.GetItemCount(); 
for(int i =0 ; i
{ 
BOOL a = m_list.GetCheck(i); 
if(a==TRUE) 
{ 
CString temp = m_list.GetItemText(i,0); 
temp.Format(_T("%s seq가 선택됨"),temp); 
AfxMessageBox(temp); 
} 
} 



11. 데이터 삽입 
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. 
int seq = 0; 
CString seq_string; 
seq_string.Format(_T("%d"),seq); 
CString title=_T("test"); 
CString writer=_T("이대한"); 
CString comment=_T("없음"); 
CString file=_T("파일경로"); 

m_list.InsertItem(seq,seq_string); 
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL); 
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL); 
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL); 
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL); 


12. 데이터 삭제 
POSITION pos = m_list.GetFirstSelectedItemPosition(); 

if (pos == NULL) 
AfxMessageBox(_T("No items were selected!\n")); 
else 
{ 
while (pos) 
{ 
int nItem = m_list.GetNextSelectedItem(pos); 
CString temp = m_list.GetItemText(nItem,0); 
temp.Format(_T("%s seq가 삭제됨"),temp); 
AfxMessageBox(temp); 
m_list.DeleteItem(nItem); 
// you could do your own processing on nItem here 
} 
} 

'NativeCode > mfc' 카테고리의 다른 글

MySQL C++, MFC에서 사용하기  (0) 2010.06.17
CDC 글 쓰기  (0) 2010.03.18
Font 바꾸기  (0) 2010.03.18
CFile  (0) 2010.03.18
Modal Vs Modless  (0) 2010.03.18

안녕하세요. 오랜만의 블로깅입니다. 이제 부지런히 해야겠어요.ㅋㅋ

이놈의 게으름… 귀차니즘….

 

오늘의 주제는 MySql을 C++이나 MFC에서 사용하기 입니다.

Visual Studio를 깔면 자동으로 MSSQL이 설치됩니다. 이것을 C++, MFC에서 사용할 수 있죠.

하지만 전 개인적으로 MySql, SQLite같은 것들을 더 좋아합니다. ㅋㅋ

 

설치법은 굉장히 간단하니 한번 시작해 보도록 할게요.

 

http://www.mysql.com/ 에 들어 가시면 Downloads 탭이 있습니다.


 

들어가셔서 Community Server 버전을 다운 받으세요.


 

플랫폼은 Windows 버전으로 다운 받으세요.

 

다운을 다 받은 후 실행하면 설치 옵션이 있는데 그 때 꼭 Custom Setup을 선택하세요.

그 후 C Include Files / Lib Files 를 선택하세요.

 

 

여기까지 하시면 Library 설치는 다 끝났습니다. 이제 사용만 하면 됩니다.

 

VS의 도구->옵션에 들어가셔서 Library 설정하시면 바로 사용가능합니다.

 

 

저는 위 그림처럼 include와 lib를 설정했습니다.

 

 

이제 예제 소스를 보도록 하죠.

MySql Library는 다음과 같은 순서로 진행됩니다.

mysql_init() -> mysql_real_connect() -> mysql_query() -> mysql_store_result() -> mysql_fetch_row() -> mysql_free_result() -> mysql_close()

다른 DB Library와 비슷한 순서로 진행됨을 알 수 있습니다.

 

 

 

위와 같이 하면 잘 됩니다. ^^

모두들 즐프 하세요!!ㅋㅋ

 

 

 

Bloger: moltak.net

'NativeCode > mfc' 카테고리의 다른 글

D-H,appy :: MFC list control 사용  (2) 2010.07.28
CDC 글 쓰기  (0) 2010.03.18
Font 바꾸기  (0) 2010.03.18
CFile  (0) 2010.03.18
Modal Vs Modless  (0) 2010.03.18

Snap9.bmp Snap8.bmp

'NativeCode > mfc' 카테고리의 다른 글

D-H,appy :: MFC list control 사용  (2) 2010.07.28
MySQL C++, MFC에서 사용하기  (0) 2010.06.17
Font 바꾸기  (0) 2010.03.18
CFile  (0) 2010.03.18
Modal Vs Modless  (0) 2010.03.18

 CFont font;    //CFont object 확보

 font.CreateFont(          // object의 생성
      20,                  // 문자 폭
      20,                  // 문자 높이 
      0,                   // 기울기 각도
      0,                   // 문자 방향
      FW_HEAVY,            // 문자 굵기
      FALSE,               // 문자 기울림 모양
      FALSE,               // 밑 줄
      FALSE,               // 취소선
      DEFAULT_CHARSET,     // 문자 셋
      OUT_DEFAULT_PRECIS,  // 출력 정확도
      CLIP_DEFAULT_PRECIS, // 킬립핑 정확도
      DEFAULT_QUALITY,     // 출력의 질
      DEFAULT_PITCH,       // 자간 거리
      "궁서"               // 문자 모양
   );

 
 pDC->SelectObject(&font);     //pDC에 font 등록

 pDC->SetTextColor(RGB(0,0,255));


 pDC->TextOut(100,200,"청산은 나를 보고 말없이 살라하고");
 pDC->TextOut(100,250,"창공은 나를 보고 티없이 살라하네");
 pDC->TextOut(100,300,"사랑도 벗어놓고 미움도 벗어놓고");
 pDC->TextOut(100,350,"물처럼 바람처럼 살다 가라하네");

 
font.DeleteObject();    //font 삭제

'NativeCode > mfc' 카테고리의 다른 글

MySQL C++, MFC에서 사용하기  (0) 2010.06.17
CDC 글 쓰기  (0) 2010.03.18
CFile  (0) 2010.03.18
Modal Vs Modless  (0) 2010.03.18
Process 강제 종료 막기  (0) 2010.03.18

file.Open( "Data.txt", CFile::modeWrite | CFile::modeCreate | CFile::typeBinary );

file.Write( "BackupData\n", 13 );


for( int i = 0; i < m_FolderBackupList.GetCount(); i ++ )

{

csBuffer = m_FolderBackupList.GetAt( i );

file.Write( csBuffer, csBuffer.GetLength() );

}


file.Write( "ProtectData\n", 14 );

for( int i = 0; i < m_FolderProtectList.GetCount(); i ++ )

{

csBuffer = m_FolderProtectList.GetAt( i );

file.Write( csBuffer, csBuffer.GetLength() );

}


file.Close();

'NativeCode > mfc' 카테고리의 다른 글

CDC 글 쓰기  (0) 2010.03.18
Font 바꾸기  (0) 2010.03.18
Modal Vs Modless  (0) 2010.03.18
Process 강제 종료 막기  (0) 2010.03.18
Dialog 메인 윈도우 색 바꾸기  (0) 2010.03.18


모달

모달리스

생성방법

DoModal

Create

종료방법

EndDialog

DestroyWindow

인스턴스선언

지역변수로선언

동적으로할당

윈도우 SHOW

.ShowWindow( SW_SHOW )

->ShowWindow( SW_SHOW )


'NativeCode > mfc' 카테고리의 다른 글

Font 바꾸기  (0) 2010.03.18
CFile  (0) 2010.03.18
Process 강제 종료 막기  (0) 2010.03.18
Dialog 메인 윈도우 색 바꾸기  (0) 2010.03.18
Dialog 아무데나 누르고 창 이동  (0) 2010.03.18

PreTranslateMessage 함수를 재정의 한다. 그래서 특정 값이 들어 오면 다음 함수를 호출 하지 않고 거기서 종료!! 쉽지?


if(pMsg->message == WM_SYSKEYDOWN )

{

//Alt+F4키면무시(Alt키는 VK_KEYDOWN아니라 VK_SYSKEYDOWN으로알아내야함


if(pMsg->wParam == VK_F4)

{

return TRUE;

}

}


if(pMsg->message == WM_KEYDOWN)

{

if(pMsg->wParam == VK_ESCAPE) return TRUE;

if(pMsg->wParam == VK_RETURN) return TRUE;

}

'NativeCode > mfc' 카테고리의 다른 글

CFile  (0) 2010.03.18
Modal Vs Modless  (0) 2010.03.18
Dialog 메인 윈도우 색 바꾸기  (0) 2010.03.18
Dialog 아무데나 누르고 창 이동  (0) 2010.03.18
Dialog 항상 위  (0) 2010.03.18

CtlColor 이벤트 추가

m_Back.CreateSolidBrush( RGB( 255, 255, 255 ) );

HBRUSH CH7Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

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


// TODO:  여기서 DC의 특성을 변경합니다.

hbr = ( HBRUSH )m_Back;


// TODO:  기본값이 적당하지 않으면 다른 브러시를 반환합니다.

return hbr;

}


'NativeCode > mfc' 카테고리의 다른 글

Modal Vs Modless  (0) 2010.03.18
Process 강제 종료 막기  (0) 2010.03.18
Dialog 아무데나 누르고 창 이동  (0) 2010.03.18
Dialog 항상 위  (0) 2010.03.18
CRichEditCtrl  (0) 2010.03.18

void CH7Dlg::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

CDialog::OnLButtonDown(nFlags, point);

PostMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y ) );

}


void CH7Dlg::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

CDialog::OnLButtonUp(nFlags, point);

PostMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y ) );

}

두 이벤트를 추가하고 PostMessage를 해주면 끝끝

'NativeCode > mfc' 카테고리의 다른 글

Process 강제 종료 막기  (0) 2010.03.18
Dialog 메인 윈도우 색 바꾸기  (0) 2010.03.18
Dialog 항상 위  (0) 2010.03.18
CRichEditCtrl  (0) 2010.03.18
리스트 컨트롤 Column 추가 아이템 추가  (1) 2010.03.18

SetWindowPos( &CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOACTIVATE );

문자열 이어서 넣기


void ChttpDlg::AppendString( const CString str )

{

int nOldLines = 0, nNewLines = 0, nScroll = 0;

long nInsertionPoint = 0;


CHARFORMAT cf;

// Save number of lines before insertion of new text

nOldLines = m_CRichEdit.GetLineCount();

// Initialize character format structure

cf.cbSize = sizeof(CHARFORMAT);

cf.dwMask = CFM_COLOR;

cf.dwEffects = 0; // To disable CFE_AUTOCOLOR

cf.crTextColor = RGB( 0, 0, 0 );


// Set insertion point to end of text

nInsertionPoint = m_CRichEdit.GetWindowTextLength();

m_CRichEdit.SetSel(nInsertionPoint, -1);


// Set the character format

m_CRichEdit.SetSelectionCharFormat(cf);

// Replace selection. Because we have nothing 

// selected, this will simply insert

// the string at the current caret position.

m_CRichEdit.ReplaceSel(str);


// Get new line count

nNewLines = m_CRichEdit.GetLineCount();


// Scroll by the number of lines just inserted

nScroll = nNewLines - nOldLines;

m_CRichEdit.LineScroll(nScroll);

}

CListCtrl 아이템 다 지우기

DeleteAllItems();


Column추가

ListCtrl.InsertColumn( 0, "aaaa", 0, 100 );

ListCtrl.InsertColumn( 1, "bbbb", 0, 100 );

ListCtrl.InsertColumn( 2, "cccc", 0, 100 );


아이템 추가

LVITEM item;

Zeromemory( &item, sizeof( LVITEM ) );

item.iItem = 0;

item.pszText = "aaa";

for( int i = 1; i < 3; i ++ )

{

    ListCtrl.SetItemText( i, j, "다음문자열" );

}                                            


asd.bmp

'NativeCode > mfc' 카테고리의 다른 글

Dialog 항상 위  (0) 2010.03.18
CRichEditCtrl  (0) 2010.03.18
리스트 컨트롤 GridLine 추가하기  (1) 2010.03.18
리스트 컨트롤 값 얻기 & 검색하기  (1) 2010.03.18
리스트 컨트롤 시스템 아이콘 삽입  (0) 2010.03.18

z_AttrList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); 

값 얻기 : m_list.GetText( 1, strFind );

m_list.FindStringExact( -1, "문자열" );

m_List.FindString( -1, "문자열" );


if( m_List.FindString( -1, "문자열" ) != LB_ERR ) // 문자열 찾았을 때


GetNextItem( -1, LVNI_SELECTED ) // 선택한 아이템 번호 얻기



CFileFind cFinder;

SHFILEINFO sfi;

BOOL bWorking;

int index = 0;

HIMAGELIST hImageList;

hImageList = ( HIMAGELIST )SHGetFileInfo( *pFolder, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON );

if( hImageList )

{

  m_imgShareSmall.Attach( hImageList );

}

else

{

::AfxMessageBox( "파일을 갖고 올 수 없습니다." );

return -1;

}


m_CListCtrlFileList.DeleteAllItems();

m_CListCtrlFileList.SetImageList( &m_imgShareSmall, LVSIL_SMALL );

*pFolder += "\\*.*";

bWorking = cFinder.FindFile( *pFolder );


while( bWorking )

{

bWorking = cFinder.FindNextFile();

SHGetFileInfo( cFinder.GetFilePath(), 0, &sfi, sizeof( SHFILEINFO ), 

SHGFI_DISPLAYNAME | SHGFI_TYPENAME | SHGFI_SYSICONINDEX | SHGFI_SMALLICON ); 

m_CListCtrlFileList.InsertItem( index, sfi.szDisplayName, sfi.iIcon );


if( !cFinder.IsDirectory() )

{

m_CListCtrlFileList.SetItemText( index++, 1, "파일" );

}


else

{

m_CListCtrlFileList.SetItemText( index++, 1, "폴더" );

}

}


m_imgShareSmall.Detach();


while (bWorking)

    {

        bWorking = finder.FindNextFile();

        SHGetFileInfo(finder.GetFilePath(), 

            0, 

            &sfi, 

            sizeof(SHFILEINFO), 

            SHGFI_DISPLAYNAME | SHGFI_TYPENAME| SHGFI_SYSICONINDEX | SHGFI_SMALLICON); 

        ndx = AddItem1(finder, sfi, ndx);

    }


 ndx = m_list.InsertItem(ndx, sfi.szDisplayName, sfi.iIcon);

'NativeCode > mfc' 카테고리의 다른 글

리스트 컨트롤 값 얻기 & 검색하기  (1) 2010.03.18
리스트 컨트롤 시스템 아이콘 삽입  (0) 2010.03.18
리스트 컨트롤 색상 다루기  (1) 2010.03.18
CTRL 값 얻기  (0) 2010.03.18
배경 그림 넣기  (0) 2010.03.18

[MFC 컨트롤] 리스트 컨트롤 색상 다루기

간단하지만 복잡하기도한 리스트 컨트롤 색상 다루기입니다.


칼럼과 행 별로 색상을 컨트롤할 수 있는데요,


일단 코드를 보시면서 말씀드릴게요,


밑의 코드는 제가 프로젝트하던 코드의 일부분입니다 :)


헤더 파일에


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



이렇게 추가해 주시구요,


메시지맵을 등록해야 겠죠,


BEGIN_MESSAGE_MAP 밑에 이렇게 입력해줍니다.


ON_NOTIFY(NM_CUSTOMDRAW, IDC_RESULT/*컨트롤 리소스 ID*/, OnCustomdrawList)


그리고 사용자 함수를 추가해서 코딩해 줍니다.


void CNetManagerView::OnCustomdrawTcpList(NMHDR* pNMHDR, LRESULT* pResult)
{
 CString strProtocol,strRSTFIN;
 BOOL bEmerFlag = FALSE;
 
 NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)pNMHDR;
 
 strProtocol = m_ctrlTCPlist.GetItemText(pLVCD->nmcd.dwItemSpec, 1);
 strRSTFIN = m_ctrlTCPlist.GetItemText(pLVCD->nmcd.dwItemSpec, 9);
 
 if( (strRSTFIN.Find("RST") != -1) || (strRSTFIN.Find("FIN") != -1) )
 {
  bEmerFlag=TRUE;
 }
 
    *pResult = 0;
 
    if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
        *pResult = CDRF_NOTIFYITEMDRAW;
 
    else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
    {
       if( bEmerFlag )        // TCP && 긴급 플래그 일떄
       {
        pLVCD->clrText = RGB(255,102,102);
       }
       pLVCD->clrTextBk = RGB(237,255,255);
  
       if( !bEmerFlag )        // 긴급 플래그가 아닐때
       {
        pLVCD->clrText   = RGB(0, 0, 0);
       }
       *pResult = CDRF_DODEFAULT;
    }
}



프로그램 화면캡쳐의 일부분입니다. 저런식으로 색상을 변경할 수 있습니다.


경우에 따라서 색상을 입히시면 됩니다,


RGB값은 임의로 주시면 되구요, (RGB 색상 표를 참고하세요 )


기본 리스트 컨트롤 배경 색상 및 글자 색상 글자 배경 색상은


API를 제공하고 있습니다.


SetBkColor(), SetTextBkColor() 등을 MSDN을 참고하셔서


사용하시면 됩니다.




[리스트컨트롤-기초05 뽀나스] 리소스 이미지 배경 깔기 & 투명 라벨


OnInitDialog에 추가한 코드는 아래와 같다.

말하자면 전나 쉽다!


    //

    if (!AfxOleInit())

    {

        AfxMessageBox("Unable to initialize OLE.\nTerminating application!");

        return FALSE;

    }


    TCHAR szBuffer[_MAX_PATH];

    VERIFY(::GetModuleFileName(AfxGetInstanceHandle(), szBuffer, _MAX_PATH));

    CString sPath;

    sPath.Format(_T("res://%s/%s/#%d"), szBuffer, _T("JPG"), IDR_JPG1);

    m_list.SetBkImage((LPTSTR)(LPCTSTR)sPath);


    //

    m_list.SetTextBkColor((COLORREF)-1);

    m_list.SetTextColor(GetSysColor(COLOR_3DDKSHADOW));


설명이 필요없다. 걍 보면 안다.




즐감~~!!



listCtrl01.zip




리스트 컨트롤 헤더에 인디케이터 집어넣기

리스트 컨트롤을 사용하다가 보면 컬럼을 클릭했을때 보통 정렬 기능을 구현하게 됩니다.

 정렬기능을 구현해놓고 보면 내림차순인지 오름차순 정렬인지는 사용자가 리스트안에 있는 데이터를 직접 봐야하는데 이것을 시각적으로 표현하기 위해서 보통

 인디케이터를 삽입합니다.  이 기능을 구현하기 위해서 미리 할일은 하나도 없습니다. ^^

 리스트 컨트롤의 어떤 속성도 건드릴 필요없이 바로 몇 줄의 코딩으로 가능합니다.


샘플 코드

다음과 같은 함수를 하나 추가하시고요

void ?????::SetIndicatorOnColumn(int Col)

{

    CHeaderCtrl* pHeader = ????? (리스트컨트롤 이름).GetHeaderCtrl();


    for(int i=0; i<pHeader->GetItemCount(); i++) {

        HDITEM hItem;


        pHeader->GetItem(i, &hItem);


        if(i == Col) {

            hItem.mask = HDI_FORMAT | HDI_BITMAP;

            hItem.fmt |= HDF_BITMAP | HDF_STRING | HDF_BITMAP_ON_RIGHT;

            hItem.hbm = (HBITMAP)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_DOWN), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);

            pHeader->SetItem(i, &hItem);


        }

        else {

            hItem.mask = HDI_FORMAT ;

            hItem.fmt = HDF_STRING;

            hItem.hbm = NULL;

            pHeader->SetItem(i, &hItem);

        }

    }

}


OnColumnClick 함수내에 다음과 같은 코드를 추가합니다.


void ????::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult)

{

    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    

    int Col = pNMListView->iSubItem;

    this->SetIndicatorOnColumn(Col);


    (보통 이곳에는 소트에 관련된 함수를 콜하는 코드가 들어가죠)

   ....

   ....


   *pResult = 0;

}


다음과 같은 것으로 작업은 완성 (단 비트맵 리소스로 IDB_UP 혹은 IDB_DOWN의 이름으로 화살표를 그려주어야 합니다. 크기는 5*10 정도가 적당한거 같군요.)


참고로 comctl32.dll 6.0버젼부터는 HDF_SORTDOWN, HDF_SORTUP 이라는 플래그가 추가 되었습니다.




리스트 뷰 간격 조절


p, td, ul, ol, li { font-size:12px; line-height:140%; margin-top:0; margin-bottom:0; } body { font-size:12px; }

CListCtrl 경우는 멤버중 SetIconSpacing() 함수 사용 하면 될것이고.

리스트뷰 일경우에는 ListView_SetIconSpacing 매크로 사용 하시면 됩니다.


단 리스트의 스타일(간단히, 자세히, 아이콘....)에 따라서 지원이 안될수 도 있습니다..






리스트 컨트롤의 컬럼별로 소트하기


//생성자에서 정/역방향 소팅을 위해
//m_bSort=NULL;
//로 셋팅해주시고
//소트하기위한 정보를 가진 클래스를 하나 만듭니다. 뭐 스트럭쳐로 해도 상관없겠져
//스트럭처로 하시면 public:이부분 없어도 되니..
//생성자와 SORT를 위한 참조 변수도 만들구여
class CSortData{
public:

    CSortData(CString str,DWORD dw);
    ~CSortData(){};

    CString m_strText;
    DWORD m_dw;
    
};

CSortData::CSortData(CString str,DWORD dw)
{
    m_strText=str;
    m_dw=dw;
}

//콜백함수를 정의합니다.
//콜백함수에서 데이터를 비교하고 비교한 값을 리턴합니다.
//lParamSort 인자에는 ASCENDING할것인지 DESCENDING할 것인가하는 정보를 받습니다.

static int CALLBACK MyCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    CSortData *pLc1=(CSortData*)lParam1;
    CSortData *pLc2=(CSortData*)lParam2;
    int nReturn=pLc1->m_strText.Compare(pLc2->m_strText);
    if(lParamSort)
        return nReturn;
    else
        return -nReturn;
}

//리스트 컨트롤 아이템 길이를 구해와서 각각의 아이템에 SetItemData를 이용하여 스트럭처정보를
//넣어줍니다.(나중에 소트하기위해)
//그리고 SortItems함수를 호출하는데 이때 위에서 정의한 콜백함수의 포인터를 인자로 넣어주고
//ASCENDING 혹은 DESCENDING할것인지에 대한 boolean값을 같이 보내어 줍니다.
//그럼 OS가 알아서 콜백함수를 계속 호출해서 비교정보를 받아가겠지여..
//소트가 완료된다음에는 
//동적할당한 CSortData 클래스를 메모리에서 삭제해줍니다.
BOOL CTestDlg::SortData(int nCol,BOOL bSort)
{
    LkListCtrl *pLc=(LkListCtrl*)GetDlgItem(IDC_LIST_DATA);
    int totItems = pLc->GetItemCount();
// Callback Item Setting
    for(int i=0; i<totItems; i++) 
    {
        DWORD dw = pLc->GetItemData(i);
        CString txt = pLc->GetItemText(i, nCol);
        pLc->SetItemData( i, (DWORD) new CSortData(txt,dw) );
    }
    if(m_bSort)
        pLc->SortItems(MyCompare, bSort);
    else
    {
        pLc->SortItems(MyCompare, bSort);
    }
    //    m_bSort=!m_bSort;

    for(i=0; i<totItems; i++)
    {
        CSortData* pItem = (CSortData*)pLc->GetItemData(i);
        ASSERT( pItem );
        pLc->SetItemData(i, pItem->m_dw);
        delete pItem;
    }

    return TRUE;
}

//컬럼해드를 클릭했을때 우리가 정의한 SortData라는 함수를 호출하도록 클래스 위저드를 
//이용하여 통지메세지인 LVN_COLUMNCLICK 를 오버라이딩 합니다. 아니면 직접 코딩하셔도 무방하지여.
//BEGIN_MESSAGE_MAP(CTestDlg,CDialog)
//    ON_NOTIFY(LVN_COLUMNCLICK,IDC_LIST_DATA, OnColumnclickListData)
//END_MESSAGE_MAP()
//일케 직접하셔도 되겠져..

//호출시에 몇번째 컬럼인지에 대한 정보와 정방향소트인지, 역방향 소트인지를 결정지어 보내줍니다.
//여기서는 클릭할때마다 바뀌게 해놨습니다.
void CTestDlg:OnColumnclickListData(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    if(!SortData(pNMListView->iSubItem,m_bSort))
        return ;
    m_bSort=!m_bSort;
    *pResult = 0;
}

//자 이렇게 하고 (리스트컨트롤에 자료가 들어있음을 가정하고)
//컴파일해서 컬럼해드를 클릭하여 보면 정/역방향 소팅이 되는것을 눈으로 확인하실수 있으실겁니다.

//약간이라도 도움이 되시길.
//그리고 혹 잘못된 점이 있으면 꼭 알려주세여~
//명절 잘보내시길~~
likehood@hanmail.net
송영배




몇가지 팁

 1. 특정 ROW 포커스 주기
 2. 특정 ROW로 가기
 3. 헤더 컬럼수 얻어오기
 4. 컬럼의 너비를 이쁘게 주기
 5. 한줄 쭉 선택되게 하기, 그리드 라인 주기
 6. 선택한 아이템(ROW)를 지우기
 7. 두 아이템을 스왑 하기
 8.기존에 선택되어있는 것을 해체하기



 1. 특정 ROW 포커스 주기
---------------------------------------------------
 리스트 컨트롤에서 어떤 특정 Row를 선택하게 하고 싶을때
 ( 이때 선택뿐아니라 포커스도 가야 한다.
 포커스가 간다는 의미는 다음에 키다운을 하면 바로 부드럽게
 다음 아이템을 가리키도록 하는 것이다 )

   ListView_SetItemState (pListCtrl->GetSafeHwnd(),         // handle to listview
                          10,         // index to listview item
                          LVIS_FOCUSED | LVIS_SELECTED, // item state
                          0x000F);   //mask

 위와 같이 코딩하면 된다.


 2. 특정 ROW로 가기
---------------------------------------------------
 만일 원하는 Row를 스크롤을 하던 어떻게 하든 화면에 보이게
 하고 싶을때
 
 pListCtrl->EnsureVisible(15, TRUE);

 이렇게 하면 된다.


 3. 헤더 컬럼수 얻어오기
---------------------------------------------------
 헤더 컬럼의 갯수를 알고 싶을때
    CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
    int nColumnCount = pHeader->GetItemCount();

 또는 pList->GetHeaderCtrl()을 통해서 얻어올수 도 있다.


 4. 컬럼의 너비를 이쁘게 주기
---------------------------------------------------
    공백없이 잘 채워 준다.

부모 다이얼로그의 OnSize에서
void CAttrListDlg::OnSize(UINT nType, int cx, int cy) 
{
    CDialog::OnSize(nType, cx, cy);
    
    // TODO: Add your message handler code here
    if( IsWindow( z_AttrList.m_hWnd ))
    {
        z_AttrList.MoveWindow( 0, 0, cx, cy );
        z_AttrList.SetColumnWidth(1 , LVSCW_AUTOSIZE_USEHEADER);
    }
}


 5. 한줄 쭉 선택되게 하기, 그리드 라인 주기
---------------------------------------------------
 z_AttrList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); 


 6. 선택한 아이템(ROW)를 지우기
---------------------------------------------------

CDWordArray m_anDragIndexes;    // 선택한 아이템을 기억하는
 배열

int    CAttrList::fnRemoveItem()
{

    m_anDragIndexes.RemoveAll();
    POSITION pos = GetFirstSelectedItemPosition();
    while (pos)
    {
        m_anDragIndexes.Add(GetNextSelectedItem(pos));
    }

    int nSize = m_anDragIndexes.GetSize();    
    int nRet = -1;
    if( nSize )
        nRet = m_anDragIndexes[0];    

    while( nSize-- )
        DeleteItem( m_anDragIndexes[nSize] );

    m_anDragIndexes.RemoveAll();
    return nRet;
}


 7. 두 아이템을 스왑 하기
---------------------------------------------------
void CAttrList::fnSwapItem( int nItem1, int nItem2 )
{
    int hi = nItem2;
    int lo = nItem1;
    CStringArray rowText;

    LV_ITEM lvitemlo, lvitemhi;
    CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl();
    int nColCount =pHeaderCtrl->GetItemCount();
            
    rowText.SetSize( nColCount );
    int i;
    for( i=0; i<nColCount; i++)
        rowText[i] = GetItemText(lo, i);
    lvitemlo.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
    lvitemlo.iItem = lo;
    lvitemlo.iSubItem = 0;
    lvitemlo.stateMask = LVIS_CUT | LVIS_DROPHILITED |
        LVIS_FOCUSED | LVIS_SELECTED |
        LVIS_OVERLAYMASK | LVIS_STATEIMAGEMASK;
    
    lvitemhi = lvitemlo;
    lvitemhi.iItem = hi;
    
    GetItem( &lvitemlo );
    GetItem( &lvitemhi );
    
    for( i=0; i<nColCount; i++)
        SetItemText(lo, i, GetItemText(hi, i));
    
    lvitemhi.iItem = lo;
    SetItem( &lvitemhi );
    
    for( i=0; i<nColCount; i++)
        SetItemText(hi, i, rowText[i]);
    
    lvitemlo.iItem = hi;
    SetItem( &lvitemlo );
}

 8.기존에 선택되어있는 것을 해체하기
 -----------------------------------
        int nOldItem = GetSelectionMark();
        if( nOldItem > 0 )
            SetItemState( nOldItem , 0, LVIS_SELECTED);




리스트 컨트롤에 콤보박스 올려놓기


Codeguru 에 있는 내용을 약간 번역 겸 수정했습니다. 

오류 부분도 잡아내서 수정했고요 
그럼 도움이 되셨으면 합니다.  시험용 소소도 같이 올려놓습니다.
즐거운 하루 되세요.....



Step1 : CListCtrl 로부터 파생클래스를 생성한다.
    class  CMyListCtrl  : public CListCtrl   

Step 2: Define HitTestEx()
CMyListCtrl class 에 확장 HitTest 함수를 정의합니다. 이 함수는 마우스 포인터가 위치한 줄과 컬럼의 번
호를 리턴합니다. 

// Returns    - 줄의 인덱스값. 데이타가 없는 줄이면 -1 을 리턴함  .
// point    - point to be tested.
// col        - to hold the column index

int CMyListCtrl::HitTestEx(CPoint &point, int *col) const
{
    int colnum = 0;
    int row = HitTest( point, NULL );   // 기존의 HitTest 함수를 이용하여 줄의 인덱스값을 얻어
옴.

    if( col ) *col = 0;

    // LVS_REPORT 모드 인지 확인함.

    if( (GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK) != LVS_REPORT )
        return row;

    // 보여지는 가장 윗줄과 아랫줄의 인덱스를 얻어옴 

    row = GetTopIndex();
    int bottom = row + GetCountPerPage();

    if( bottom > GetItemCount() )
        bottom = GetItemCount();

    // 컬럼의 갯수를 가져온다. 

    CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
    int nColumnCount = pHeader->GetItemCount();


    for( ;row <= bottom;row++)
    {

        // 각 줄의 아이템 영역을 잡아서 Pointer가 그 안에 위치하는지 검사한다.

        CRect rect;
        GetItemRect( row, &rect, LVIR_BOUNDS );

        if( rect.PtInRect(point) )
        {
            // 여기서는 컬럼을 뒤짐
            for( colnum = 0; colnum < nColumnCount; colnum++ )
            {
                int colwidth = GetColumnWidth(colnum);
                if( point.x >= rect.left 
                    && point.x <= (rect.left + colwidth ) )
                {
                    if( col ) *col = colnum;
                    return row;
                }
                rect.left += colwidth;
            }
        }
    }
    return -1;
}

Step 3: Drop Down List 를 생성시키는 함수 추가하기 

// ShowInPlaceList        - Drop Down List 를 생성키키는 함수명 
// Returns            - ComboBox Ctrl에 대한 포인터
// nItem            - 위치한 Cell 의 줄 인덱스
// nCol                - 위치한 Cell 의 컬럼 인덱스 
// lstItems            - A list of strings to populate the control with
// nSel                - drop down list 에서 초기에 설정될 인덱스 

CComboBox* CMyListCtrl::ShowInPlaceList( int nItem, int nCol, 
                    CStringList &lstItems, int nSel )
{
    // The returned pointer should not be saved

    // 선택된 아이템(Cell) 이 Visible 인가를 확인 
    if( !EnsureVisible( nItem, TRUE ) ) return NULL;

    // 컬럼이 유효한가를 확인  
    CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
    int nColumnCount = pHeader->GetItemCount();
    if( nCol >= nColumnCount || GetColumnWidth(nCol) < 10 ) 
        return NULL;

    // 모든 컬럼의 길이를 얻어냄 
    int offset = 0;
    for( int i = 0; i < nCol; i++ )
        offset += GetColumnWidth( i );

    CRect rect;
    GetItemRect( nItem, &rect, LVIR_BOUNDS );

    CRect rcClient;
    GetClientRect( &rcClient );
    if( offset + rect.left < 0 || offset + rect.left > rcClient.right )
    {
        CSize size;
        size.cx = offset + rect.left;
        size.cy = 0;
        Scroll( size );
        rect.left -= size.cx;
    }

    rect.left += offset+4;
    rect.right = rect.left + GetColumnWidth( nCol ) - 3 ;
    int height = rect.bottom-rect.top;
    rect.bottom += 5*height;
    if( rect.right > rcClient.right) rect.right = rcClient.right;

    DWORD dwStyle = WS_BORDER|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL
                    |CBS_DROPDOWNLIST|CBS_DISABLENOSCROLL;
    CComboBox *pList = new CInPlaceList(nItem, nCol, &lstItems, nSel);
    pList->Create( dwStyle, rect, this, IDC_IPEDIT );
    pList->SetItemHeight( -1, height);
    pList->SetHorizontalExtent( GetColumnWidth( nCol ));


    return pList;
}

Step 4: Handle the scroll messages
CInPlaceList class 는 drop down list 가 포커스를 잃을때 객체를 지우고(delete) , 파괴(destroy) 하기위
해 설계되었음. 리스트 컨트롤의 스크롤바를 클릭킹 하는 것은 drop down list로 부터 포커스를 가져오지 
못함.그러므로 리스트 컨트롤의 스크롤바를 클릭함으로써 포커스를 가져오는 메시지 핸들러를 작성해야 함.

void CMyListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    if( GetFocus() != this ) SetFocus();
    CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    if( GetFocus() != this ) SetFocus();
    CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}

Step 5: 
유저가 drop down list 에서 아이템을 선택하면 LVN_ENDLABELEDIT notification 을 보냄. 따라서 다음의 메
시지 핸들러 추가 

void CMyListCtrl::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO  *plvDispInfo = (LV_DISPINFO *)pNMHDR;
     LV_ITEM         *plvItem = &plvDispInfo->item;

    if (plvItem->pszText != NULL)
    {
        SetItemText(plvItem->iItem, plvItem->iSubItem, plvItem->pszText);
    }
    *pResult = FALSE;
}

Step 6: 
아래의 코드는 WM_LBUTTONDOWN message에 대한 핸들러임. 이 함수는 이미 다른 곳에 drop down list 가 존
재할때 현재 click 한 곳에 dorp down list를 새로 생성함. 아래 코드는 drop down list 를 생성하기전
에   LVS_EDITLABELS style 을 체크함. 이 부분을 각자에 맞게 수정되어야 함.

void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
    int index;
    CListCtrl::OnLButtonDown(nFlags, point);

    int colnum;
    if( ( index = HitTestEx( point, &colnum )) != -1 )
    {
        UINT flag = LVIS_FOCUSED;
        if( (GetItemState( index, flag ) & flag) == flag )
        {
            
            if( !(GetWindowLong(m_hWnd, GWL_STYLE) & LVS_EDITLABELS) )
            {
                CStringList lstItems;
                lstItems.AddTail( "First Item");
                lstItems.AddTail( "Second Item");
                lstItems.AddTail( "Third 
Item");                             // 이부분을 각자에 맞게 수정하면 됨.
                lstItems.AddTail( "Fourth Item");
                lstItems.AddTail( "Fifth Item");
                lstItems.AddTail( "Sixth Item");
                ShowInPlaceList( index, colnum, lstItems, 2 );
            }
        }
        else
            SetItemState( index, LVIS_SELECTED | LVIS_FOCUSED , 
                    LVIS_SELECTED | LVIS_FOCUSED);
    }
}

Step 7: ComboBox Class 서브 클래싱 하기  
이 클래스에 가장 필요한 부분은 유저가 아이템 선택을 끝냈을 경우  LVN_ENDLABELEDIT message 를 보내는 
기능임. 
에디트가 끝나면 자신을 삭제하기도 해야함. 
에디트 작업은 ,Esc , Enter 키가 눌렸을때 , 유저가 아이템을 선택했을 경우, 입력 포커스를 잃었을때 끝
나야 함.

 // InPlaceList.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CInPlaceList window

class CInPlaceList : public CComboBox
{
// Construction
public:
    CInPlaceList(int iItem, int iSubItem, CStringList *plstItems, int nSel);

// Attributes
public:

// Operations
public:

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CInPlaceList)
    public:
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CInPlaceList();

    // Generated message map functions
protected:
    //{{AFX_MSG(CInPlaceList)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnKillFocus(CWnd* pNewWnd);
    afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnNcDestroy();
    afx_msg void OnCloseup();
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
private:
    int     m_iItem;
    int     m_iSubItem;
    CStringList m_lstItems;
    int     m_nSel;
    BOOL    m_bESC;                // To indicate whether ESC key was pressed
};

/////////////////////////////////////////////////////////////////////////////
// InPlaceList.cpp : implementation file
//

#include "stdafx.h"
#include "InPlaceList.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CInPlaceList

CInPlaceList::CInPlaceList(int iItem, int iSubItem, CStringList *plstItems, int nSel)
{
    m_iItem = iItem;
    m_iSubItem = iSubItem;

    m_lstItems.AddTail( plstItems );
    m_nSel = nSel;
    m_bESC = FALSE;
}

CInPlaceList::~CInPlaceList()
{
}


BEGIN_MESSAGE_MAP(CInPlaceList, CComboBox)
    //{{AFX_MSG_MAP(CInPlaceList)
    ON_WM_CREATE()
    ON_WM_KILLFOCUS()
    ON_WM_CHAR()
    ON_WM_NCDESTROY()
    ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseup)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInPlaceList message handlers

int CInPlaceList::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CComboBox::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    // Set the proper font
    CFont* font = GetParent()->GetFont();
    SetFont(font);

    for( POSITION pos = m_lstItems.GetHeadPosition(); pos != NULL; )
    {
        AddString( (LPCTSTR) (m_lstItems.GetNext( pos )) );
    }
    SetCurSel( m_nSel );
    SetFocus();
    return 0;
}

BOOL CInPlaceList::PreTranslateMessage(MSG* pMsg) 
{
    if( pMsg->message == WM_KEYDOWN )
    {
        if(pMsg->wParam == VK_RETURN 
                || pMsg->wParam == VK_ESCAPE
                )
        {
            ::TranslateMessage(pMsg);
            ::DispatchMessage(pMsg);
            return TRUE;                // DO NOT process further
        }
    }
    
    return CComboBox::PreTranslateMessage(pMsg);
}

void CInPlaceList::OnKillFocus(CWnd* pNewWnd) 
{
    CComboBox::OnKillFocus(pNewWnd);
    
    CString str;
    GetWindowText(str);

    // Send Notification to parent of ListView ctrl
    LV_DISPINFO dispinfo;
    dispinfo.hdr.hwndFrom = GetParent()->m_hWnd;
    dispinfo.hdr.idFrom = GetDlgCtrlID();
    dispinfo.hdr.code = LVN_ENDLABELEDIT;

    dispinfo.item.mask = LVIF_TEXT;
    dispinfo.item.iItem = m_iItem;
    dispinfo.item.iSubItem = m_iSubItem;
    dispinfo.item.pszText = m_bESC ? NULL : LPTSTR((LPCTSTR)str);
    dispinfo.item.cchTextMax = str.GetLength();

    GetParent()->GetParent()->SendMessage( WM_NOTIFY, GetParent()->GetDlgCtrlID(), (LPARAM)
&dispinfo );

    PostMessage( WM_CLOSE );
}

void CInPlaceList::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    if( nChar == VK_ESCAPE || nChar == VK_RETURN)
    {
        if( nChar == VK_ESCAPE )
            m_bESC = TRUE;
        GetParent()->SetFocus();
        return;
    }
    
    CComboBox::OnChar(nChar, nRepCnt, nFlags);
}

void CInPlaceList::OnNcDestroy() 
{
    CComboBox::OnNcDestroy();
    
    delete this;
}

void CInPlaceList::OnCloseup() 
{
    GetParent()->SetFocus();
}




리포트 스타일의 리스트 콘트롤에 행간 높이 조절

 리스트 콘트롤의 행간 높이를 조절하고자 할때,
 원래 윈도우가 날려주는 메세지가 있지만, CListCtrlView 를 이용하는경우 도움이 전혀 안됩니다.
 이경우 마지막 방법은 이미지 리스트를 이용하는 것입니다.

         CImageList m_image;

    ....
         CListCtrl &m_list=GetListCtrl();
    m_image.Create(1,20,ILC_COLORDDB,1,0); 
    list.SetImageList(&m_image,LVSIL_SMALL);
  .......

 을 써서 Y 크기를 조절해서 크기를 바꿀 수 있습니다.
 메세지를 생성하는게 제일 좋은데 어쩔 수 없네요



 그리고

ListView_SetExtendedListViewStyle(list, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_SUBITEMIMAGES);

 을 이용하시면  ROW 전체를 선택하거나, GRID 를 표시해주고,  서브아이템에 이미지 표시하기 등이 가능해
집니다.


BOOL ListCtrl_ModifyExtendedStyle(CListCtrl&   p_rListCtrl,
                                   const DWORD  p_dwStyleEx,
                                   const bool   p_bAdd)
{
    HWND t_hWnd = p_rListCtrl.GetSafeHwnd();
    DWORD t_dwStyleEx = ListView_GetExtendedListViewStyle(t_hWnd);
 
    if(p_bAdd)
    {
        if(0 == (p_dwStyleEx & t_dwStyleEx))
        {
            // add style
            t_dwStyleEx |= p_dwStyleEx;
        }
    }
    else
    {
        if(0 != (p_dwStyleEx & t_dwStyleEx))
        {
            // remove style
            t_dwStyleEx &= ~p_dwStyleEx;
        }
    }
 
    ListView_SetExtendedListViewStyle(t_hWnd, t_dwStyleEx);
 
    return true;
}  


리스트콘트롤에서 원하는 값을 맨위로 오게 스크롤 하기

void CMyListView::SelectListItem(CString text) 

CListCtrl &list = GetListCtrl(); 
LVFINDINFO info; 
int index; 
POINT p; 

info.flags = LVFI_PARTIAL|LVFI_STRING; 
info.psz = text; 

index = list.FindItem(&info) - 1; 
list.SetItemState(index, LVIS_SELECTED | LVIS_FOCUSED, LVIF_STATE); 

list.GetItemPosition(index, &p); 
list.Scroll((CSize)p); 



콘트롤에 멤버 변수를 설정해 놓았으면 맨 첫줄은 필요없구요

아래 list 변수대신 멤버변수를 사용하시면 됨다.

'NativeCode > mfc' 카테고리의 다른 글

리스트 컨트롤 시스템 아이콘 삽입  (0) 2010.03.18
리스트 컨트롤 파일 아이콘 추가하기  (1) 2010.03.18
CTRL 값 얻기  (0) 2010.03.18
배경 그림 넣기  (0) 2010.03.18
부모윈도우 호출  (0) 2010.03.18

CString csData;

m_Edit.GetWindowText( csData );

const char *pData = ( LPSTR )( LPCTSTR )csData;


'NativeCode > mfc' 카테고리의 다른 글

리스트 컨트롤 파일 아이콘 추가하기  (1) 2010.03.18
리스트 컨트롤 색상 다루기  (1) 2010.03.18
배경 그림 넣기  (0) 2010.03.18
부모윈도우 호출  (0) 2010.03.18
좌표, 영역 관련 함수  (0) 2010.03.18
private: 
          // 리소스에 등록된 비트맵 이미지를 읽어들일 비트맵 객체 
          CBitmap m_logo_bitmap; 
       
          // 대화상자의 배경에 사용할 블러쉬 객체 
          CBrush m_bk_brush;  

======================================================================================

BOOL CTestPatternBrushDlg::OnInitDialog() 

    CDialog::OnInitDialog(); 
  
    SetIcon(m_hIcon, TRUE);    
    SetIcon(m_hIcon, FALSE);  
      
    // 리소스 파일에서 비트맵을 읽어 들인다. 
    m_logo_bitmap.LoadBitmap(IDB_ZZANG_LOGO); 
    // 읽어 들인 비트맵을 이용하여 패턴 블러쉬를 생성한다. 
    m_bk_brush.CreatePatternBrush(&m_logo_bitmap);     
     
    return TRUE; 
}

======================================================================================

void CTestPatternBrushDlg::OnDestroy() 

    CDialog::OnDestroy(); 
      
    // 사용하던 블러쉬 객체와 비트맵 객체를 제거한다. 
    m_bk_brush.DeleteObject(); 
    m_logo_bitmap.DeleteObject(); 
}

======================================================================================

BOOL CTestPatternBrushDlg::OnEraseBkgnd(CDC* pDC) 

    // 사용자가 정의한 배경 그리기 루틴이 CDialog::OnEraseBkgnd 함수보다 먼저 
    // 위치하면 기본 대화상자 그리기 루틴에 의해서 아무것도 나오지 않는다. 따라서 
    // 항상 자기가 표시하고 싶은 정보는 CDialog::OnEraseBkgnd 함수보다 아래쪽에 
    // 정의 해야한다. 
    BOOL ret = CDialog::OnEraseBkgnd(pDC); 
      
    CRect r; 
     
    // 대화상자의 크기를 얻는다. 
    GetClientRect(r); 
        
    // 현재 DC에 자신이 생성한 블러쉬를 사용하도록 설정한다. 
    CBrush *p_old_brush = pDC->SelectObject(&m_bk_brush); 
      
    // 대화상자의 크기보다 패턴블러쉬에 사용된 이미지가 작다면 Tile 형식으로 
    // 이미지가 채워진다. 
    pDC->Rectangle(r); 
      
    // 이전에 사용한던 블러쉬로 복구한다. 
    pDC->SelectObject(p_old_brush); 
   
    return ret; 
}

'NativeCode > mfc' 카테고리의 다른 글

리스트 컨트롤 색상 다루기  (1) 2010.03.18
CTRL 값 얻기  (0) 2010.03.18
부모윈도우 호출  (0) 2010.03.18
좌표, 영역 관련 함수  (0) 2010.03.18
컨트롤러 투명화 & 색 변화 시키기  (0) 2010.03.18

CUpdateServerDlg *pServerDlg = static_cast< CUpdateServerDlg * >( AfxGetMainWnd() );

'NativeCode > mfc' 카테고리의 다른 글

CTRL 값 얻기  (0) 2010.03.18
배경 그림 넣기  (0) 2010.03.18
좌표, 영역 관련 함수  (0) 2010.03.18
컨트롤러 투명화 & 색 변화 시키기  (0) 2010.03.18
CStringArray  (0) 2010.03.18

GetClientRect : 클라이언트 영역을 구함


GetWindowRect : 화면전체에서윈도우전체영역을구함


ScreenToClient : 스크린 영역,좌표를 클라이언트 영역, 좌표로 전환함


ClientToScreen : ScreenToClient와 반대로 작동함


GetCursorPos : 화면전체에서마우스커서좌표를얻음


SetCursorPos : 마우스 좌표를 설정함


MoveWindow : 윈도우 크기와 좌표를 조정


SetWindowPos : 윈도우 크기,좌표와 부수적인 것도 설정

'NativeCode > mfc' 카테고리의 다른 글

배경 그림 넣기  (0) 2010.03.18
부모윈도우 호출  (0) 2010.03.18
컨트롤러 투명화 & 색 변화 시키기  (0) 2010.03.18
CStringArray  (0) 2010.03.18
SendMessage 종류  (0) 2010.03.18

CStatic 및 컨트롤러에 배경 투명화시키기



BEGIN_MESSAGE_MAP(CRCS_Client_ProDlg, CDialog)
 //{{AFX_MSG_MAP(CRCS_Client_ProDlg)

 ON_WM_CTLCOLOR() // 컨트롤러에 색 입힐 때 호출됨.
                                 // OnDraw 호출시기와 비슷함.

 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

:
:


HBRUSH CDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

 pDC->SetBkMode(OPAQUE);

 switch(nCtlColor)
 {
  case CTLCOLOR_STATIC:
  pDC->SetBkColor(RGB(209,210,212));
  pDC->SetTextColor(RGB(0,0,0));
  hbr = (HBRUSH)GetStockObject(NULL_BRUSH);
  break;
 }

 return hbr;
}




// 부가적으로 기능을 더 추가하고 싶다면..


#define  BG_COLOR RGB(234,235,235)
#define STATIC_CLASS_T("Static") 
#define BUTTON_CLASS_T("Button")

:
:

HBRUSH CDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
 if(nCtlColor == CTLCOLOR_STATIC) //Static Text가 그려질 때..
 {
  TCHAR lpszClassName [256]; 
  
  ::GetClassName(pWnd->GetSafeHwnd(), lpszClassName, 255); 
  CString strClass = lpszClassName; 
  
  if (strClass == STATIC_CLASS) 
  { 
   pDC->SetBkMode(TRANSPARENT);  
   return(HBRUSH) ::GetStockObject(HOLLOW_BRUSH); 
  } 
  
  if (strClass == BUTTON_CLASS) //Radio Button의 텍스트가 그려질 때..
  { 
   pDC->SetBkColor(BG_COLOR); //group box
  } 
  return(HBRUSH) ::GetStockObject(HOLLOW_BRUSH); //(NULL_BRUSH = HOLLOW_BRUSH)

 }

 return hbr;
}



*** 참고사항 ***



 CTLCOLOR_BTN

 Button control이 그려질 때, 윈도 95에서는 변경 불가

 CTLCOLOR_DLG

 대화상자가 그려질 때

 CTLCOLOR_EDIT

 Edit Box가 그려질 때

 CTLCOLOR_LISTBOX 

 List Box가 그려질 때

 CTLCOLOR_MSGBOX

 메지시 박스가 그려질 때

 CTLCOLOR_SCROLLBAR

 Scroll Bar가 그려질 때

 CTLCOLOR_STATIC

 Static Text가 그려질 때


'NativeCode > mfc' 카테고리의 다른 글

부모윈도우 호출  (0) 2010.03.18
좌표, 영역 관련 함수  (0) 2010.03.18
CStringArray  (0) 2010.03.18
SendMessage 종류  (0) 2010.03.18
SendMessage  (0) 2010.03.18

int nNicCount = m_CsArrayAdapterName->GetCount();

char *data = ( LPSTR )( LPCTSTR )const_cast< CString &>( m_CsArrayAdapterName->GetAt( i ) );

'NativeCode > mfc' 카테고리의 다른 글

좌표, 영역 관련 함수  (0) 2010.03.18
컨트롤러 투명화 & 색 변화 시키기  (0) 2010.03.18
SendMessage 종류  (0) 2010.03.18
SendMessage  (0) 2010.03.18
WM_COPYDATA  (0) 2010.03.18

SendNotifyMessage 동일한 스레드에서 생성된 윈도우에게 메시지를 보낼 때는 동기식이지만 다른 스레드의 윈도우에게 보낼때는 PostMessage와 같이 비동기식이다.

SendMessageCallback 비동기식으로 작동하며 서버가 메시지 처리가 끝나거나 함수가 실패하였을 때 다섯 번째 인자에 설정된 콜백함수 실행

PostMessage 특정 메시지를 메시지 큐에 넣고 바로 리턴한다. 비동기식식

'NativeCode > mfc' 카테고리의 다른 글

컨트롤러 투명화 & 색 변화 시키기  (0) 2010.03.18
CStringArray  (0) 2010.03.18
SendMessage  (0) 2010.03.18
WM_COPYDATA  (0) 2010.03.18
Message Map  (0) 2010.03.18

받는 쪽

#define WM_MESSGAE WM_USER + 1

LRESULT OnRequestFromClient( WPARAM wParam, LPARAM lParam );

ON_MESSAGE( WM_MESSAGE, OnRequestFromClient)


보내는 쪽

HWND hWnd = ::FindWindow( NULL, "Process Name" );

::SendMessage( hWnd, WM_MESSAGE, 0, 0 );

'NativeCode > mfc' 카테고리의 다른 글

CStringArray  (0) 2010.03.18
SendMessage 종류  (0) 2010.03.18
WM_COPYDATA  (0) 2010.03.18
Message Map  (0) 2010.03.18
MFC Exception  (0) 2010.03.18

받는 쪽

strcut INFO

{

char data[ 100];

}

#define WM_MESSAGE WM_USER + 1

afx_msg bool OnCopyData( CWnd* pWnd, COPYDATASTRUCT *pCopyDataStruct );

ON_WM_COPYDATA()


bool OnCopyData( CWnd *pWnd, COPYDATASTRUCT *pCopyDataStruct )

{

INFO a;


switch( pCopyDataStruct->dwData )

{

case WM_MESSAGE :

memcpy( &a, pCopyDataStruct->lpData);

break;

}


return CDialog::OnCopyData(pWnd, pCopyDataStruct);

}


보내는 쪽

HWND hWnd = ::FindWindow( NULL, "Process Name" );

INFO a;

strcpy( a.data, "Aaaaaaaaaaa" );


COPYDATASTRUCT b;

b.dwData = WM_MESSAGE ;

b.cbData = sizeof( INFO );

b.lpData = &a;


::SendMessage( hWnd, WM_COPYDATA, ( WPARAM )m_hWnd, ( LPARAM )&b );

'NativeCode > mfc' 카테고리의 다른 글

SendMessage 종류  (0) 2010.03.18
SendMessage  (0) 2010.03.18
Message Map  (0) 2010.03.18
MFC Exception  (0) 2010.03.18
MFC Exception 클래스 확장하기  (0) 2010.03.18

메시지 맵 함수

  • http://blog.naver.com/pengooni?Redirect=Log&logNo=100014819687

    웹사이트에 대한 설명을 적습니다.
  • MFC의 메시지 맵 함수  
       
       
    WM_COMMAND 메시지에 대한 핸들러  
       
    맵 엔트리 함수 속성
    ON_COMMAND(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_COMMAND_EX(<id>, <memberFxn>) afx_msg BOOL memberFxn(UNIT);
    ON_COMMAND_EX_RANGE(<id>,
    <idLast>, <memberFxn>)
    afx_msg BOOL memberFxn(UNIT);
    ON_COMMAND_RANGE(<id>, <idLast>,
    <memberFxn>)
    afx_msg void memberFxn(UNIT);
    ON_UPDATE_COMMAND_UI(<id>,
    <memberFxn>)
    afx_msg void memberFxn(CCmdUI*);
    ON_UPDATE_COMMAND_UI_RANGE(<id>,
    <idLast>, <memberFxn>)
    afx_msg void memberFxn(CCmdUI*);
    ON_UPDATE_COMMAND_UI_REFLECT
    (<memberFxn>)
    afx_msg void memberFxn(CCmdUI*);
       
       
    차일드 윈도우 통보 메시지에 대한 핸들러  
       
    맵 엔트리 함수 속성
    일반 컨트롤 통보 코드  
    ON_CONTROL(<wNotifyCode>, <id>,
    <memberFxn>)
    afx_msg void memberFxn();
    ON_CONTROL_RANGE(<wNotifyCode>,
    <id>, <idLast>, <memberFxn>)
    afx_msg void memberFxn(UNIT);
    ON_CONTROL_REFLECT(<wNotifyCode>) afx_msg void memberFxn();
    ON_CONTROL_REFLECT_EX
    (<wNotifyCode>, <memberFxn>)
    afx_msg void memberFxn(NMHDR*,
    LRESULT*);
    ON_NOTIFY(<wNotifyCode>, <id>,
    <memberFxn>)
    afx_msg BOOL memberFxn(UNIT NMHDR*,
    LRESULT*);
    ON_NOTIFY_EX(<wNotifyCode>, <id>,
    <memberFxn>)
    afx_msg BOOL memberFxn(UNIT NMHDR*,
    LRESULT*);
    ON_NOTIFY_EX_RANGE(<wNotifyCode>,
    <id>, <idLast>, <memberFxn>)
    afx_msg void memberFxn(UNIT NMHDR*,
    LRESULT*);
    ON_NOTIFY_REFLECT(<wNotifyCode>,
    <memberFxn>)
    afx_msg void memberFxn(NMHDR*,
    LRESULT*);
    ON_NOTIFY_REFLECT_EX(<wNotifyCode>,
    <memberFxn>)
    afx_msg BOOL memberFxn(NMHDR*,
    LRESULT*);
       
    사용자 버튼 통보 코드  
    ON_BN_CLICKED(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_BN_DOUBLECLICKED(<id>,
    <memberFxn>)
    afx_msg void memberFxn();
    ON_BN_KILLFOCUS(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_BN_SETFOCUS(<id>, <memberFxn>) afx_msg void memberFxn();
       
    콤보 박스 통보 코드  
    ON_CBN_CLOSEUP(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_CBN_DBLCLK(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_CBN_DROPDOWN(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_CBN_EDITCHANGE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_CBN_EDITUPDATE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_CBN_ERRSPACE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_CBN_KILLFOCUS(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_CBN_SELCHANGE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_CBN_SELENDCANCEL(<id>,
    <memberFxn>)
    afx_msg void memberFxn();
    ON_CBN_SELENDOK(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_CBN_SETFOCUS(<id>, <memberFxn>) afx_msg void memberFxn();
       
    체크 리스트 박스 통보 코드  
    ON_CBN_CHKCHANCE(<id>, <memberFxn>) afx_msg void memberFxn();
       
    에디트 컨트롤 통보 코드  
    ON_EN_CHANGE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_EN_ERRSPACE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_EN_HSCROLL(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_EN_KILLFOCUS(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_EN_MAXTEXT(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_EN_SETFOCUS(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_EN_UPDATE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_EN_VSCROLL(<id>, <memberFxn>) afx_msg void memberFxn();
       
    리스트 박스 통보 코드  
    ON_LBN_DBLCLK(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_LBN_ERRSPACE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_LBN_KILLFOCUS(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_LBN_SELCANCEL(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_LBN_SELCHANGE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_LBN_SETFOCUS(<id>, <memberFxn>) afx_msg void memberFxn();
       
    정적 컨트롤 통보 코드  
    ON_STN_CLICKED(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_STN_DBLCLK(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_STN_DISABLE(<id>, <memberFxn>) afx_msg void memberFxn();
    ON_STN_ENABLE(<id>, <memberFxn>) afx_msg void memberFxn();
       
       
    윈도우 통보 메시지에 대한 핸들러  
    ON_WM_ACTIVATE() afx_msg void OnActivate(UINT,
    CWnd*, BOOL);
    ON_WM_ACTIVATEAPP() afx_msg void OnActivateApp(BOOL, HTASK);
    ON_WM_ASKCBFORMATNAME() afx_msg void OnAskCbFormatName
    (UINT, LPTSTR);
    ON_WM_CANCELMODE() afx_msg void OnCancelMode();
    ON_WM_CAPTURECHANGED() afx_msg void OnCaptureChanged(CWnd*);
    ON_WM_CHANGECBCHAIN() afx_msg void OnChangeCbChain
    (HWND, HWND);
    ON_WM_CHAR() afx_msg void OnChar(UINT, UINT, UINT);
    ON_WM_CHARTOITEM() afx_msg int OnChar ToItem(UINT,
    CListBox*, UINT);
    ON_WM_CHARTOITEM_REFLECT() afx_msg int OnCharToItem(UINT, UINT);
    ON_WM_CHILDACTIVTE() afx_msg void OnChildActivate();
    ON_WM_CLOSE() afx_msg void OnClose();
    ON_WM_COMPACTING() afx_msg void OnCompacting(UINT);
    ON_WM_COMPAREITEM() afx_msg int On CompareItem(int,
    LPCOMPAREITEMSTRUCT);
    ON_WM_COMPAREITEMREFLECT() afx_msg int On CompareItem
    (LPCOMPAREITEMSTRUCT-STRUCT);
    ON_WM_CONTEXTMENU() afx_msg void OnContextMenu(CWnd*,
    CPoint);
    ON_WM_COPYDATA() afx_msg BOOL OnCopyData(CWnd*,
    COPYDATASTRUCT*);
    ON_WM_CREATE() afx_msg int OnCreate(LPCREATESTRUCT);
    ON_WM_CTLCOLOR() afx_msg HBRUSH OnCtlColor(CDC*, UINT);
    ON_WM_DEADCHAR() afx_msg void OnDeadChar
    (UINT, UINT, UINT);
    ON_WM_DELETEITEM() afx_msg void OnDeleteItem(int,
    LPDELETEITEMSTRUCT);
    ON_WM_DELETEITEM_REFLECT() afx_msg void DeleteItem
    (LPDELETEITEMSTRUCT);
    ON_WM_DESTROY() afx_msg void OnDestroy();
    ON_WM_DESTROYCLIPBOARD() afx_msg void OnDestroyClipboard(UINT,
    DWORD);
    ON_WM_DEVICECHANGE() afx_msg BOOL OnDeviceChange(UINT,
    DWORD);
    ON_WM DEVMODECHANGE() afx_msg void OnDevModeChange
    (LPTSTR);
    ON_WM_DRAWCLIPBOARD() afx_msg void OnDrawClipboard();
    ON_WM_DRAWITEM() afx_msg void OnDrawItem(int,
    LPDRAWITEMSTRUCT);
    ON_WM_DRAWITEM_REFLECT() afx_msg void DrawItem
    (LPDRAWITEMSTRUCT);
    ON_WM_DROPFILES() afx_msg void OnDropFiles(HDROP);
    ON_WM_ENABLE() afx_msg void OnEnable(BOOL);
    ON_WM_ENDSESSION() afx_msg void OnEndSession(BOOL);
    ON_WM_ENTERIDLE() afx_msg void OnEnterIdle(UINT, CWnd*);
    ON_WM_ENTERMENULOOP() afx_msg void OnEnterMenuLoop(BOOL);
    ON_WM_ERASEBKGND() afx_msg BOOL OnEraseBkgnd(CDC*)
    ON_WM_EXITMENULOOP() afx_msg void OnExitMenuLoop(BOOL);
    ON_WM_FONTCHANGE() afx_msg void OnFontChange();
    ON_WM_GETDLGCODE() afx_msg UINT OnGetDlgCode();
    ON_WM_GETMINMAXINFO() afx_msg void OnGetMinMaxInfo
    (MINMAXINFO*);
    ON_WM_HELPINFO() afx_msg BOOL OnHelpInfo(MELPINFO*);
    ON_WM_HSCROLL() afx_msg void OnHScroll(UINT,
    UINT, CScrollBar*);
    ON_WM_HSCROLL_REFLECT() afx_msg void HScrool(UINT, UINT);
    ON_WM_HSCROLLCLIPBOARD() afx_msg void OnHScrollClipBoard
    (CWnd* UINT, UINT);
    ON_WM_ICONERASEBKGND() afx_msg void OnIconEraseBkgnd(CDC*);
    ON_WM_INITMNU() afx_msg void OnInitMenu(CMenu*);
    ON_WM_INITMENUPOPUP() afx_msg void OnInitMenuPopup
    (CMenu* UINT, BOOL);
    ON_WM_KEYDOWN() afx_msg void OnKeyDown(UINT, UINT, UINT);
    ON_WM_KEYUP() afx_msg void OnKeyUp(UINT, UINT, UINT);
    ON_WM_KILLFOCUS() afx_msg void OnKillFocus(CWnd*);
    ON_WM_LBUTTONDBLCKLK() afx_msg void OnButtonDblClk(UINT, CPoint);
    ON_WM_LBUTTONDOWN() afx_msg void OnButtonDown(UINT, CPoint);
    ON_WM_LBUTTONUP() afx_msg void OnButtonUp(UINT, CPoint);
    ON_WM_MBUTTONDBLCLK() afx_msg void OnMButtonDblClk(UINT, CPoint);
    ON_WM_MBUTTONDOWN() afx_msg void OnMbuttonDown(UINT, CPoint);
    ON_WM_MBUTTONUP() afx_msg void OnMButtonUp(UINT, CPoint);
    ON_WM_MDIACTIVATE() afx_msg void OnMDIActivate
    (BOOD, CWnd*, CWnd*);
    ON_WM_MEASUREITEM() afx_msg void OnMeasureItem(int,
    LPMEASUREITEMSTRUCT);
    ON_WM_MEASUREITEM_REFLECT() afx_msg void OnMeasureItem
    (LPMEASUREITEMSTRUCT);
    ON_WM_MENUCHAR() afx_msg LRESULT OnMenuChar
    (UINT, UINT, CMenu*);
    ON_WM_MENUSELECT() afx_msg void OnMenuSelect
    (UINT, UINT, HMENU);
    ON_WM_MOUSEACTIVATE() afx_msg OnMouseActivate
    (CWnd*, UINT, UINT);
    ON_WM_MOUSEMOVE() afx_msg OnMouseMove(UINT, Cpoint);
    ON_WM_MOUSEWHELL() afx_msg BOOL OnMouseWhell
    (UINT, short, CPoint);
    ON_WM_MOVE() afx_msg OnMove(int, int);
    ON_WM_MOVING() afx_msg BOOL OnMoveing(UINT, LPRECT);
    ON_WM_NCATIVATE() afx_msg BOOL OnNcActivate(BOOL);
    ON_WM_NCCALCSIZE() afx_msg void OnNcCalcSize(BOOL,
    NCCALCSIZE_PARAMS*);
    ON_WM_NCCREATE() afx_msg BOOL OnNcCreate
    (LPCREATESTRUCT);
    ON_WM_NCDESTROY() afx_msg void OnNcDestroy();
    ON_WM_NCHITTEST() afx_msg UINT OnNcHitTest(CPoint);
    ON_WM_NCLBUTTONDBLCLK() afx_msg void OnNcLButtonDblClk
    (UINT, CPoint);
    ON_WM_NCMBUTTONDOWN() afx_msg void OnNcMButtonDown
    (UINT, CPoint);
    ON_WM_NCMBUTTONUP() afx_msg void OnNcMButtonUp
    (UINT, CPoint);
    ON_WM_NCMOUSEMOVE() afx_msg void OnNcMouseMove
    (UINT, CPoint);
    ON_WM_NCPALNT() afx_msg void OnNPaint();
    ON_WM_NCPBUTTONBLCLK() afx_msg void OnNcRButtonDblClk
    (UINT, CPoint);
    ON_WM_NCRBUTTONDOWN() afx_msg void OnNcRButtonDown
    (UINT, CPoint);
    ON_WM_NCRBUTTONUP() afx_msg void OnNcRButtonUp(UINT, CPoint);
    ON_WM_PAINT() afx_msg void OnPaint();
    ON_WM_PAINTCLIPBOARD() afx_msg void OnPaintClipboard
    (CWnd* HGLOBAL);
    ON_WM_PALETTECHANGED() afx_msg void OnPaletteChanged(CWnd*);
    ON_WM_PALETTEISCHANGING() afx_msg void OnPaletteChanging(CWnd*);
    ON_WM_PARENTNOTIFY() afx_msg void OnParentNotify
    (UNIT, LPARAM);
    ON_WM_PARENTNOTIFY_REFLECT() afx_msg void ParentNotify(UNIT, LPARAM);
    ON_WM_QUERYDRAGICON() afx_msg HCURSOR OnQueryDragIcon();
    ON_WM_QUERYENDSESSION() afx_msg BOOL OnQueryEndSession();
    ON_WM_QUERYNEWPALETTE() afx_msg BOOL OnQueryNewPalette();
    ON_WM_QUERYOPEN() afx_msg BOOL OnQueryOpen();
    ON_WM_RBUTTONDBLCLK() afx_msg void OnRButtonDblclk(UNIT, CPoint);
    ON_WM_RBUTTONDOWN() afx_msg void OnRButtonDown(UNIT, CPoint);
    ON_WM_RBUTTONUP() afx_msg void OnRButtonUp(UINT, CPoint);
    ON_WM_RENDERALLFORMATS() afx_msg void OnRenderAllFormats();
    ON_WM_RENDERFORMATS() afx_msg void OnRenderFormats(UNIT);
    ON_WM_SETCURSOR() afx_msg BOOL OnSetCursor
    (CWnd*, UNIT, UNIT);
    ON_WM_SETFOCUS() afx_msg void OnSetFocus(CWnd*);
    ON_WM_SETTINGCHANGE() afx_msg void OnSettingChange
    (UNIT, LPCTSTR);
    ON_WM_SHOWWINDOW() afx_msg void OnShowWindow(BOOL, UNIT);
    ON_WM_SIZE() afx_msg void OnSize(UNIT, int, int);
    ON_WM_SIZECLIPBOARD() afx_msg void OnSizeClipboard
    (CWnd*, HGLOBAL);
    ON_WM_SIZING() afx_msg void OnSizing(UNIT, LPRECT);
    ON_WM_SPOOLERSTATUS() afx_msg void OnSpoolerStatus(UNIT, UNIT);
    ON_WM_STYLECHANGED() afx_msg void OnStyleChanged(int,
    LPSTYLESRTRUCT);
    ON_WM_STYLECHANGING() afx_msg void OnStyleChanging(int,
    LPSTYLESRTRUCT);
    ON_WM_SYSCHAR() afx_msg void OnSysChar(UNIT, UNIT, UNIT);
    ON_WM_SYSCOLORCHANGE() afx_msg void OnSysColorChange();
    ON_WM_SYSCOMMAND() afx_msg void OnSysCommand
    (UNIT, LPARAM);
    ON_WM_SYSDEADCHAR() afx_msg void OnSysDeadChar
    (UNIT, UNIT, UNIT);
    ON_WM_SYSKEYDOWN() afx_msg void OnSysKeyDown
    (UNIT, UNIT, UNIT);
    ON_WM_SYSKEYUP() afx_msg void OnSysKeyUp(UNIT, UNIT, UNIT);
    ON_WM_TCARD() afx_msg void OnTCard(UNIT, DWORD);
    ON_WM_TIMECHANGE() afx_msg void OnTimeChange();
    ON_WM_TIMER() afx_msg void OnTimer(UNIT);
    ON_WM_VKEYTOITEM() afx_msg void OnVKeyToItem
    (UNIT, CListBox*, UNIT);
    ON_WM_VKEYTOITEM_REFLECT() afx_msg int VKeyToItem(UNIT, UNIT);
    ON_WM_VSCROLL() afx_msg void OnVScroll
    (UNIT, UNIT, CSrollBar*);
    ON_WM_VSCROLL_REFLECT() afx_msg void VScroll(UNIT, UNIT, CScrollBar*);
    ON_WM_VSCROLLCLIPBOARD() afx_msg void OnVScrollClipboard
    (CWnd*, UNIT, UNIT);
    ON_WM_WINDOWPOSCHANGED() afx_msg void OnWindowPosChanged
    (WINDOWPOS*);
    ON_WM_WINDOWPOSCHANGING() afx_msg void OnWindowPosChanging
    (WINDOWPOS*);
    ON_WM_WININICHANGE() afx_msg void OnWinIniChange(LPCTSTR);
       
       
    사용자 정의 메시지에 대한 핸들러  
       
    ON_MESSAGE(<message>, <memberFxn>) afx_msg LRESULT memberFxn(WPARAM,
    LPARAM);
    ON_REGISTERED_MESSAGE
    (<nMessageVariable>, <memberFxn>)
    afx_msg LRESULT memberFxn
    (WPARAM, LPARAM);
    ON_REGISTERED_THREAD_MESSAGE
    (<nMessageVariable>, <memberFxn>)
    afx_msg void memberFxn(WPARAM,
    LPARAM);
    ON_THREAD_MESSAGE(<nMessage>,
    <memberFxn>)
    afx_msg void memberFxn(WPARAM,
    LPARAM);

'NativeCode > mfc' 카테고리의 다른 글

SendMessage  (0) 2010.03.18
WM_COPYDATA  (0) 2010.03.18
MFC Exception  (0) 2010.03.18
MFC Exception 클래스 확장하기  (0) 2010.03.18
TrackPopup  (0) 2010.03.18

클래스명

내용

CMemoryException

메모리부족시에발생하는예외처리클래스

CFileException

파일입출력시발생하는예외처리클래스

CArchiveException

직렬화처리시발생하는예외를정의한다.

CNotSupportedException

지원되지않는기능을요구할경우에발생하는예외처리클래스

CResourceException

리소스할당시발생하는예외처리클래스

COleException

OLE 관련클래스에서발생하는예외처리클래스

CDBException

ODBC 관련클래스에서발생하는예외처리클래스

COleDispatchException

OLE 자동화수행시발생하는예외처리클래스

CUserException

사용자가정의한예외처리클래스

CInternetException

인터넷관련클래스에서발생하는예외처리클래스

CDaoException

DAO 관련클래스에서발생하는예외처리클래스



MFC 예외발생전역함수



요약

내용

AfxThrowArchiveException

직렬화와관련된예외를발생시킨다.

AfxThrowFileException

파일과관련된예외를발생시킨다.

AfxThrowMemoryException

메모리와관련된예외를발생시킨다.

AfxThrowNotSupportedException

메모리와관련된예외를발생시킨다.

AfxThrowResourceException

지원되지않는기능사용에관련된예외를발생시킨다.

AfxThrowUserException

사용자정의예외를발생시킨다.

AfxThrowOleDispatchException

OLE 디스패치와관련된예외를발생시킨다.

AfxThrowOleException

OLE관련된예외를발생시킨다.

AfxThrowDaoException

DAO관련된예외를발생시킨다.

AfxThrowDBException

ODBC관련된예외를발생시킨다.

AfxAbort

어플리케이션을중단종료한다.


'NativeCode > mfc' 카테고리의 다른 글

WM_COPYDATA  (0) 2010.03.18
Message Map  (0) 2010.03.18
MFC Exception 클래스 확장하기  (0) 2010.03.18
TrackPopup  (0) 2010.03.18
Registry 값 읽어오기  (0) 2010.03.18

exception 클래스 확장하기


1.요약 

C++ 표준에는 exception이라는 상위 클래스가 있는데, MFC의 CException 과 같은 역할을 한다고 보시면 됩니다. 

기본적은 exception 을 상속받는 클래스로서 bad_alloc, bad_cast, bad_typeid 등이 있는데, 이상하게도 Visual C++에는 bad_alloc 만 구현하지 않았습니다. 

bad_alloc 은 new 가 실패했을때 던져지도록 약속된 Exception 클래스입니다. 

여기서는 간단하기 bad_alloc을 구현해보겠습니다. 


2.본문 

우선 설명할 내용이 많지 않으므로 소스코드를 보여드리겠습니다. 

#include <new.h> 

#include <exception> 

using namespace std; 



class bad_alloc : public exception 

{ 

public: 

    bad_alloc(const __exString& what_arg) : exception(what_arg) {} 

}; 



int NewHandler(size_t size) 

{ 

    throw bad_alloc("Operator new couldn't allocate memory"); 

    return 0; 

} 



int main(int argc, char* argv[]) 

{ 

    _set_new_handler(NewHandler); 

    _set_new_mode(1);  // use NewHandler for malloc as well 

    .... 

}

이전에 보여드렸던 예제와 크게 다른 점은 없습니다. 

프로그램이 시작할 때( 혹은 각 스레드 엔트리의 처음에서) new handler를 설치해야합니다. 

그리고 _set_new_mode(1); 을 호출함으로써 malloc 역시 new 와 같이 동작하다록 만들 수 있습니다.

보너스로 Exception을 잡으실때(catch) 유의하실 점을 몇가지 적어보겠습니다. 

1. Non-MFC C++ exception 이라면 reference 를 사용하시는 게 좋습니다. 

이렇게 말이죠. 

try { 

    throw MyException(); 

} 

catch(MyException& e) 

{ 

}

이유는 간단합니다. 포인터를 사용한다면 객체를 동적으로 생성/소멸 시키는 루틴이 부가적으로 포함되어야 하기 때문에 안좋을테고, 그냥 MyException 을 사용한다면 추가적인 객체가 생성되고 복사생성자/소멸자가 추가적으로 호출될테니 비효율적이겠죠. 

(참고적으로 dangling reference는 걱정하지 않으셔도 됩니다) 


2. MFC exception 이라면 pointer를 사용해서 잡고, 반드시 Delete() 를 호출해주어야 합니다. 

주의할 점으로는 절대 delete 를 사용해서 해제시켜서는 안됩니다. 
exception이 static object인 경우도 있기 때문입니다.


'NativeCode > mfc' 카테고리의 다른 글

Message Map  (0) 2010.03.18
MFC Exception  (0) 2010.03.18
TrackPopup  (0) 2010.03.18
Registry 값 읽어오기  (0) 2010.03.18
Registry 값 쓰기  (0) 2010.03.18

OnInitDialog에서 메뉴 생성


m_Menu = new CMenu;

m_Menu->LoadMenu( IDR_MENU1 );

pContextMenu = m_Menu->GetSubMenu( 0 );


그 후 OnContextMenu 호출


void CDataBackupDlg::OnContextMenu(CWnd* pWnd, CPoint point)

{

// TODO: 여기에 메시지 처리기 코드를 추가합니다.

pContextMenu->TrackPopupMenu( TPM_LEFTALIGN, point.x, point.y, this );

}
Snap1.bmp Snap2.bmp


Snap4.bmp   


Snap7.bmp Snap5.bmp

Snap6.bmp


'NativeCode > mfc' 카테고리의 다른 글

MFC Exception  (0) 2010.03.18
MFC Exception 클래스 확장하기  (0) 2010.03.18
Registry 값 읽어오기  (0) 2010.03.18
Registry 값 쓰기  (0) 2010.03.18
Static Control 일반적 내용  (0) 2010.03.18

+ Recent posts