본문 바로가기

Application Dev.

(24)
SDI, MDI 기반의 프로젝트에서 타이틀바 내용 변경하기(CREATESTRUCT structure) BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style &= ~FWS_ADDTOTITLE ; cs.lpszName = "Maestro Server Ver1.0"; // SetWindowText("Maestro Server Ver1.0") 대체 가능 // 단, OnCreate() 에서의 호출을 추천 // 덤으로 cs.cx, cx.cy 등을 이용하면 프로그램 틀의 크기 조정도 가능하다. return TRUE; }
CMainFrame 사용하기 CMainFrame *pMainFrm= (CMainFrame *) AfxGetMainWnd(); AfxGetMainWnd() 함수는 윈도우의 포인터를 얻어오는 함수이다. CWnd* 값을 가져오는데 이는 윈도우의 멤버 변수인 m_pMainWnd의 값을 리턴한다. CMainFrame 에서의 Doc , View 로드 방법으로는 GetActiveDocument(), CGetActiveView() 등이 있다, 리턴 값은 각각 CDocument , CView 의 포인터 형이며 타입 캐스팅으로 원하는 뷰를 사용할 수 있다.
enum 사용하기 [출처] [C/C++] enum, 보다 나은 enum|작성자 esstory #define 과 얼핏 비슷해 보이지만, 비슷한 유형별의 데이터를 표현하기 위해 반드시 필요한 C++의 필수 타입인 enum 의 몇 가지 재미있고 유용한 팁을 소개합니다. 1. namespace 와 결합하기 일반적으로 enum 을 이용하여 타입이름을 짓기란 쉬운 일이 아닙니다. 만약 리스트에 필요한 정렬 기준을 enum 으로 표현한다면 아래 정도가 됩니다. enum SORT_LIST { SORT_DATE, // 날짜순 SORT_NAME, // 이름 SORT_CONTENT, // 내용 S0RT_ETC, // 기타 }; bool SortSomeData(SORT_LIST SortList) { switch (SortList) { case..
다이얼로그 기반의 프로그램에서 Enter키, Escape키 막기 [출처] [MFC]다이얼로그 기반의 프로그램에서 Enter 키 안 먹히기|작성자 낭만오리 MFC에서 다이얼로그(Dialog) 베이스에서 프로그래밍 할 경우, 프로그램을 실행했을 때, 엔터(Enter) 키를 누르게 되면 CDialog::OnOK() 함수가 자동적으로 호출 되어서 Dialog가 자동적으로 닫히게 된다. 이런경우를 막기 위해서는 여러방법이 있는데, 그 중에 일반적으로 많이 쓰이는 것이 CDialog::PreTranslateMessage(MSG* pMsg); 함수를 오버라이딩(재정의) 한 후, 엔터키가 눌렸다는 메시지를 가로채서, 실행하지 않게 하면된다. 마찬가지로, ESC 키가 눌렸을 때는 CDialog::OnCancel() 함수가 자동적으로 호출되어서 Dialog가 자동적으로 닫히게 되는데,..
WM_CLOSE, WM_DESTROY_WM_CREATE 의 정확한 발생지점 WM_CREATE : 윈도우 클래스 구조체를 메모리에 실제 할당할 때, 즉 CreatWindow() 호출시에 발생 WM_CLOSE : 윈도우 클래스 구조체를 해제하기 전에 발생 WM_DESTROY : 윈도우 클래스 구조체를 해제한 후 발생 종료 후 그리기 관련 작업은 WM_CLOSE에서 처리하고 (DC는 윈도우에 종속적이므로 윈도우가 사라지면 얻을 수 없다) 데이터 관련 작업은 WM_DESTROY에서 처리
멀티미디어 타이머 이용 방법 멀티미디어 타이머 이용 방법 WM_TIMER 메시지를 이용한 방법이나 멀티미디어 타이머를 이용한 방법에서는 반복주기를 msec 단위로 지정해 줄 수가 있습니다. 그러나, WM_TIMER를 이용한 방법에서는 사실상 정확한 반복주기를 유지한다는 것이 불가능하여 수십 msec만큼의 정밀도밖에 가지지 못합니다. 반면에, 이 문서에서 설명할 멀티미디어 타이머는 최대 1msec까지 그 정밀도가 보장됩니다. 고정된 시간간격의 유지가 필수적인 애플리케이션에 유용한 방법입니다. 2-1. 타이머 생성 : timeSetEvent 함수 이용 MMRESULT timeSetEvent(UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD dwUser, UINT fuEve..
CHotKeyCtrl 컨트롤 & 메시지들 CHotKeyCtrl styles (=common control styles) 설 명 CCS_ADJUSTABLE 툴바의 위치나 버튼의 위치, 크기, 삽입, 삭제등을 할 수 있게 한다. CCS_BOTTOM 컨트롤을 부모 윈도우의 client 영역 맨 아래에 client영역 너비크기와 같은 너비를 가지고 위치하도록 한다. CCS_LEFT 컨트롤을 부모 윈도우의 왼쪽에 표시되도록 한다 CCS_NODIVIDER 부모윈도우와 구분이 되는 두줄의 하이라이트 픽셀을 그리지 않는다 CCS_NOMOVEX 수직으로 사이즈나 위치를 옮길 수 있으나 수평으로는 못하게 한다 CCS_NOMOVEY 수평으로 사이즈나 위치를 옮길 수 있으나 수직으로는 못하게 한다 CCS_NOPARENTALIGN 컨트롤이 자동으로 위나 아래에 정렬되..
모니터 해상도 구하기 1. GetDesktopWindow(), GetWindowRect() - Desktop도 하나의 윈도우이므로, Desktop의 윈도우 핸들을 얻어 창크기를 구하는 방식 CRect rcDesktop; ::GetWindowRect(GetDesktopWindow()->m_hWnd, &rcDesktop); int width = rcDesktop.right - rcDesktop.left; int height = rcDesktop.bottom - rcDesktop.top; RECT rcDesktop; HWND hWndDesktop = RECT rcDesktop; HWND hWndDesktop = GetDesktopWindow(); GetWindowRect(hWndDesktop, &rcDesktop); int wid..