블로그 이미지
smstock

카테고리

분류 전체보기 (54)
취미 (8)
공부 (32)
낙서장 (12)
Total
Today
Yesterday

달력

« » 2024.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

공지사항

태그목록

최근에 올라온 글

'분류 전체보기'에 해당되는 글 54건

  1. 2009.03.31 [MFC] ListCtrl
  2. 2009.03.29 [퓨전] 이계독존기 1
  3. 2009.03.29 풍선 터트리기
  4. 2009.03.29 Age of war

[MFC] ListCtrl

공부/프로그램 / 2009. 3. 31. 13:43

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

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

9. List Control의 0번째 컬럼 사이즈 변경하지 못 하도록 프로그래밍

10. List Control 에 다른 Control 넣기

11. List Control 행크기 늘리기

12. List Control 에서 시스템 아이콘 사용하기

 

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);


void SetCurSel(int nIndex, BOOL bIsTrue)
{
 SetItemState(nIndex, bIsTrue ? LVIS_SELECTED | LVIS_FOCUSED : 0, LVIS_SELECTED | LVIS_FOCUSED);
}

9. List Control의 0번째 컬럼 사이즈 변경하지 못 하도록 프로그래밍

----------------------------------------------------------------------
BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{

/* 

    //사이즈가 80 이하 안되게 만든다.

    HD_NOTIFY   *pHDN = (HD_NOTIFY*)lParam;

 

    if((pHDN->hdr.code == HDN_ITEMCHANGINGW || pHDN->hdr.code == HDN_ITEMCHANGINGA)

        && pHDN->pitem->cxy < 80)

    {

        *pResult = TRUE;                // disable change

        return TRUE;                    // Processed message

    }*/

 

 

/*  // 컬럼 사이즈 변경 못하게 만든다.

    // 모든 칼럼.

    switch (((NMHDR*)lParam)->code)

    {

        case HDN_BEGINTRACKW:

        case HDN_BEGINTRACKA:

            *pResult = TRUE;                // disable tracking

            return TRUE;                    // Processed message

        default: break;

    }

 

    // 특정 칼럼.

    HD_NOTIFY   *pHDN = (HD_NOTIFY*)lParam;

 

    if((pHDN->hdr.code == HDN_BEGINTRACKW || pHDN->hdr.code == HDN_BEGINTRACKA)

            && pHDN->iItem == 0)            // Prevent only first (col# 0) from resizing

    {

        *pResult = TRUE;                // disable tracking

        return TRUE;                    // Processed message

    }*/

 

    return CListCtrl::OnNotify(wParam, lParam, pResult);

}


 

10. List Control 에 다른 Control 넣기

 ----------------------------------------------------------------------
1. 요약
 특정 Column에서 다른 Control 을 띄우는 방법 설명. 여기서 사용한 방법은 현재 Cursor가 있는 위치를 파악한후 그 위치에 적당한 크기의 Edit Control를 생성 시킨다.

2. 본문
1) CListCtrl를 상속받는 CMyList라는 Class를 만든다.
2) Member변수로 CEdit m_ctrEdit를 선언한다.
3) Member함수로 OnLButto
nDown()과 GetSubItemFrompt(point, nItem, nSubItem, rcClient)를 선언 OnLButtonDown() : Edit Control를 생성/삭제 시키는 역할 GetSubItemFrompt(): 현재 Cursor가 있는 곳의 List정보를 가져온다.
4) 함수 내용을 구성한 후(예제 참조) 사용은 CListCtrl m_ctrList에서 CListCtrl ---> CMyList로 바꿔 주면 된다. 3.예제
실제로 클래스를 구성하면 다음과 같다.

class CMyList : public COXGridList

