기본 콘텐츠로 건너뛰기

2006의 게시물 표시

마소잡지에서 MFC

베르도 사는 이야기 | 베르도 http://blog.naver.com/berdo_seok/70000363288 개발도구 중 가장 강력한 프로그래밍 언어로 손꼽히는 C++. 하지만 명성만큼 강력한 성능을 발휘하는 프로그래밍 기법을 익히는 것은 생각만큼 쉽지 않습니다. 이번 호에서는 C++의 내부를 들여다보고 가장 널리 이용되고 있는 C++ 프레임워크인 MFC를 탐험함으로써 새로운 시각으로 C++ 코드를 볼 수 있는 방법을 제시합니다. Undocumented C++ 1999 년은 필자에게 아주 중요한 의미로 남아 있습니다. 새 천년을 앞둔 마지막 해였으며 영화 매트릭스가 우리에게 첫선을 보였고 예언처럼 과연 지구가 멸망할 것인가가 초미의 관심사였던 때이기도 했습니다. 또한 필자가 처음으로 마소를 통해 여러분들을 만난 것도 1999년이니 기억에 남는 것은 당연할 것입니다. 그때 필자가 썼던 기사의 내용은 MFC를 이용해 MS 오피스와 같은 UI를 구현하는 방법에 대한 것이었습니다. 당시만 해도 대부분의 애플리케이션이 C/S 환경으로 제작되었으므로 가장 강력한 애플리케이션 개발도구인 C++를 사용하는 것이 당연한 것처럼 받아들여졌습니다. 통계를 보더라도 C++는 전 세계적으로 가장 애용되는 프로그래밍 언어였으니까요. 2000년 이후 개발환경이 웹 플랫폼으로 급속히 이전되면서 C++는 가장 많은 개발자가 사용하는 언어의 자리에서 물러나게 되고 자바가 그 자리를 대신하게 되었습니다. 단적으로 필자만 하더라도 2000년 이후부터는 MFC를 이용한 프로그램 개발보다는 자바를 이용한 웹 애플리케이션 개발을 더 많이 하고 있으니까요. 게임이나 PC 애플리케이션을 제외한다면 MFC의 활동 영역은 서버 COM 개발이나 클라이언트 레벨에

CTreeCtrl - OnNotify

