mfc
-
문자열 인코딩 변환 매크로 주의사항 (W2A, A2W)MFC 2018. 1. 29. 14:31
유니코드와 멀티바이트 문자열을 상호변환하는데 있어 가장 간편한 것이, 제공되는 함수를 사용하는 것일테다. USES_CONVERSION; 만 사용하면, 여러 변환 매크로들을 사용할 수 있기에 종종 사용했었다. A2W, W2A 같은 매크로들이다. W : 유니코드A : ANSI 문자열 헌데, W2A는 변환과정에서 내부스택을 사용하기 때문에, 반복문 안에서 사용하면 스택오버플로우가 발생한다. 그래서 찾은게 CW2A, CA2W 등 이다. 이는 ATL7.0에 도입된 클래스와 매크로로, 클래스 내부에 128만큼 버퍼를 갖고있고, 이를 넘어서는 경우 힙에 메모리를 할당한다고 하며, 루프 안에서도 사용가능하며 스택오버플로우되지 않는다고 한다. 필자는 for문안에서 다량의 W2A_EX를 사용했고, 또한 반복 횟수가 많아서..
-
MFC의 Ping의 응답 코드값NMS(ICMP,SNMP) 2011. 4. 14. 11:46
MFC 상으로 ping 응답을 확인하는 함수인 IcmpSendEcho() 에서 리턴값이 1인 경우에는 응답이 온 경우지만 리턴값이 0 인 경우에는 응답이 오지 않은 경우다. 이럴 때 4번째 파라메타인 LPVOID ReplyBuffer를 분석해 보면 응답이 오지 않은 이유를 알 수 있다. 확인 방법은 아래와 같다. 거의 대부분의 11010코드(Request time out)이었지만, 실제 상황에서 테스트 해 본결과 아무도 없는 한밤중에 11002(Destination Net Unreachable),11003(Destination Host Unreachable) 같은 상황이 나타나기도 했다. PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; CStr..
-
MFC에서 다이얼로그 시작하자마자 윈도우 숨기기MFC 2010. 12. 2. 10:00
프로그램 실행 뒤에 한번이라도 윈도우를 표시하고 난 다음에 숨기려고 한다면 ShowWindow(SW_HIDE); 해주는것만으로도 숨겨진다. 하지만 처음부터 아예 윈도우를 보고 싶지 않다. 라고 한다면... OnInitDialog()에 ShowWindow(SW_HIDE);를 넣는 방법은 통하지 않는다. 이럴 경우.. WM_WINDOWPOSCHANGING 메시지를 추가한 다음에 아래와 같이 작성하면 된다. void CTestDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos) { lpwndpos->flags &= ~SWP_SHOWWINDOW; //
-
MFC에서 체크박스 배경색을 바꾸고 싶은데 바뀌지 않는 경우MFC 2010. 11. 30. 15:07
다른 컨트롤은 배경색이 바뀌는데 체크박스만 잘 바뀌지 않는다. 헤더파일에 추가 : CBrush m_brCheck; CPP 파일에 추가 : // 초기화 코드에 추가 m_brCheck.CreateSolidBrush( RGB(255,255,255) ); // 메세지 추가 HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(pWnd->GetDlgCtrlID() == IDC_CHECKBOX_TEST) { pDC->SetBkColor(RGB(255,255,255)); return (HBRUSH)m_brCheck; } return hbr; }
-
GDI+ 에서 그림판의 자유 그리기 구현MFC 2010. 10. 29. 10:03
처음에는 어렵지 않을 줄 알았다. 하지만 막상 구현한 결과 라인이 부드럽게 그려지지 않고, 각이 지는 문제 발생. 디버깅 및 확인 결과 일단 OnPaint에서는 GDI+로 더블 버퍼링을 쓰고 OnMouseMove 함수에서는 GDI로 화면을 그려주는게 문제였다. GDI와 GDI+를 이렇게 같이 쓰게 되면 심각한 퍼포먼스 저하가 발생하는 것 같았다. 아무튼 OnMouseMove함수에서도 GDI+로 화면을 그려주게 되자 문제 해결. - OnMousemove() : 화면에 라인을 임시로 덮어 그려주면서, List에 좌표 저장 - OnPaint() : List에 저장된 좌표를 DrawLines로 이어줌. 더블 버퍼링 사용.
-
다이얼로그에서의 더블 버퍼링MFC 2010. 10. 15. 15:34
void CTestDlg::OnPaint() { SolidBrush bgBrush(Color(255,255,255)); // 흰색으로 초기화 CPaintDC dc(this); CBrush brhBack; brhBack.CreateSolidBrush(RGB(255,255,255)); // 배경색 CRect rlClientRect; GetClientRect(rlClientRect); Rect rclClient(rlClientRect.left,rlClientRect.top,rlClientRect.Width(),rlClientRect.Height()); CBitmap bmp; CBitmap* pOldBmp; CDC memDC; bmp.CreateCompatibleBitmap(&dc, rlClientRect.ri..