프로그래밍 - 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/MFC

클라이언트 프로그램 짤때의 충고!!

절대! 간단한 프로그램을 짜더라도 간편하다는 이유로 MFC의 CSocket으로 짜는 짓은 하지 말자!
이전 싱글 코어 개발환경에서 별탈없이 잘 돌아가길래 CSocket을 이용하여 프로그램을 작성하였다. 개발환경 업그레이드 차원에서 듀얼코어 컴퓨터로 갈아 타서 프로그램을 돌려보니 이게 왠 걸..ㅡ.- 패킷이 정상적으로 통신이 되지 않는다.
혹시나 해서 관련 문서들을 찾아 봤더니 떡하니 이렇게 나와있다.
Microsoft provides a CSocket class for TCP/IP programming. Unfortunately the CSocket class is not thread-safe. (now you know why I presented the "bare" socket API instead of the MFC class.)
.....

개발하기 전엔 관련 문서를 찾아보자..

top

프로그래밍 - Windows/Win32 API

WM_QUERYENDSESSION과 WM_ENDSESSION

운영체제가 종료되는 시점에 A란 작업을 처리해주고,
A작업이 종료되어야지만 운영체제가 종료하도록 수정을 하기 위해 문서들을 뒤적거렸다.
그러다가 메시지 WM_QUERYENDSESSION과 WM_ENDSESSION을 찾아냈다.

운영체재를 사용하는 사용자의 세션이 종료될 때 발생하는 이벤트로서, WM_QUERYENDSESSION으로 종료 여부를 묻고, 모든 프로세스에서 TRUE를 리턴했을 경우에만 (정확히는 일정 시간 내에 FALSE를 리턴하지 않았을 때만) WM_ENDSESSION을 발생시키게 된다.
그런데 내가 하고 싶었던 작업을 처리하기 위해서는 WM_QUERYENDSESSION가 발생하였을 때나 WM_ENDSESSION이 발생하였을 때 함수를 처리해야 하는데, 이 함수의 처리 시작이 짧지 않아서 모든 명령이 실행되기도 전에 윈도우가 끝나버린다.
따라서  WM_QUERYENDSESSION 에서  일단 FALSE를 리턴하여 종료를 막고, 내가 원하는 함수를 실행 시킨 뒤에 윈도우를 종료하던, 로그오프 시키던 재부팅하던 해야 한다.
WinAPI.co.kr에 나와있는 문서를 보면, (또한 테스트를 해 보면) 아래와 같은 인수로 인해 로그오프와 셧다운을 구별 할 수 있다.

Winapi.co.kr 에서 발췌

lParam : 로그오프를 하는 것인지 시스템 셧다운을 하는 것인지를 나타낸다. 이 값이 0이면 시스템을 완전히 종료하는 것이며 ENDSESSION_LOGOFF 플래그가 설정되어 있으면 로그오프만 하는 것이다. 이 값은 비트 필드이므로 반드시 & 연산자로 플래그의 존재 유무를 점검해야 한다.


자.. 문제는 지금부터. ENDSESSION_LOGOFF 가 설정되어있으면 이것은 사용자 로그오프를 선택한 작업이라는 것을 알 수 있다. 하지만 사용자가 Reboot을 결정한건지 off를 선택한것인지는 알아낼 방법이 없다...ㅡ.-;;
저걸 찾을려고 몇시간 동안 고생했는데 해답은 "윈도우 전원관리자 부분을 찾아보세요" OR "WMI에 그런 기능이 있는거 같아요" 라는 답뿐...

뭐 좋은 방법 없나?ㅡㅡ;

'프로그래밍 - 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

프로그래밍 - Windows/Win32 API

display 해상도 변경하기

1. EnumDisplaySettings 으로 현재 디스플레이 정보 얻어오기

  • 현재  display 정보 얻기 예제

  DEVMODE dm;   // initialize the DEVMODE structure
  ZeroMemory(&dm, sizeof(dm));
  dm.dmSize = sizeof(dm);

  if (0 != EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm))
  {

  }

  • 사용가능한 display  정보 얻기 예제

  int index = 0;
  DEVMODE dm;
  // initialize the DEVMODE structure
  ZeroMemory(&dm, sizeof(dm));
  dm.dmSize = sizeof(dm);

  while (0 != EnumDisplaySettings(NULL, index++, &dm))
  {
 
  }

