MFC39 MFC ] 정적 라이브러리에서 MFC 사용 MFC 프로젝트를 생성하면 디폴트가 "공유 DLL에서 MFC 사용"으로 되어있다. 이 설정은 해당 프로그램이 필요로 하는 MFC 라이브러리를 DLL을 사용하여 참조하겠다는 뜻으로 대상시스템에서 Visual C++ 재배포 패키지를 설치하거나, mfc*.dll 파일을 구해 system32 또는 sysWow64 경로에 넣어주어야 정상적으로 동작한다. 반면 "정적 라이브러리에서 MFC 사용" 옵션을 선택하면 실행파일에 필요한 dll이 포함되어 컴파일되기 때문에 실행파일의 사이즈는 커지지만 배포시 별도의 dll을 같이 제공할 필요가 없다. 런타임 라이브러리도 실행파일에 포함시켜 배포하기 위해 /MD가 아니라 /MT 옵션으로 바꿔주는 것도 잊지 않는다. 2023. 12. 15. MFC ] 컨트롤 색상 변경하기 WM_CTLCOLOR 메시지는 컨트롤이 처음 생성될 때 또는 컨트롤이 다시 그려져야할 필요가 있을 때 컨트롤의 색상을 결정하기 위한 메시지 이다. 이 메시지의 핸들러를 등록하여 컨트롤의 색상을 처리할 수 있다. 파라미터는 다음과 같다. pDC : 윈도우에서 그리기 작업에 필요한 모든 정보를 가지고 있는 디바이스 컨텍스트 구조체 포인터 pWnd : 화면에 그려질 대상 컨트롤에 대한 포인터 nCtlColor : 컨트롤의 종류에 대한 정수값. 예를들어 에디트 컨트롤이라면 CTLCOLOR_EDIT이고 해당 컨트롤이 읽기 전용이라면 CTLCOLOR_STATIC이 된다. 위 파라미터를 활용하여 특정 컨트롤에 대한 색상 처리를 수행하고 변경된 색상을 나타내는 HBRUSH를 반환하면 된다. 반환된 브러시는 실제 해당 .. 2023. 12. 14. MFC ] PeekMessage() / GetMessage()와의 차이 PeekMessage()와 GetMessage() 함수는 Windows 시스템 메시지 큐에서 메시지를 가져오는 함수이며, 동일한 4개의 매개변수를 갖는다. BOOL PeekMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ); lpMsg: MSG 구조체에 대한 포인터로, 함수 호출 이후 메시지 정보가 채워진다. hWnd: 메시지를 확인할 창 또는 윈도우 핸들. 일반적으로 nullptr로 설정하면 어떤 윈도우에서든 해당 메시지를 확인한다. wMsgFilterMin: 확인할 메시지 범위의 최소 값으로 WinUser.h에 정의되어 있다. wMsgFilterMax: 확인할 메시지 범위의 최대 값으로 Wi.. 2023. 11. 14. MFC ] 특정 컨트롤에 포커스 설정하기 1. 다이얼로그 생성시 특정 컨트롤을 포커스된 상태로 두는법 리소스뷰에서 서식 - 탭 순서를 클릭하면 현재 설정된 탭순서(Tab키 눌렀을 때 이동되는 순서)가 표시되는데 컨트롤을 순서대로 클릭하여 탭순서를 재배치 할 수 있다. 포커스된 상태로 둘 컨트롤을 첫번째 순서로 설정하면 된다. 2. 코드에서 포커스 옮기기 컨트롤 객체가 있다면 바로 .SetFoucs() 함수를 사용하면 되지만 컨트롤 객체가 없는 다이얼로그 상의 컨트롤을 조작하려면 GetDlgItem() 함수를 사용하면 된다. GetDlgItem() 함수는 컨트롤의 ID를 통해 다이얼 로그 상 컨트롤을 식별하는 데 사용되며 컨트롤의 핸들 CWnd*를 반환한다. 이 핸들을 사용해 컨트롤을 조작할 수 있다. CWnd* GetDlgItem(int nID.. 2023. 11. 6. MFC ] 사용자 지정 메시지와 메시지 처리기 만들기, SendMessage, PostMessage 메뉴에서 프로젝트 - 클래스 마법사 - -Dlg클래스 선택 - 사용자 지정 메시지 추가로 추가하는 방법도 있다. 방법 먼저 사용자 지정 메시지를 정의한다. #define MY_MSG1(WM_USER + 1) #define MY_MSG2(WM_USER + 2) Windows API에는 미리 정의된 메시지 상수가 많이 있지만, 애플리케이션의 필요에 따라 추가적인 사용자 지정 메시지를 정의할 수 있는데, 이때 WM_USER를 사용하여 사용자 지정 메시지의 베이스 값을 설정한다. WM_USER의 값은 0x0400으로 (WM_USER + n) 이런식으로 정의하면 다른 시스템 또는 프레임워크 메시지와 충돌하지 않도록 할 수 있다. 다음은 다이얼로그 헤더에 메시지 처리기를 추가한다. afx_msg LRESULT My.. 2023. 9. 15. MFC ] 리스트박스 스크롤 하단으로 내리는 법 // ... m_listBox.SetCurSel(m_listBox.GetCount() - 1); m_listBox.SetCurSel(-1); // ... 리스트박스의 가장 마지막 인덱스를 선택한다. 포커스를 다시 해제해 파란색으로 표시되지 않게하면 스크롤을 맨 아래로 이동하는 효과만 남는다. 2023. 9. 15. MFC ] 멀티바이트 집합 사용시에도 현대적 UI 적용하기 Framework.h에 #ifdef _UNICODE, #endif 주석 처리 #ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") #elif defined _M_X64 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' v.. 2023. 9. 15. MFC ] 엔터, ESC 키 입력시 종료되지 않게하기 엔터키 입력 시 종료되지 않게하기 OnOK 함수 재정의 OnOK() 호출 주석처리 void CRwrTesterDlg::OnOK() { // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다. //CDialogEx::OnOK(); } ESC 키 입력 시 종료되지 않게하기 OnCancel() 함수를 재정의해서 주석처리하면 Alt+F4가 눌리거나 다이얼로그의 X버튼이 눌린 경우에도 종료되지 않기 때문에 다른방법을 쓴다. PreTranslateMessage(MSG* pMsg) 함수 재정의 해당함수는 키보드 및 마우스 메시지를 번역하고 처리하기 전에 호출되는데 ESC키 입력시 바로 리턴하여 어플리케이션이 종료되지 않도록 한다. BOOL CRwrTesterDlg::PreTranslateMes.. 2023. 9. 15. STM32 + MFC ] 델타 로봇 티칭 시스템 구현, 파일입출력 기능 사용 티칭 데이터 관리, 쓰레드 활용 반복작업 수행 로봇의 티칭 방법 로봇에게 가르칠 수 있는 행동의 종류는 MOVE, WAIT, PUMP 세가지가 있고 각각 속성값을 지정할 수 있다. 1. MOVE : TORQUE OFF 버튼을 누른 뒤 사람 손으로 원하는 위치로 엔드 이펙터를 이동시킨 후에 READ 버튼을 클릭하면 현재 좌표값이 입력된다. 물론 좌표값을 직접 입력하는 것도 가능하다. 2. WAIT : 직전행동 후 대기시간을 설정한다. ms 단위로 0-5000 사이의 값을 입력할 수 있다. 3. PUMP : ON 또는 OFF를 선택한다. 원하는 행동의 라디오버튼을 클릭하고 속성값이 지정되었으면 ">" 버튼을 눌러 해당 행동을 기억시킬 수 있다. 기억된 행동은 순서대로 번호가 부여되며 중간에 행동을 끼워넣거나 "" 버튼 눌렀을 때의 이벤트 처리 함수 vo.. 2022. 9. 19. MFC ] 리스트 컨트롤에 행 단위 색상 입히기 (글자색/배경색) 메시지맵에 다음을 추가한다. BEGIN_MESSAGE_MAP(CdeltaControlDlg, CDialogEx) //... ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_MEMORY, OnCustomdrawMyList) END_MESSAGE_MAP() notification code가 NM_CUSTOMDRAW 일 때 내 리스트 컨트롤 ID로 부터 온 WM_NOTIFY 메시지를 핸들 하고 싶다는 뜻이다. 헤더에 메시지 처리함수의 원형을 선언한다. afx_msg void OnCustomdrawMyList(NMHDR* pNMHDR, LRESULT* pResult); 메시지 처리 함수의 정의 void CdeltaControlDlg::OnCustomdrawMyList(NMHDR* pNMHDR, LR.. 2022. 9. 18. 이전 1 2 3 4 다음