달력

5

« 2024/5 »

  • 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

리스트컨트롤을 사용하는데 자동으로 선택해와야 하는 경우가 생겨 찾아보니
데브피아에 저런 내용이 검색되었다

저도 같은 내용을 검색 하다가 다음과 같은 내용을 찾았습니다. 즐프.. ^^;

 ListCtrl::SetSelectionMark(int i)  : i번째 item을 선택하는 것은 맞습니다.

단지 포커스까지 주지 않기때문에 표시(파란줄)가 되지 않을 뿐이지 내부적으로 현재 선택된 아이템은 i번째 아이템입니다.

m_list1.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED)  : 이것만 사용하시면 문제가 발생할 수 있습니다.

내부적으로 자동 선택된 아이템의 인덱스와 표시(파란줄)된 아이템의 인덱스가 달라질 수 있거든요..
표시된 아이템을 삭제하려고 삭제 버튼을 눌렀는데 딴 아이템이 삭제되는 일이  생길 수 있겠죠..

그래~서 이렇게 사용하시면 깔끔하실 듯 싶습니다.^^호호

m_cListCtrl.SetSelectionMark(i);
m_cListCtrl.SetItemState(i, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
m_cListCtrl.SetFocus();


깔끔하게 해결되는구만 -ㅂ-;
:
Posted by Lunaness
리스트 뷰를 추가되는 데이터 때문에 항상 아래를 보이게 해야 하는 상황이 나왔다

데브피아를 찾아보니

EnsureVisible() 쓰라능~!

라고 나와있길레.......

pListView->SetScrollPos(SB_VERT, pListView->GetListCtrl().GetItemCount());
pListView->GetListCtrl().EnsureVisible(pListView->GetListCtrl().GetItemCount() - 1, true);

이렇게 써봤더니..  엄청난 깜박임이 발생하였다 |||orz


그래서 다시 찾은 방법이
pListView->SendMessage(WM_VSCROLL,SB_BOTTOM,NULL);
간단하게 해결 되는군;;

정보출처 : 현덕군
:
Posted by Lunaness
BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg)
{
 if( pMsg->hwnd == m_List_Explorer.m_hWnd )
 {
  if(pMsg->message == WM_KEYDOWN)
  {
   if(::GetKeyState(VK_CONTROL) < 0 && pMsg->wParam == 'A')
   {
    for (int i=0; i<m_List_Explorer.GetItemCount(); i++)
     m_List_Explorer.SetItemState(i, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
     
    return TRUE;
   }
  }
 }
 
 return CDialog::PreTranslateMessage(pMsg);
}

대략 이런식이다...
:
Posted by Lunaness
루프문을 이용해서 처리를 하다보면
부득이하게 루프문을 강제 종료시켜야 할 때가 있다

내부적으로 처리하다가 FALSE뜨면 종료되겠지만
그게 아니라면 사용자가 직접 루프문 탈출을 걸어줘야 하는데
처리량이 많은 루프문이면 키보드 입력 이벤트를 감지 못한다

그때 이걸 쓰자

for (;;)
{
     if (GetAsyncKeyState(VK_ESCAPE)) break;
     /* 처리할 것 들 */
}


간단한 게임들이 대부분 이걸 쓴다고 한다;

뭐 복잡찬란한 프로그램들은 Direct Input을 쓴다는데....
여기서는 그건 필요 없으니 Pass~!

무조건 탈출하게 되어있지만, 조금만 수정하면 1회 진행까지는 하게 할 수 있다

BOOL bLoop = TRUE;
while(bLoop)
{
     if (GetAsyncKeyState(VK_ESCAPE)) bLoop = FALSE;
     /* 처리할 것 들 */
}

중지 명령이 떨어져도 하던건 마무리 하고 종료한다

Do~While 써도 된다고 하는데 뭐...
그거야 생각대로 하면 되고~
:
Posted by Lunaness

StretchBlt()를 이용할 때 기본으로 사용하면서 축소하면 엄청난 깨짐 현상이 보인다

사용자 삽입 이미지

이러한 현상을 방지하기 위해
SetStretchBltMode(hdc, iMode)로 iMode를 정의해 줘야 한다
(출처 : 데브피아 - 안영석 님)

찾아보니 StretchBlt() API를 사용할 때 SetStretchBltMode(hdc, iMode); 로 mode를 정해줄 수 있네요..
iMode 값은 다음 중 한개가 될 수 있구요.
* BLACKONWHITE : 논리 AND연산 수행/흰색배경에 검정색으로 되어있는 흑백 비트맵에 적당.
* WHITEONBLACK : 논리 OR연산 수행/흰색 배경에 검정색으로 되어있는 흑백 비트맵에 적당.
* COLORONCOLOR : 논리연산 하지 않음/컬러 비트맵에서 가장 좋은 접근 방법이라네요.^^
* HALFTONE : 반색조 형태.
저는 사진을 띄울거라서 coloroncolor을 사용했더니 바로 잘 나오네요.ㅎㅎ
ex)
pDC->SetStretchBltMode(COLORONCOLOR);  // set iMode.
pDC->StretchBlt(nX, nY, button.width, button.height, &tempDC, 0,0, BMPWIDTH, BMPHEIGHT, SRCCOPY);  // Draw


<원본사진>

사용자 삽입 이미지

<기본 설정 - 정의를 하지 않은 경우 or BLACKONWHITE 를 줬을경우>
사용자 삽입 이미지

<설정 - WHITEONBLACK를 적용>
사용자 삽입 이미지

<설정 - COLORONCOLOR>
사용자 삽입 이미지

<설정 - HALFTOME 적용>
사용자 삽입 이미지



:
Posted by Lunaness