2. ChangeDisplaySettings을 이용하여 디스플레이 모드 변경

DEVMODE 의 정보를 변경.

MemberMeaning
dmBitsPerPelBits per pixel
dmPelsWidthPixel width
dmPelsHeightPixel height
dmDisplayFlagsMode flags
dmDisplayFrequencyMode frequency
dmPosition Windows 98/Me, Windows 2000/XP: Position of the device in a multimonitor configuration

ChangeDisplaySettings(&mode,0); 이용하여 변경

ChangeDisplaySettings(NULL,0); 를 이용할 경우 변경 이전 상태로 돌아감.

'프로그래밍 - 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

프로그래밍 - 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

프로그래밍 - Windows/Win32 API

Win32 Message 모음

(define WM_NULL                         #x0000)
(define WM_CREATE                       #x0001)
(define WM_DESTROY                      #x0002)
(define WM_MOVE                         #x0003)
(define WM_SIZE                         #x0005)
(define WM_ACTIVATE                     #x0006)
(define WA_INACTIVE     0)
(define WA_ACTIVE       1)
(define WA_CLICKACTIVE  2)
(define WM_SETFOCUS                     #x0007)
(define WM_KILLFOCUS                    #x0008)
(define WM_ENABLE                       #x000A)
(define WM_SETREDRAW                    #x000B)
(define WM_SETTEXT                      #x000C)
(define WM_GETTEXT                      #x000D)
(define WM_GETTEXTLENGTH                #x000E)
(define WM_PAINT                        #x000F)
(define WM_CLOSE                        #x0010)
(define WM_QUERYENDSESSION              #x0011)
(define WM_QUIT                         #x0012)
(define WM_QUERYOPEN                    #x0013)
(define WM_ERASEBKGND                   #x0014)
(define WM_SYSCOLORCHANGE               #x0015)
(define WM_ENDSESSION                   #x0016)
(define WM_SHOWWINDOW                   #x0018)
(define WM_WININICHANGE                 #x001A)
(define WM_SETTINGCHANGE                WM_WININICHANGE)
(define WM_DEVMODECHANGE                #x001B)
(define WM_ACTIVATEAPP                  #x001C)
(define WM_FONTCHANGE                   #x001D)
(define WM_TIMECHANGE                   #x001E)
(define WM_CANCELMODE                   #x001F)
(define WM_SETCURSOR                    #x0020)
(define WM_MOUSEACTIVATE                #x0021)
(define WM_CHILDACTIVATE                #x0022)
(define WM_QUEUESYNC                    #x0023)
(define WM_GETMINMAXINFO                #x0024)
(define WM_PAINTICON                    #x0026)
(define WM_ICONERASEBKGND               #x0027)
(define WM_NEXTDLGCTL                   #x0028)
(define WM_SPOOLERSTATUS                #x002A)
(define WM_DRAWITEM                     #x002B)
(define WM_MEASUREITEM                  #x002C)
(define WM_DELETEITEM                   #x002D)
(define WM_VKEYTOITEM                   #x002E)
(define WM_CHARTOITEM                   #x002F)
(define WM_SETFONT                      #x0030)
(define WM_GETFONT                      #x0031)
(define WM_SETHOTKEY                    #x0032)
(define WM_GETHOTKEY                    #x0033)
(define WM_QUERYDRAGICON                #x0037)
(define WM_COMPAREITEM                  #x0039)
(define WM_COMPACTING                   #x0041)
(define WM_WINDOWPOSCHANGING            #x0046)
(define WM_WINDOWPOSCHANGED             #x0047)
(define WM_POWER                        #x0048)
(define PWR_OK              1)
(define PWR_FAIL           -1)
(define PWR_SUSPENDREQUEST  1)
(define PWR_SUSPENDRESUME   2)
(define PWR_CRITICALRESUME  3)
(define WM_COPYDATA                     #x004A)
(define WM_CANCELJOURNAL                #x004B)
(define WM_NOTIFY                       #x004E)
(define WM_INPUTLANGCHANGEREQUEST       #x0050)
(define WM_INPUTLANGCHANGE              #x0051)
(define WM_TCARD                        #x0052)
(define WM_HELP                         #x0053)
(define WM_USERCHANGED                  #x0054)
(define WM_NOTIFYFORMAT                 #x0055)
(define NFR_ANSI          1)
(define NFR_UNICODE       2)
(define NF_QUERY          3)
(define NF_REQUERY        4)
(define WM_CONTEXTMENU                  #x007B)
(define WM_STYLECHANGING                #x007C)
(define WM_STYLECHANGED                 #x007D)
(define WM_DISPLAYCHANGE                #x007E)
(define WM_GETICON                      #x007F)
(define WM_SETICON                      #x0080)
(define ICON_SMALL          0)
(define ICON_BIG            1)
(define WM_NCCREATE                     #x0081)
(define WM_NCDESTROY                    #x0082)
(define WM_NCCALCSIZE                   #x0083)
(define WM_NCHITTEST                    #x0084)
(define WM_NCPAINT                      #x0085)
(define WM_NCACTIVATE                   #x0086)
(define WM_GETDLGCODE                   #x0087)
(define WM_NCMOUSEMOVE                  #x00A0)
(define WM_NCLBUTTONDOWN                #x00A1)
(define WM_NCLBUTTONUP                  #x00A2)
(define WM_NCLBUTTONDBLCLK              #x00A3)
(define WM_NCRBUTTONDOWN                #x00A4)
(define WM_NCRBUTTONUP                  #x00A5)
(define WM_NCRBUTTONDBLCLK              #x00A6)
(define WM_NCMBUTTONDOWN                #x00A7)
(define WM_NCMBUTTONUP                  #x00A8)
(define WM_NCMBUTTONDBLCLK              #x00A9)
(define WM_KEYFIRST                     #x0100)
(define WM_KEYDOWN                      #x0100)
(define WM_KEYUP                        #x0101)
(define WM_CHAR                         #x0102)
(define WM_DEADCHAR                     #x0103)
(define WM_SYSKEYDOWN                   #x0104)
(define WM_SYSKEYUP                     #x0105)
(define WM_SYSCHAR                      #x0106)
(define WM_SYSDEADCHAR                  #x0107)
(define WM_KEYLAST                      #x0108)
(define WM_IME_STARTCOMPOSITION         #x010D)
(define WM_IME_ENDCOMPOSITION           #x010E)
(define WM_IME_COMPOSITION              #x010F)
(define WM_IME_KEYLAST                  #x010F)
(define WM_INITDIALOG                   #x0110)
(define WM_COMMAND                      #x0111)
(define WM_SYSCOMMAND                   #x0112)
(define WM_TIMER                        #x0113)
(define WM_HSCROLL                      #x0114)
(define WM_VSCROLL                      #x0115)
(define WM_INITMENU                     #x0116)
(define WM_INITMENUPOPUP                #x0117)
(define WM_MENUSELECT                   #x011F)
(define WM_MENUCHAR                     #x0120)
(define WM_ENTERIDLE                    #x0121)
(define WM_CTLCOLORMSGBOX               #x0132)
(define WM_CTLCOLOREDIT                 #x0133)
(define WM_CTLCOLORLISTBOX              #x0134)
(define WM_CTLCOLORBTN                  #x0135)
(define WM_CTLCOLORDLG                  #x0136)
(define WM_CTLCOLORSCROLLBAR            #x0137)
(define WM_CTLCOLORSTATIC               #x0138)
(define WM_MOUSEFIRST                   #x0200)
(define WM_MOUSEMOVE                    #x0200)
(define WM_LBUTTONDOWN                  #x0201)
(define WM_LBUTTONUP                    #x0202)
(define WM_LBUTTONDBLCLK                #x0203)
(define WM_RBUTTONDOWN                  #x0204)
(define WM_RBUTTONUP                    #x0205)
(define WM_RBUTTONDBLCLK                #x0206)
(define WM_MBUTTONDOWN                  #x0207)
(define WM_MBUTTONUP                    #x0208)
(define WM_MBUTTONDBLCLK                #x0209)
(define WM_MOUSELAST                    #x0209)
(define WM_PARENTNOTIFY                 #x0210)
(define MENULOOP_WINDOW   0)
(define MENULOOP_POPUP    1)
(define WM_ENTERMENULOOP                #x0211)
(define WM_EXITMENULOOP                 #x0212)
(define WM_NEXTMENU                     #x0213)
(define WM_SIZING                       #x0214)
(define WM_CAPTURECHANGED               #x0215)
(define WM_MOVING                       #x0216)
(define WM_POWERBROADCAST               #x0218)
(define WM_DEVICECHANGE                 #x0219)
(define WM_IME_SETCONTEXT               #x0281)
(define WM_IME_NOTIFY                   #x0282)
(define WM_IME_CONTROL                  #x0283)
(define WM_IME_COMPOSITIONFULL          #x0284)
(define WM_IME_SELECT                   #x0285)
(define WM_IME_CHAR                     #x0286)
(define WM_IME_KEYDOWN                  #x0290)
(define WM_IME_KEYUP                    #x0291)
(define WM_MDICREATE                    #x0220)
(define WM_MDIDESTROY                   #x0221)
(define WM_MDIACTIVATE                  #x0222)
(define WM_MDIRESTORE                   #x0223)
(define WM_MDINEXT                      #x0224)
(define WM_MDIMAXIMIZE                  #x0225)
(define WM_MDITILE                      #x0226)
(define WM_MDICASCADE                   #x0227)
(define WM_MDIICONARRANGE               #x0228)
(define WM_MDIGETACTIVE                 #x0229)
(define WM_MDISETMENU                   #x0230)
(define WM_ENTERSIZEMOVE                #x0231)
(define WM_EXITSIZEMOVE                 #x0232)
(define WM_DROPFILES                    #x0233)
(define WM_MDIREFRESHMENU               #x0234)
(define WM_MOUSEHOVER                   #x02A1)
(define WM_MOUSELEAVE                   #x02A3)
(define WM_CUT                          #x0300)
(define WM_COPY                         #x0301)
(define WM_PASTE                        #x0302)
(define WM_CLEAR                        #x0303)
(define WM_UNDO                         #x0304)
(define WM_RENDERFORMAT                 #x0305)
(define WM_RENDERALLFORMATS             #x0306)
(define WM_DESTROYCLIPBOARD             #x0307)
(define WM_DRAWCLIPBOARD                #x0308)
(define WM_PAINTCLIPBOARD               #x0309)
(define WM_VSCROLLCLIPBOARD             #x030A)
(define WM_SIZECLIPBOARD                #x030B)
(define WM_ASKCBFORMATNAME              #x030C)
(define WM_CHANGECBCHAIN                #x030D)
(define WM_HSCROLLCLIPBOARD             #x030E)
(define WM_QUERYNEWPALETTE              #x030F)
(define WM_PALETTEISCHANGING            #x0310)
(define WM_PALETTECHANGED               #x0311)
(define WM_HOTKEY                       #x0312)
(define WM_PRINT                        #x0317)
(define WM_PRINTCLIENT                  #x0318)
(define WM_HANDHELDFIRST                #x0358)
(define WM_HANDHELDLAST                 #x035F)
(define WM_AFXFIRST                     #x0360)
(define WM_AFXLAST                      #x037F)
(define WM_PENWINFIRST                  #x0380)
(define WM_PENWINLAST                   #x038F)
(define WM_NETCONNECT                   #x03FE)
(define WM_HIBERNATE                    #x03FF)
(define WM_USER                         #x0400)
(define WM_APP                          #x8000)

'프로그래밍 - 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