프로그래밍 - Windows/MFC

CListCtrl에서 전체 선택하도록 하는 법


Report형식으로 된 CListCtrl 컨트롤을 기본 사용할 때의 팁.

기본세팅은 마우스 버튼을 클릭하면 맨 처음 열의 원소만 선택되지만,

아래와 같이 사용하는 Dialog에서 초기화 시켜줄 경우 전체 선택이 된다.

DWORD style = LVS_EX_FULLROWSELECT;
m_list.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LPARAM(style));


top

프로그래밍 - Windows/MFC

MFC의 CAsyncSocket 대용 소켓.


며칠전에 발생했던 듀얼 씨피유에서 발생되던 패킷 에러 문제를 해결하기 위해 Winsock2 API를 사용하기로 했으나, 바꿔야할 소스의 양이 상당히 많다는 걸 깨달았다. 다행히도 문제가 된 프로그램은 구조적으로 CSocket를 상속한 클래스였기 때문에 , CSocket (정확히는 CAsyncSocket)을 대체하는 클래스를 만들어 해결했다.
앞으로 클라이언트 소켓 짤때 종종써야지~


사용법 :
1. stdafx.h에 아래의 코드를 추가한다.

#include <winsock2.h>
#pragma comment(lib, "Ws2_32.lib")

2. 초기화 부분에
 CString tmp = _T("");
 WSADATA WsaData;
 if(::WSAStartup(MAKEWORD(2, 2), &WsaData))
 {
  tmp.Format("윈속을 초기화 하는데 실패했습니다. [ERROR CODE:%d]",
              ::WSAGetLastError());
  AfxMessageBox(tmp);
  return FALSE;
 }
를 추가한다.

3. CSocket을 상속받아 썼던 소켓클래스를 다음과 같이 변경했다.
class CDataSocket : public CSocket
->  class CDataSocket : public CAsyncSocketBase

동작 원리 : 별도의 Thread를 생성하여 WSAWaitForMultipleEvents으로 SOCEKT의 FD_READ와 FD_CLOSE를 잡아내어 OnClose, OnReceive 함수를 실행시킨다. virtual로 되어있어서
일반 CSocket사용과 동일하게 사용


1차 버젼으로 자주 쓰는 함수들만 작성해 놓았다.

그 외 CSocket(혹은 CAsyncSocket)에 있는 함수들은 시간날때 작성해 보도록 하자!
top

프로그래밍 - Windows/Win32 API

윈도우 메시지 WM_SYSCOMMAND

윈도우 API에도 잘 나와있고 MSDN 설명에도 잘 나와있는 WM_SYSCOMMAND 메시지.

키 입력등을 받는 WM_COMMAND와 달리 시스템 명령을 받아 들이는 메시지로서

Alt + F4 명령같이 일반적인 키 입력과는 다른 별개의 메시지를 찾아낼 때 쓰인다고 보면 될거다.

잠깐 헤메였던 이유 : MSDN의 정의에는 다음과 같다.
WM_SYSCOMMAND uCmdType = wParam;   xPos = LOWORD(lParam);   yPos = HIWORD(lParam);
실제 이 값의 하위 4비트는 시스템이 내부적으로 사용하는 값이므로 명령의 종류를 알고 싶으면 wParam을 0xFFF0와 AND연산해야 한다.

따라서 wParam & 0xFFF0 을 해야 한다.

하지만 API 프로그래밍과 다르게 MFC의 경우 파라미터가 달라 약간의 혼돈이 온다.

MFC에서는
afx_msg void OnSysCommand(   UINT nID,   LPARAM lParam );

이라고 언급되어있다.
하지만 UINT의 데이터 타입과 WPARAM의 실제 데이터 크기는 같다.
단지 MFC에서는 이름만 바뀌었을뿐이다.

따라서 MFC에서 SysCommand에서의 메시지를 알고 싶으면

nID & 0xFFF0 의 값을 참조하면 된다.

'프로그래밍 - Windows > Win32 API' 카테고리의 다른 글

WM_QUERYENDSESSION과 WM_ENDSESSION  (0) 2007/03/23
display 해상도 변경하기  (0) 2006/09/04
윈도우 메시지 WM_SYSCOMMAND  (0) 2006/09/01
Win32 Message 모음  (0) 2006/08/31
top