프로그래밍/MFC (C++)44 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. Win32 API ] 메시지 루프 C언어를 처음 배우고 콘솔환경에서 프로그래밍을 하다가 윈도우 프로그래밍을 시작하면 어디가 프로그램의 시작점이고 어디서부터 순차적으로 명령이 실행되는 것인지 알지 못해 당황하는 경우가 적지 않다. 콘솔과 달리 윈도우 환경에서는 사용자가 발생시키는 이벤트에 대한 메시지를 처리하는 방식으로 프로그램이 수행되고 이를 메시지 기반(또는 이벤트 기반) 프로그래밍이라고 한다. 메시지란? 사용자나 시스템에 의해 발생된 일체의 변화에 대한 정보를 말한다. ex. 마우스 왼쪽 버튼 클릭, 키보드 누름, 윈도우 최소화 등 이런 이벤트가 발생하면 윈도우 시스템에 존재하는 메시지큐에 메시지가 쌓이고, 애플리케이션에서는 윈도우시스템 메시지큐에서 메시지를 가져와서 특정 메시지 발생시 어떠한 일을 수행할 것인가에 대한 처리 루틴을 .. 2023. 11. 13. MFC ] 특정 컨트롤에 포커스 설정하기 1. 다이얼로그 생성시 특정 컨트롤을 포커스된 상태로 두는법 리소스뷰에서 서식 - 탭 순서를 클릭하면 현재 설정된 탭순서(Tab키 눌렀을 때 이동되는 순서)가 표시되는데 컨트롤을 순서대로 클릭하여 탭순서를 재배치 할 수 있다. 포커스된 상태로 둘 컨트롤을 첫번째 순서로 설정하면 된다. 2. 코드에서 포커스 옮기기 컨트롤 객체가 있다면 바로 .SetFoucs() 함수를 사용하면 되지만 컨트롤 객체가 없는 다이얼로그 상의 컨트롤을 조작하려면 GetDlgItem() 함수를 사용하면 된다. GetDlgItem() 함수는 컨트롤의 ID를 통해 다이얼 로그 상 컨트롤을 식별하는 데 사용되며 컨트롤의 핸들 CWnd*를 반환한다. 이 핸들을 사용해 컨트롤을 조작할 수 있다. CWnd* GetDlgItem(int nID.. 2023. 11. 6. 시스템 종료와 관련된 윈도우 메시지 WM_QUERYENDSESSION, WM_ENDSESSION 다이얼로그 종료시 WM_CLOSE 메시지가 전달되지만, 다이얼로그 종료 전 윈도우가 먼저 종료된다면 WM_CLOSE 메시지는 전달되지 않는다. 따라서 응용프로그램이 윈도우 종료 시 수행해야할 작업이 있다면, WM_QUERYENDSESSION, WM_ENDSESSION 메시지 처리를 통해 가능하다. WM_QUERYENDSESSION 시스템 종료 확인 메시지. 윈도우에선 시스템 종료 또는 로그오프 시 WM_QUERYENDSESSION 메시지를 모든 윈도우에 전송하고, 응용프로그램은 이 메시지를 받아서 준비작업을 수행한 뒤 TRUE를 반환하거나 종료를 취소하기 위해 FALSE를 반환할 수 있다. 만약 모든 응용프로그램이 TRUE를 반환하면 WM_ENDSESSION 전송 단계로 넘어간다. WM_ENDSESSIO.. 2023. 11. 2. 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 ] 다이얼로그 생성시 함수 호출 순서 처음 MFC 어플리케이션의 시작점인 WinMain()함수가 실행되고 InitInstance()함수를 호출하여 어플리케이션의 다이얼로그를 생성하고 .DoModal(); 함수를 호출하게 된다. DoModal() PreSubclassWindow() OnNcCreate() OnNcCalcSize() OnCreate() OnSize() OnMove() OnSetFont() OnInitDialog() OnWindowPosChanging() OnMove() OnWindowPosChanged() OnWindowPosChanging() OnNcActivate() OnActivate() OnShowWindow() OnWindowPosChanging() OnNcPaint() OnEraseBkgnd() OnChildNotif.. 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. 이전 1 2 3 4 5 다음