2003-03-21 오전 3:29:28   /  번호: 289850  / 평점:   (-) category: VC++ 일반  /  조회: 991    트리 컨트롤에서 TVN_SELCHANGED...가 안되네요... 신주철 / skyjedi         MFC 5.0(VC 97버전)으로 하고 있는데 트리 컨트롤의 TVN_SELCHANGED 메시지 매핑한 함수가 호출이 안되여 spy++로 메시지 검사 해봐도 트리컨트롤에서 이리저리 클릭해도 그 메시지는 발생이 안되네요 CTreeCtrl을 상속받아서 만든 클래스를 다이얼 로그의 트리컨트롤에 연결하고 있습니다. TVN_SELCHANGING은 잘 먹더군요 우찌 이런일이?? 이 글에 평점 주기:     2003-03-21 오전 11:07:46   /  번호: 289903  / 평점:   (-)     OnNotify메시지로 해결됩니다.   강옥순 / kidspa          제가 사용하고 있는 소스입니다. TVN_SELCHANGED부분만 보세요.. BOOL CAcountDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) {     // TODO: Add your specialized code here and/or call the base class     LPNMHDR hdr;     LPNMTREEVIEW ntv;           hdr = (LPNMHDR)lParam;     ntv = (LPNMTREEVIEW)lParam;     //TVITEMEX TvEx;     Param *pParam;     if(hdr->hwndFrom == m_AcountTree.m_hWnd)     {               switch(hdr->code)//common notifi

다이얼로그 엔터키 막기

웹하드 | 무정혈 http://blog.naver.com/chohj35/120015153197 다이얼로그로 대화창을 만들고 에디트 버튼이나 기타 엔터키 입력을 받는 콘트롤을 올려 놓을 경우에 다이얼로그에서 먼저 엔터키를 받아서 OnOK(); 가 호출되어 걍 ~~ 죽죠 이 부분을 바꾸어 보겠습니다 1. 리소스 부분에서 IDOK 부분을 다른 리소스로 변환합니다 IDOK -- > IDC_BUTTON_ACCEPT #define IDC_BUTTON_ACCEPT 1150 2. IDC_BUTTON_ACCEPT의 핸들러 OnAccept();를 만들죠 void CConfigDlg::OnAccept() { // Add code here.. CDialog::OnOK(); } 3. 그 핸들러에 IDOK의 디폴트 핸들러를 호출합니다. (위에서 같이요: CDialog::OnOK();) 4. :PreTranslateMessage() 핸들러를 만들고 아래와 같이 작성 하세요 BOOL CConfigDlg::PreTranslateMessage(MSG* pMsg) { if( pMsg->message == WM_KEYDOWN ) // Enter Key Prevent.. so good.. ^^ { if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE ) { ::TranslateMessage(pMsg); ::DispatchMessage(pMsg); return TRUE; // DO NOT process further } } return CDialog::PreTranslateMessage(pMsg); } 5. 다이얼로그를 모달루 띄우고 엔터키를 입력해도 죽지

Icon Editor

툴바에 들어갈 아이콘을 만들면서 한참 짜증을 내던 일이 있었다. 복사/붙이기도 안되고 실력도 없는데 툴마저 이러니까 도무지 깔끔한 결과물이 나오지 않았다. 프로젝트였는데 이렇게 그려서 납품했다. 다시 수정할 일이 생겨서 보니 기능중에 윈도우 bmp 파일을 불러들이는 기능이 있는게 아닌가!!! 이제 Icon Editor에서 허우적 되지 않고 외부에서 손쉽게 BMP 파일을 만들어 불러 들이기만 하면 된다. 256 색상 까지만 지원합니다. Resource ID는 ToolBar에서 나타내고자 할때 사용하는 값입니다.

VB용 ocx에 사용자 정의 속성 추가

먼저 VB의 추가기능 관리자에서 ActiveX 컨트롤 인터페이스 마법사 를 로드합니다. ActiveX 컨트롤 인터페이스 마법사 를 실행합니다. 이 화면은 그냥 건너뜁니다. 우리는 사용자 속성을 추가할것이기 때문에 이 화면도 건너뜁니다. 기존에 추가시킨 속성이 하나 보이는군요. 그럼 추가 버튼을 눌러 새로운 속성을 추가시켜 봅시다. 메서드를 추가시킬려면 형식에서 메서드(M)을 선택하시면 됩니다. 여기서는 MaterialBalanceFile과 EqlistFile 두개의 속성을 새롭게 추가시켰습니다. 추가시킨 속성의 데이터 형식을 설정합니다. 데이터 형식까지 설정을 마쳤으면 모든 작업이 끝났습니다.

엑셀 sheet를 복사하여 다른 엑셀 파일에 붙이기.

- 코드 - Dim XL1, XL2 As Application Dim wb1, wb2 As Workbook Dim s1, s2 As Worksheet Set XL1 = CreateObject("Excel.Application") XL1.Visible = False Set wb1 = XL1.Workbooks.Open(txtOldFile.Text) 'material balance file; Set XL2 = CreateObject("Excel.Application") XL2.Visible = False Set wb2 = XL2.Workbooks.Open(txtNewFile.Text) 'equipment list file' 'material balance sheet를 eqlist의 제일 마지막에 복사' XL1.Worksheets("Material").UsedRange.Copy Set NewSheet = XL2.Worksheets.Add(After:=XL2.Worksheets(XL2.Worksheets.Count)) NewSheet.Range("A2").PasteSpecial Paste:=xlValues NewSheet.Name = "Material" XL2.DisplayAlerts = False wb2.SaveAs (txtNewFile.Text) XL2.DisplayAlerts = True XL1.DisplayAlerts = False XL1.Quit XL2.Quit Set XL1 = Nothing Set XL2 = Nothing

auto_ptr 사용.

발구르기 | 발구르기 http://blog.naver.com/yaiin0911/120022027021 [WinApi.co.kr] 36-3.auto_ptr 36-3-가.자동화된 파괴 C++의 클래스는 파괴자라는 특별한 함수를 가지는데 이 함수는 객체가 파괴될 때 자동으로 호출된다. 그래서 객체가 동적으로 메모리를 할당하거나 시스템 자원을 사용하더라도 파괴자에 정리 코드를 작성해 놓으면 별도의 조치가 없더라도 객체가 사라질 때 해제 작업을 하도록 되어 있다. 파괴자의 이런 동작은 굉장히 편리한데 지역 객체일 경우 함수안에서 마음대로 만들어 쓰다가 그냥 나가기만 하면 된다. 범위를 벗어난 변수는 스택에서 제거되며 이때 객체의 파괴자가 호출되어 자신이 사용하던 자원을 알아서 정리하는 것이다. 앞 절에서 연구해 본 string 클래스를 생각해 보면 파괴자가 얼마나 편리한가를 알 수 있다. string 객체는 가변 길이의 문자열을 저장하기 위해 버퍼를 동적으로 할당해서 관리하는데 개발자가 신경쓰지 않아도 이 메모리는 자동으로 회수된다. 이런 면을 보면 파괴자는 역시 편리한 함수이다. 그러나 파괴자는 스택에 정적으로 할당된 객체에 대해서만 동작하며 동적으로 할당한 메모리에 대해서는 책임지지 않는 문제점이 있다. 다음 예제를 보자. 예제 : dynalloc #include <iostream> using namespace std; void main() { double *rate; rate=new double; *rate=3.1415; cout << *rate << endl; // delete rate; } 실수형 변수를 가리키는 rate 포인터를 선언하고 이 포인터에 실수형의 길이만큼 동적 할당하여 그 번지를 저장했다. 이렇게 되면 *rate는 실수형

프로그램 일반

프로그램 개발시 에러를 만났을때 참고 견디는 구조보다 에러를 뱉어내는 구조로 작성하라. 에러를 무시하는 코드는 개발자에게 에러가 난 근본적인 원인을 찾아 그 에러에 대한 대책을 수립할 수 있는 기회를 근본적으로 박탈한다. 제때 에러를 수정할수 있는 기회를 잃어버려서 나중에 그 수많은 코드들을 헤집고 다녀야하는 수고를 해야만 한다.

[공유] simple polygon 만들기

helloktk의 블로그 | 드라곤 원문 https://blog.naver.com/helloktk/80028346861 기하 알고리즘을 특히 폴리곤알고리즘을 테스트하기 위해서는 폴리곤 데이터를 만들어야 한다. 여기서 2차원의 점들을 이용하여 간단히 simple polygon을 만드는 방법을 살펴본다. 단순폴리곤을 만들기 위해서는 점들을 정렬을 해야한다. 각각의 점들을 X축에 프로젝션을 시키면 x축에 대해서 정렬이 된다(같은 x값인경우에는 의 크기대로 정렬). 따라서 x값으로 정렬된 점들을 쭉 이어나가면 하나늬 폴리라인(poly-line)을 만들 수 있다. 그러나 원하는 폴리곤은 아니다. 이를 해결하기위해서는 점들을 직선으로 두부분으로 나누고, 직선의 윗부분은 x값이 큰순서대로 정렬을 하고, 아래 부분은 x값이 작은 순서대로 정열을 하면 폴리라인이 아닌 폴리곤을 얻을 수 있다. 직선은 어떻게 잡을까? 이것은 가장작은 x값을 갖는 점과 가장 큰 x값을 같는 점을 잇는 직선을 생각하면 편리하다. int CCW(CPoint A, CPoint B, CPoint C) { C -= B; //점B에서 C로 향하는 선분의 왼편인가, 아니면 오른편인가; A -= B; return C.x*A.y-C.y*A.x; } int comp(const void*A, const void *B) {//x->y의 크기순서대로 정렬용; int a=((POINT *)A)->x - ((POINT *)B)->x ; if(a>0) return 1 ; else if(a<0) return -1; a=((POINT *)A)->y - ((POINT *)B)->y ; if(a>0) return 1; else if(a<0) return -1; return 0; } void MakeSimplePolygon(POINT P[], i

곡선의 변형

곡선의 변형 B-spline곡선의 변형은 아래의 조작으로 가능하다. ● 매듭 벡터의 변경 ● basis함수의 차수 변경 ● 제어점의 위치 변경 ● 중복된 제어점 사용 ● 중복된 매듭 값 사용 우리는 basis함수의 값을 계산해내는 과정을 알아보았다. 인자로 넘겨준 $u$가 속하는 매듭 구간도 구했고 거기서부터 차수를 $0$에서부터 $p$까지 증가시키면서 basis함수도 구했다. 제어점의 이동 제어점의 이동은 B-spline곡선의 모양을 변형하는 한 방법이 된다. 제어점 $P_k$을 이동시키면 B-spline곡선 $C(u)$중 매듭 구간 $[U_k,U_{k+1})$에 속하는 부분만 변형이 된다. (나머지 구간에서의 B-spline곡선은 0이 되기 때문에 이동에 의한 변형은 생기지 않는다.) 조금 더 자세히 살펴보자면 제어점이 이동되어지는 벡터의 방향으로 곡선이 변형이 된다. $P_k$가 새로운 위치 $P_{k+v}$로 이동되었다면, 이 된다. 기존의 곡선에서 $N_k,p(u)v$만큼 이동된다는 것을 알 수 있다. 하지만 여기서 $u$가 매듭 구간 $[U_k,U_{k+1})$에 속하지 않는다면 곡선의 변형은 없을 것이다.

UI 만들기

PDMS에서는 UI를 만드는데 별도의 툴을 제공하지 않습니다. 그래서 수고스럽지만 일일이 손으로 코딩을 해가며 작성을 해야만 합니다. 다음 버전에는 UI 작성 툴이 제공하기를 기대해 봅니다. 1. *.pmlfrm 이라는 파일로 UI 작성 setup form !!test path down para .parPIPENOMDIA text 'Pipe Size: ($NOM_DIA_UNITS$)' option .optPIPENOMDIA '' width 10 para .parSPPTYPE text 'Support Type : VT1' option .optSPPTYPE '' width 10 para .parE text 'Item No. : A/B/C' option .optE '' width 10 para .parL text 'Length Code : A/B/C/D/E/F/G/H/J/K/L/M/N' option .optL '' width 10 para .parB text 'Length Code "B": A/B/C' option .optB '' width 10 exit 2. pml rehash all 3. pml reload form !!이름     -> UI를 메모리에 올리는 작업     -> 파일 내용이 수정될때 마다 이 작업을 해주어야 합니다. 4. show !!이름

숫자의 포멧 변환

이가을에 동유.. | 롤롤 http://blog.naver.com/lollol1246/100010946141 1000000 -> 1,000,000식으로 변환해주는 함수 GetNumberFormat The GetNumberFormat function formats a number string as a number string customized for a specified locale. int GetNumberFormat( LCID Locale, // locale for which string is to be formatted DWORD dwFlags, // bit flag that controls the function's operation LPCTSTR lpValue, // pointer to input number string CONST NUMBERFMT *lpFormat, // pointer to a formatting information structure LPTSTR lpNumberStr, // pointer to output buffer int cchNumber // size of output buffer ); static NUMBERFMT nFmt = { 0, 0, 3, ",", ".", 0 }; CString CMainFrame::GetNumberFormatFileSize(int nFileSize) { TCHAR szVal[32]; TCHAR szOut[32]; CString strReturn = _T(""); wsprintf ( szVal,"%d",nFileSize/1000 ); GetNumberFormat ( NULL, NULL, szVal, &n