C++프로그래밍/MFC 14

토글 메뉴 만들기

토글 메뉴ㆍ 사용자 메뉴에 메뉴가 100개가있든 1000개가있든 하나만 선택해도 Update가 호출이 된다. (있는게 모두 다 호출이 된다)ㆍ 따라서 꼭 필요한 경우가 아니면 호출해줄 필요가 없다.. #실습ㆍ 커맨드와 업데이트를 생성해주고 차이를 보자디버그를 돌리면 버튼을누를때 저 메세지가 호출이된다.ㆍ 실습이기때문에 전역변수로 한거지 웬만하면 전역변수는 쓰지말자. 정 필요하면pch에...   ㆍ 다른종류의 토글도 이런식으로 간단하게 구현할 수 있다.

다른 메뉴 실행하기와 바로 가기 키 (단축키)

▶ 다른 메뉴 실행하기 PostMessage()ㆍ 기존 콜백 구조를 PostMessage()를 통해 하면 메시지큐에 메시지를 넣어준다. ㆍ 하지만 SendMessage()는 메시지 큐를 거치지 않고 바로 실행된다.★ 즉 뭔가 메시지를 보내야 할 떄는 PostMessage를 활용해 주자ㆍ 멀티스레딩 환경 프로그래밍 할때 SendMessage를 쓰면 높은확률로 오류난다ㆍ 이런 장난을 쳐보면 PostMessage를 클릭했을 때 1번메뉴가 실행됨ㆍ win32스타일은 이렇게 작성할 수도 있겠다  ※ 완전히 메시지 기반이네 정말로.... win32보다 쓰기도 훨신 편한듯? 바로 가기 키ㆍ 아주 간단하게 할수있다 ㆍ 캡션에서 그냥 이런식으로 명령어를 작성하면 다 된다.여기서 단축키를 추가할 수 있다. 지우는거도 심플..

핸들러 관련해 발생할 수 있는 실수

▶ 등록된 핸들러 삭제ㆍ 위 단계대로 삭제를 해주자. 습관화하자 나올수있는 상황ㆍ View에 해야되는데 빨리하다 실수로 CAboutDlg에 함수를 만들어버렷다??ㆍ 비활성화 되어있고, 삭제해야된다.ㆍ 여기들어가면 지울수는 있다. 3군대를 수작업으로 삭제해주자.ㆍ 뭐 사실 이 케이스는 더러운걸 지우는 느낌이지만.. ㆍ 함수를 삭제하지 않고 리소스뷰에서 저걸 삭제해버리면??? 에러가 안나버린다..ㆍ 메시지 맵에 연동이 코드상으로는 잘 되어있을거고 당연히 잘 나올것이다,,, 근데 이 코드는 불릴 가능성이 이제 0%다ㆍ 그러다 다른곳에서 또 New Test로 만들어버리면 또 이상하게 작동하고 그렇다,,, ㆍ 리소스에서만 삭제하지 말고 꼭 다 삭제하자  ▶ 핸들러를 여러개 등록하는 경우ㆍ MainFrame과 Vi..

메뉴 리소스 편집 및 핸들러 등록

# 메뉴란ㆍ 소프트웨어 관점에서 제공되는 기능의(명령의) 묶음을 메뉴라고 한다.ㆍ 다루는 방법은 아주 간단하다. # 메뉴 리소스 편집 # 핸들러 등록ㆍ 메뉴를 만들면 WM_COMMAND가 등록이 되는데 파라미터로 ID값이 전달된다. ㆍ ID는 메뉴가 여러개있으면 그 메뉴의 이름이다. (이거로 통해 접근) ㆍ 주의점) 등록할 클래스를 클릭(선택) 해야 한다.  ㆍ 수작업은 가능하지만 하지않는것을 권장한다. VS에서 제공하는 기능을 사용해서 핸들러를 등록하자. ㆍ 메뉴에 대한 핸들러는 기본적으로 UI의 View에 하는게 기본적으로 적절하다. 메뉴라 하는것은 기본적으로 GUI 형태일것이다.    ㄴ 이걸 어따해야되지? 싶으면 걍 View에 박자 ㆍ 이런식으로 비주얼적으로 제작을 할 수 있다. ID값을 변경해줄..

메시지 맵과 핸들러

#메시지 맵이란?ㆍ 메시지 큐에 메시지가 차곡차곡 쌓이면 이벤트루프에서 메세지를 하나씩 꺼내 처리해준다. ㆍ 메세지의 종류가 하도 많다보니까.... Switch-case를 통해 만들면 너~~~무 많아진다. (Win32에선 이렇게했다.) 이를 해결하기 위해 나온게 메시지맵 ㆍ 메시지1개 함수1개를 1:1로 매핑 # 코드에 미리 보인다 -vis가 알아서 해줌: 근데 좀 지저분하게 처리될때가 있다.... (등록된걸 제거할때 특히 별로임)ㆍ 뭐 이런식으로 보이는데 한번 더 깊게 봐보자 #메시지 보기 이렇게 자동으로 생성된다.맨 위로 올려 메시지 맵을 살펴볼수도 있다.  UI만 딸깎 했을 뿐인데 WM_CREATE()가 자동으로 들어갔다 ㆍ 아니근데 주석을 걸수도있다... 자동 생성된건데... 당연하게 주석걸면 코..

