MFC 5

창의 임의의 위치 클릭&드래그해서 창 이동시키기

// 창의 꼭대기서부터 밑으로 27픽셀까지 클릭&드래그 하면 윈도우가 이동함. LRESULT CMyDlg::OnNcHitTest(CPoint point) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. CPoint pt = point; ScreenToClient(&pt); CRect rect; GetWindowRect(rect); RECT rcTitleBar = { 0, 0, rect.Width(), 27 }; if( ::PtInRect(&rcTitleBar, pt) == TRUE ) { CDialog::OnNcHitTest(point); return HTCAPTION; } else return CDialog::OnNcHitTest(point); }

Windows Programming 2008.02.15

#File Error#

#File Error# 1.요약 프로그램이 끝날 때 메모리 릭이 난 부분은 가르쳐주는 거 아시죠? 근데 거기에 파일이름이 #File Error# 이라고 나오는 경우가 있습니다. 2.본문 우선은 누가 친절하게 메모리 릭을 잡아주느냐를 알아봐야겠죠. CRT의 디버그 힙이 바로 그 일을 해줍니다. 즉 메모리 할당할 당시에 ( new, malloc 문장) 그 라인 번호와 파일 이름을 CRT 자체적으로 어딘가에 저장하고 있는데, 그곳이 망가져버리거나 쓸 수 없게 되어버리면 #File Error# 이라고 대신해서 나온답니다. 우선 망가지는 경우로는 누군가가 그곳을 overwrite 해버리는 경우가 있겠고, 정말 있어서는 안될 일이겠습니다. 다음으로 우리에게 일어날 수 있는 시나리오로, dll 에서 할당한 메모리를 ..

Windows Programming 2008.02.12

유니코드 <-> 멀티바이트 변환 편리하게 하기

USES_CONVERSION; W2A : 유니코드 -> 멀티바이트 A2W : 멀티바이트 -> 유니코드 이상은 ATL 3.0 에 포함된 기능. (따로 헤더를 인클루드 해야 하는지 알 수 없다. 그냥 됐으니까 ㅡ_ㅡ;) 그리고 Visual Studio 6 에서 사용 가능한지 테스트 안 해 봤음. 될거라 생각됨) (수정: atlconv.h 인클루드 하면 된다고 함) 그리고 반드시, USES_CONVERSION 라는 매크로를 선언해야 한다. 컨버팅에 필요한 임시변수들이 선언되어 있다. 매크로 선언할 필요 없이 바로 쓰는것도 있다. 이것은 ATL 7.0 의 기능이다. (Visual Studio .Net 이후 버전부터 사용 가능) CA2W(멀티바이트문자열); // A2W 와 같은 기능 CW2A(유니코드문자열); /..

Windows Programming 2007.11.26

텍스트 클립보드

클립보드에 넣고 & 가져오는 함수 샘플입니다. BOOL CTestDlgDlg::SetClipboardText(const CString& strData) { BOOL bRtn = FALSE; // 클립보드 열고 bRtn = OpenClipboard(); // 클립보드 비우고 bRtn = EmptyClipboard(); ////////////////////////////////////////////////////////////////////////// /// 글로벌로 memory 잡고 HGLOBAL hglb; LPTSTR lptstr; int cch = strData.GetLength(); hglb = GlobalAlloc(GMEM_MOVEABLE, (cch + 1) * sizeof(TCHAR)); if(h..

Windows Programming 2007.05.23