{

// Construction

public:

CMyList();



// Attributes

public:

CEdit m_ctrEdit;



// Operations

public:

void GetSubItemFrompt(Cpoint point, int &nItem,int&nSubItem,CRect&rect);



//Overrides

//ClassWizardgeneratedvirtualfunctionoverrides

//{{AFX_VIRTUAL(CMyList)

//}}AFX_VIRTUAL



//Implementation

public:

virtual~CMyList();



//Generatedmessagemapfunctions

protected:

//{{AFX_MSG(CMyList)

afx_msg
voidOnLButtonDown(UINTnFlags,Cpointpoint);

//}}AFX_MSG



DECLARE_MESSAGE_MAp()

};





CMyList::CMyList()

{

}



CMyList::~CMyList()

{

}





BEGIN_MESSAGE_MAp(CMyList,COXGridList)

//{{AFX_MSG_MAp(CMyList)

ON_WM_LBUTTONDOWN()

//}}AFX_MSG_MAp

END_MESSAGE_MAp()



/////////////////////////////////////////////////////////////////////////////

//CMyListmessagehandlers



voidCMyList::OnLButtonDown(UINTnFlags,Cpointpoint)

{

intnItem,nSubItem;

CRectrcClient;



//현재 point의 영역 정보를 가져온다.

GetSubItemFrompt(point, nItem, nSubItem, rcClient);



// 두번째 SubItem일(두번째 Column) 경우에만 나타나게 함.

if (nSubItem == 1)

{

if (m_ctrTimeEdit.m_hWnd == NULL)

{

// Mask Edit Control 생성

m_ctrEdit.Create

(WS_CHILD|WS_VISIBLE|WS_TABSTOp|WS_BORDER|WS_HSCROLL,

CRect(
0, 0, 30, 10), this, 1);



m_ctrEdit.MoveWindow(rcClient);

m_ctrEdit.ShowWindow(SW_SHOW);



}

else

{

m_ctrTimeEdit.MoveWindow(rcClient);

m_ctrTimeEdit.ShowWindow(SW_SHOW);

}

}

else

{

if (m_ctrTimeEdit.m_hWnd != NULL)

{

m_ctrTimeEdit.ShowWindow(SW_HIDE);

}

}



CListCtrl::OnLButtonDown(nFlags, point);

}



void CMyList::GetSubItemFrompt(Cpoint point, int &nItem, int &nSubItem, CRect &rect)

{

LVHITTESTINFO lvhti;



// Clear the subitem text the user clicked on.

lvhti.pt = point;

SubItemHitTest(&lvhti);



nItem = lvhti.iItem;

nSubItem = lvhti.iSubItem;

GetSubItemRect(nItem, nSubItem, LVIR_LABEL, rect);

}

4. 참고 마우스를 더블 클릭하는 순간에 나타나게 하고 싶다면 마우스 더블 클릭 함수에서 구현해 주면 된다. 몇가지 함수만 추가하면 특정 Column에서만 Control이 나타나게 하는 것을 쉽게 구현 할 수 있을 것이다. - 2001.08.06 Smile Seo -


11. List Control 행크기 늘리기

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

CImageList m_image;

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

을 써서 Y 크기를 조절해서 크기를 바꿀 수 있습니다.

12. List Control 에서 시스템 아이콘 사용하기

 ----------------------------------------------------------------------
CImageList m_ImgList;

HIMAGELIST  hSystemSmallImageList;
SHFILEINFO  ssfi;