SDI 프레임워크 분석과 순서

MFC 프레임워크의 특징은 이미 다 정해져있고 필요한 부분을 잘 찾아서 이용하는 느낌이다.지하철 노선도는 정해져있고 어디역에서 타고 환승하고 내릴지는 내가 정하자 # 초기화 (생성 순서를 보자)1. 먼저 어플리케이션이 생성된다 CWinApp(); 그리고 초기화된다2. 그 이후 Document가 생성되고3. Frame윈도우가 생성되고4. View가 생성이 된다  # WinApp클래스의 Init함수를 보면 이렇게되어있다ㆍ 순서가 여태 한것대로 정의되어있다.  근데 위 초기화는 생성 순서일뿐 실제 역활을 하게될 부분은 다르다. # WM_CREATE Wnd의 Create()를 통해 생성되는데....WM_CREATE이라는 메시지가 발생하고 pre -> OnCreate()가 메시지로 Call이 된다.Frame에 코..

SDI 각 클래스 접근 방식과 역할

# SDI프로젝트를 생성하고 나면 ...  (Single Document Interface) ㆍ 이런 클래스들이 함께 생성된다. # 구조를 시각화 해서 보자ㆍ Data는 Document 부분에서 관리해준다   MFC의 프로젝트는 메인이 없다... 객체 생성 순서를 한번 보자ㆍ AfxWinMain : 이게 메인이다. 근데 MFC에선 이게 숨겨져있고 이부분은 수정할 수 없다. 시작점이라고 생각하자 ㆍ CWinApp : 모든 어플리케이션 클래스의 파생 클래스.. 시작되면 InitInstance가 호출되고 Run이나온 후 ExitInstance로 끝남ㆍ CWinApp 는 theApp이라는 전역변수로 이미 선언되어있다.코딩은 어디에 가장 많이할까?? : InitInstance()와 ExitInstance()에서 ..

CWnd와 윈도우 속성, 윈도우 관계 ,좌표계

# CWnd 클래스 말 그대로 Window를 구현해 놓은 클래스다 # CCmdTargetㆍ 메시지맵에 대한 기능을 제공한다. 이것을 알려면 WinProcedure에 대한 개념이 있어야 한다.ㆍ WindowAPI에서는 프록시저가 메시지를 처리해주는 콜백함수였다. (이벤트가 들어왔을때 스위치케이스를 통해 어떤 메시지 이벤트인지 분기를 나누어 처리한다)   # CWnd# 하지만 스위치 케이스는 성능이 안좋으니 MFC는 메시지맵으로 구현했다. ㆍ 그 메시지 맵의 기능을 하는게 CCmdTarget클래스다. CWnd는 이를 상속받은 클래스 이므로 그 기능을 공유받는다.ㆍ 메시지맵을 윈도우 좌표계에 맞게 더 구체화해서 구현해 놓은 친구가 CWnd이다 (그 양이 정말 어마어마하다)https://learn.microso..

윈도우 기초 이론 - 솔루션, 프로젝트, 리소스

C/C++ 기반 프로젝트로 데스크탑 어플리케이션을 만들려면... Win32와 MFC를 이용하게 된다 솔루션과 프로젝트  ㆍ 솔루션은 최상위 개념- 한 솔루션은 최소 1개 이상의 프로젝트로 구성 ㆍ 프로젝트는 솔루션에 속하는 단위- 모듈(.exe,.dll) 단위로 한 프로젝트 존재- 각 프로젝트는 의존성이 존재할 수 있음 exe -> dll 의존적이다(디펜더시) dll이 변경되면 exe도 다시 빌드해야함. 설정에서 한번에 되게 할 수있음. ㆍ 프로젝트에 속하는 요소- 소스코드 (.c ,.cpp, .h)- 리소스 (.rc , .ico, .bmp 등) - 리소스도 프로젝트에 속한다ㆍ bmp는 24bit 비트맵이 최대.ㆍ jpg , png 는 MFC에서 사용하기가 굉장히 어렵다... 할수는 있지만... 적절하지..

CString 과 CFile (문자열 편하게 처리하기)

# CString •MFC 기반 응용프로그램에서 문자열 처리를 지원하는 클래스로 MBCS, Unicode에 대한 지원과 추상성 제공 •MFC 응용프로그램에서는 std::string보다는 CString 사용을 권장 •문자열 사용에 대한 매우 높은 호환성 제공 •내부적으로 효율을 높이기 위한메모리 운영기능을 제공 하지만 간혹 메모리 사용량 증가의 원인으로 작용 •함수 매개변수로 사용 시 주의(빌드모드이슈) ※ MFC에서 new연산자는 Debug, Release모드에 각각 다르게 작동한다 ㆍ 또한 CString은 문자열을 이런식으로 작성하면 (길이가 늘엇다 줄어든 경우) 이러면 빈공간이 줄어들지 않아 메모리가 낭비된다  CString ㆍ 연산자를 지원한다.ㆍ CompateNoCase는 대소문자를 구분할것인가?..