hSystemSmallImageList =
(HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C:\\"), 0, &ssfi, sizeof(SHFILEINFO),
        SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

m_ImgList.Attach(hSystemSmallImageList);
m_listDir.SetImageList(&m_ImgList, LVSIL_SMALL);

// 이부분을 넣지 않으면 여러번 리스트컨트롤이 나타날때 이미지가 사라진다.
HWND hList = m_listDir.GetSafeHwnd();
DWORD dwCurrentStyle=GetWindowLong(hList, GWL_STYLE);
dwCurrentStyle |= LVS_SHAREIMAGELISTS;
SetWindowLong(hList, GWL_STYLE, dwCurrentStyle);


// 나중에 InsertItem으로 아이템 추가시 이미지 번호에 아래 함수를 호출하여 얻은 리턴값을 사용한다.
int CSystemListCtrl::GetIconIndex(const CString& csFileName)  //full path and file name
{              
 SHFILEINFO    sfi;
 
 SHGetFileInfo(
   (LPCTSTR)csFileName,
   0,
   &sfi,
   sizeof(SHFILEINFO),
   SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
 
 return sfi.iIcon;
}

Posted by smstock
, |

---------------------------------------------------------------------------------------------------------
평범한 건축학도 군천악.
차원이동이라는 생각지도 못한 일을 경험한 후 상상할 수 없는 힘을 얻게 된다.
그러나 그로 인해 남겨진 것은 피로 점철된 혈투와 잔인하고 광폭한 흉성만이 자리잡게
되었다.
어느 순간 천악은 사람이 아니라는 생각이 들었다.
그는 사람이고 싶었다.
이기적이지만 자신이 하고 싶은 일을 하는 그런 사람 말이다.
야수와 같은 천악이 다시 사람이 되기 위한 일대기가 시작된다.
지고의 경지에 이른 강인함과 더불어 드래곤의 마력까지 가진 천악을 방해하는 자는 모두 지옥의 불구덩이에 처박히게 된다.
"나는 내가 가고 싶은 길을 간다. 그 길을 방해하는 자는 그냥 두지 않는다!"

-내 앞길을 막지 마라! 그날이 네놈들의 제삿날이다. [인터파크 제공]
---------------------------------------------------------------------------------------------------------
9권 완결
평점 : 4 (10점 만점) - 킬링타임용


친구가 보내줘서 받아놔 놓았다가 얼마 전에 펼쳐본 소설이다.

위에 책 설명만 봐도 알겠지만 슈퍼 먼치킨이될 주인공이 현실에서 무협세계로 넘어와 드래곤의 힘을 얻고 소설이 시작된다.

뭐 몇장 넘기면 바로 몇십년 후가 되고 이미 먼치킨이 되어져 있으니 시작부터 그냥 세다고 생각하면 될듯 싶다.

특이한 점은 소설의 주인공이 사람을 죽이는 것을 아무렇지도 않게 생각하기 때문에 시원시원하다는 점.(귀찮게 하면 다 죽임)

또 소설 남자 주인공의 대부분이 여자한테 휘둘리는 것에 비해서 그렇지 않다는 것.

이미 너무 쎄기 때문에 갈등도 없고 최종 보스가 누구인지 힌트를 조금씩 주는데 그 힌트가 너무 노골적이라 누구나 다 눈치챌 수 있으며

스토리 진행은 뻔하게 보인다.(주인공의 집을 꾸미는 내용 아니면 싸우는 내용임)


먼치킨 매니아인 사람, 속이 답답한 사람, 빠른 진행을 보고 싶은 사람, 시간이 많은 사람..

이런 사람들이 볼만 한 소설
Posted by smstock
, |

이게 게임 이름인지는 모르겠지만 풍선을 터트리는 게임이라 이렇게 이름 지었다.

조작법은 단순하게 각도와 파워 조절을 통해 다트를 던져서 풍선을 터트리는 게임인데 생각보다 난이도가 있는 게임이다

물론 시간을 투자하면 금방 깰지도 모르지만.. 50레벨까지 있다고 하니 한번 도전해보는 것도 괜찮을 듯

나는 21Level에서 어떻게 깨는지 몰라서 포기했다...

Posted by smstock
, |

Age of war

취미/특이한 게임 / 2009. 3. 29. 21:13

디펜스류의 플래시 게임으로 자신의 시대를 발전 시키면서 상대 본진을 부수는게 목적이다.

시대를 발전시킨다는 테마가 들어있어서 다양한 유닛들이 나오지만 해보면 이미지만 다르다는 것을 알 수 있게 된다.

시대를 발전시키는 것은 경험치를 통해서 이루어 지게 되어 있는데 일정 숫자의 적을 죽이면 얻을 수 있는 사항이라
 
병력의 양인지 질인지의 선택의 문제가 아니라는 것이 아쉬운 게임.

Posted by smstock
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함