레이블이 정리인 게시물을 표시합니다. 모든 게시물 표시
레이블이 정리인 게시물을 표시합니다. 모든 게시물 표시

2011년 5월 9일 월요일

MFC 요점 정리

1. DC얻기
CClientDC dc(this);

2. Client 영역 구하기
GetClientRect(&rect);
WM_SIZE 메시지발생후 cx,cy 사용

3. 문자열 사각형안에 그리기
pDC->DrawText(문자열,사각형,Style);
Style: DT_BOTTOM - 문자열을 사각형 맨아래줄에배열 반드시 DT_SINGLELINE과 함께사용
DT_CENTER - 문자열을 가로중앙에 배치
DT_VCENTER - 문자열을 세로중앙에 배치
DT_LEFT,RIGHT - 문자열을 좌,우로 배치
DT_SINGLELINE - 문자열을 한줄로만 쓴다

4. Brush 사용법
CBrush brushname(RGB(red,green,blue)); //브러쉬 생성
CBrush *oldBrush=pDC->SelectObject(&brushname); //이전Brush 저장, 새로운 Brush 선택
pDC->SelectObject(oldBrush); //원래의 브러쉬로 반환

5. Pen사용법
CPen pen(Pen Style,RGB(red,green,blue)); //브러쉬생성
//Style: PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_GEOMETRIC,PS_COSMETRIC - 펜종류
PS_ENDCAP_ROUND,PS_ENDCAP_SQUARE - 펜끝을 둥글게,각지게 설정
CPen *oldPen=pDC->SelectObject(&pen); //이전Pen저장, 새로운 Pen설정
pDC->SelectObject(oldPen); //펜반환

6. 화면다시그리기
View Class에서 - Invalidate(TRUE) : 화면을 지우고다시그린다
Invalidate(FALSE) : 화면을 덮어씌운다
UpdateAllViews(NULL); // Doc Class에서 View 의 OnDraw 호출
RedrawWindow();

7. 메시지,함수 수동으로 넣기 (EX)버튼클릭함수넣기
헤더파일의 AFX_MSG_MAP 부분에 함수를 정의
EX) afx_msg void funcName();
.cpp파일의 AFX_MSG 부분에 메시지를 추가한다
EX) ON_BN_CLICKED(ID_NAME,funcName)...
ID 등록: View 메뉴의 Resource Symbol 에 들어가서 메뉴 ID 를 등록해준다..
.cpp파일의 맨아래에서 함수를 정의한다
EX) void CClass::funcName() { ... }

8. 마우스커서 바꾸기
리소스탭에서 커서를 그리고 저장한뒤 ID값은 준다음
SetCapture(); //커서의입력을 클라이언트영역을 벗어나더라도 받아낸다
SetCursor(AfxGetApp()->LoadCursor(nIDResource));
//APP클래스의 LoadCursor View의 SetCursor 사용
ReleaseCapture(); //SetCursor()상태를 해제한다

9. 색상표 사용하기
CColorDialog dlg;
if(dlg.DoModal()==IDOK) //Dialog 를 띄운후 OK버튼을누르면 실행할부분
MemberFunc: GetColor() //선택된 색상을 받아온다 return 형은 COLORREF 형

10. 팝업메뉴 만들기
CMenu menu; //메뉴 객체생성
CMenu *pmenu; //메뉴 포인터생성
menu.LoadMenu(IDR_MAINFRAME); //메뉴를 불러온다
pmenu=menu.GetSubMenu(3); //메뉴의 3번째 메뉴를 가져온다
menu.CheckMenuItem(ID_MENU,m_kind==ID_MENU ? MF_CHECKED : MF_UNCHECKED);
//메뉴 체크하기 (메뉴 ID, ID 체크조건)
pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this) //(TMP_Style,x좌표,y좌표,hWnd) 메뉴 띄우기

*주의사항*
[안내]태그제한으로등록되지않습니다-OnContextMenu(CWnd* pWnd, CPoint point) //여기서 point 는 스크린 기준이고,
OnRButtonDown(UINT nFlags, CPoint point) //여기서 point 는 클라이언트 기준이다!

11. 클라이언트 포인터를 스크린 포인터로 변경
ClientToScreen(&point);

12. 그림판기능
if(m_flag==FALSE) return; //m_falg=그리기 기능 참,거짓설정 그리기 아니면 빠져나간다
CClientDC dc(this);
CPen myPen(PS_SOLID,m_width,m_color);
CPen *pOldPen=dc.SelectObject(&myPen);
switch(m_shape)
{
case ID_FREELINE: //자유선그리기
dc.MoveTo(m_oldpt.x,m_oldpt.y); //지난포인터부터
dc.LineTo(point.x,point.y); //새포인터까지 그린다
break;
case ID_RECT: //사각형그리기
dc.SetROP2(R2_NOTXORPEN);
dc.Rectangle(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y); //지워지는 효과
dc.Rectangle(m_spt.x,m_spt.y,point.x,point.y); //그려지는 효과
break;
case ID_ELLIPSE: //원그리기
dc.SetROP2(R2_NOTXORPEN);
dc.Ellipse(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y); //지워지는 효과
dc.Ellipse(m_spt.x,m_spt.y,point.x,point.y); //그려지는 효과
break;
case ID_LINE: //선그리기
dc.SetROP2(R2_NOTXORPEN);
dc.MoveTo(m_spt.x,m_spt.y); //시작점부터
dc.LineTo(m_oldpt.x,m_oldpt.y); //지난점까지 그은선을 지운다
dc.MoveTo(m_spt.x,m_spt.y); //시작점부터
dc.LineTo(point.x,point.y); //새로운점까지 그린다
break;
}
m_oldpt=point; //바로이전값 보관
dc.SelectObject(pOldPen); //펜 반환
13. MessageBox
AfxMessageBox() -> 전역함수를 이용하영 메세지 박스를 출력한다. //어디서든지 사용할수 잇다
int CWnd::MessageBox("메세지","창제목","아이콘|버튼(상수값)"); //View클래스에서 사용한다
아이콘 상수값 MB_IC[안내]태그제한으로등록되지않습니다-xxONERROR, MB_ICONWARNING, MB_ICONQUESTION,MB_ICONINFOMATION
MB_SYSTEMMODAL //시스템모달 대화창 닫기전에 다른작업 못함
MB_APPLMODAL //응용모달
버튼 상수값 MB_OK, MB_OKCANCEL, MB_YESNO

14. OS 컨트롤
ExitWindowEx(EWX_SHUTDOWN,NULL); //Shut Down
ExitWindowsEx(EWX_FORCE,0); //강제종료
ExitWindowsEx(EWX_LOGOFF,0); //로그오프
ExitWindowsEx(EWX_POWEROFF,0); //Shut Down -> Turn Off
ExitWindowsEx(EWX_REBOOT); //Shut Down -> Reboot

15. DialogBox 메시지 교환
UpdateData(FALSE); // 컨트롤에 멤버변수의 내용을 표시해준다
UpdateData(TRUE); // 컨트롤 내용을 다이얼로그 클래스의 멤버변수로 저장

16. 자료변환
atoi,itoa - int <=> ASCII(char) 변환
str.Format(" %d %d",x,y); // int형을 문자열로 변환
atol,ltoa - ASCII <=> long 변환
atof - ACSII => float 변환
fcvt,gcvt - 실수를 text로 변환
LPtoDP, DPtoLP - 장치좌표 <=> 논리좌표 변환

17. CEdit Class 사용하기
CEdit e_str.SetSel(int StartChae, int EndChar); //처음문자부터 마지막까지 블록 지정
CEdit e_str.GetSel(int SChar,int EChar); //블럭 지정한 처음문자와 마지막문자 받기
CString str=m_str.Mid(SChar,EChar-SChar); //블럭지정한 부분을 가져온다
18. 컨트롤과 자료교환
SetDlgItemText(컨트롤 ID,문자열) //컨트롤에 문자열을 넣는다
GetDlgItemText(컨트롤 ID,문자열) //컨트롤의 내용을 문자열에 넣는다
GetDlgItem(컨트롤 ID); //컨트롤의 주소를 가져온다
19. 상태바조작
CMainFrame 생성자 위에
static UINT indicators[] = //이안에 새로운 ID를 넣고 그 ID의 갱신핸들러를 만든다음 코딩
pCmdUI->SetText("표시할내용“);

20. 수동으로 Bitmap 컨트롤 사용하기
CStatic bitmap; //bitmap 컨트롤변수
bitmap.SetBitmap(CBitmap m_bitmap); //컨트롤에 비트맵지정
GetDlgItem(IDC_BITMAP)->ShowWindow(SW_SHOW,HIDE); // 그림을 보이거나 숨긴다.
21. 응용프로그램 실행하기
WinExec("프로그램경로“,SW_SHOW,HIDE); //응용프로그램실행,경로는 \\로 구분한다

22. Bitmap 사용하기
CBitmap bitmap.LoadBitmap(IDC_BITMAP); //비트맵객체에 비트맵지정
CDC memDC; //그림그릴 메모리DC생성
MemDC.CreateCompatibleDC(pDC); //화면 DC와 메모리 DC 호환 생성
CBitmap *pOldBitmap=MemDC.SelectObject(&m_bitmap); //메모리에 그림을그린다.
pDC->BitBlt(int x, int y,int Width, int Height, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop);
//BitBlt(그림x좌표,그림y좌표,그림넓이,그림높이,그림그려진메모리DC,그림시작x좌표,그림시작y좌표,스타일);
pDC->StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop )
//StretchBlt(그림x좌표,그림y좌표,그림넓이,그림높이,그림그려진메모리DC,그림x좌표,그림y좌표,메모리그림넓이,메모리그림높이,스타일);
MemDC.SelectObject(pOldBitmap); // 메모리DC반환

23. Font 바꾸기
CFontDialog dlg; //폰트다이얼로그 생성
LOGFONT m_logFont; //폰트받을변수선언
if(dlg.DoModal()==IDOK) //폰트다이얼로그표시
{dlg.GetCurrentFont(&m_logFont)} //선택된 폰트받기
OnDraw()
CFont newFont,*pOldFont; //폰트 객체 만들기
newFont.CreateFontIndirect(&m_logFont); //폰트 생성
pOldFont=(CFont *)pDC->SelectObject(&newFont); //폰트 선택
OnCreate()
CClientDC dc(this); //DC 생성
CFont *pFont=dc.GetCurrentFont(); //클라이언트 영역의 폰트를
pFont->GetLogFont(&m_logFont); //로그폰트 멤버값으로 지정

24. Font 만들기
LOGFONT logfont; //폰트를 만든다
logfont.lfHeight=50; //문자열 높이
logfont.lfWidth=0; //너비
logfont.lfEscapement=0; //문자열기울기
logfont.lfOrientation=0; //문자개별각도
logfont.lfWeight=FW_NORMAL; //굵기
logfont.lfItalic=TRUE; //이탤릭
logfont.lfUnderline=TRUE; //밑줄
logfont.lfStrikeOut=FALSE; //취소선
logfont.lfCharSet=HANGUL_CHARSET; //필수
logfont.lfOutPrecision=OUT_DEFAULT_PRECIS;
logfont.lfClipPrecision=CLIP_DEFAULT_PRECIS; //가변폭폰트 고정폭폰트
logfont.lfPitchAndFamily=DEFAULT_PITCH|FF_SWISS; //글꼴이름
strcpy(logfont.lfFaceName,"궁서체");
CClientDC dc(this);
CFont newFont; //폰트객체생성
newFont.CreateFontIndirect(&logfont); //폰트지정
CFont *pOldFont=dc.SelectObject(&newFont); //폰트선택
dc.TextOut(100,100,m_text);
dc.SelectObject(pOldFont); //폰트반환

25. Font 만들기 2
CFont newFont;
newFont.CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );
CFont *pOldFont=dc.SelectObject(&newFont);

26. ComboBox 사용하기
CComboBox combo; //콤보박스 선언
combo.Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
//Style - WS_CHILD|WS_VISIBLE
int n=combo.GetCurSel(); //선택된 아이템의 index를 가져온다
combo.AddString("문자열“); //문자열을 추가한다
combo.GetLBText(n,str); //n번째 아이템을 str에 저장

27. Spin 사용하기
Spin은 바로앞의 Tab Order에 따라 붙는다
m_spinr.SetRange(1900,3000); //스핀 범위 지정
m_spinr.SetPos(m_nYear); //스핀 위치 지정

28. CTime사용하기
CTime time; //시간객체생성
time=CTime::GetCurrentTime(); //현재시간을 저장
time.GetYear(),time.GetMonth();,time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond()

29. CListBox 메소드
AddString("문자열"); //리스트에 문자열 추가
DeleteString(index); //리스트에서 항목 삭제
GetCount() //전체 항목 갯수를 얻는다.
GetSelcount() //선택된 항목 갯수 리턴
GetSel() //선택된 것인지 아닌지를 리턴한다 -> 양수 = TRUE , 음수 => FALSE
GetText(int index,문자열변수) //index 번째 문자열을 문자열 변수에 넣는다
FindStringExact(문자열) //지정 문자열의 index 값 리턴 -> 없으면 리턴값 LB_ERR 반환
FindString("a") //"a"로 시작하는 항목을 모두 찾는다.
ResetCountent() //모든 내용을 지운다.

30. 파일입출력
프로젝트생성시 Step4 => Advanced => 저장파일확장자지정
.h 파일에 DECLARE_SERIAL(CSawon) //이 클래스를 저장,로드가능한 클래스로 쓰겟다는 선언
.cpp 파일에 IMPLEMENT_SERIAL(CSawon,CObject,1) //이거를 해야 저장이 가능하다
void CFileioDoc::Serialize(CArchive& ar)
if (ar.IsStoring()) //저장하기
{ar<
else //열기
{ar>>m_shape; //불러올걸 쓴다. 읽을때도순서대로읽어야한다}

31. MicroSoft FlexGrid 사용하기!
CMSFlexGrid m_Grid; //FlexGrid 컨트롤 변수
CString strTitle[]={"고객코드","고객성명","고객포인트","신장","몸무게","고객등급","BMT지수","판정결과"};
// Grid 의 제목에 넣을문자배열
int Width[]={900,900,1100,800,800,900,1000,900};
// Grid 의 열넓이 지정할 배열
m_Grid.SetRows(m_cnt+2); //전체행수 지정
m_Grid.SetCols(8); //전체열수 지정
m_Grid.Clear(); //지우기
m_Grid.SetFixedCols(0); //고정열은 없다.
m_Grid.SetRow(0); // 행선택
for(int i=0;i<=7;i++)
{
m_Grid.SetColWidth(i,Width[i]); //열 넓이 설정
m_Grid.SetCol(i); //열 선택
m_Grid.SetText(strTitle[i]); // 선택된행, 선택된열에 Text 를 넣는다
}

32. 4대 Class간 참조
//각각 헤더파일 include
#include "MainFrm.h" //메인프레임 헤더파일
#include "ClassDoc.h" //Doc클래스 헤더파일
#include "ClassView.h" //View를 include 할때는 반드시 Doc 헤더파일이 위에잇어야한다
#include "Class.h" //APP Class 의 헤더파일

void CClassView::OnMenuView() //뷰클래스
CClassApp *pApp=(CClassApp *)AfxGetApp(); //View -> App
CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //View -> MainFrm
CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument(); //View -> MainFrm -> Doc
CClassDoc *pDoc=(CClassDoc *)GetDocument(); //View -> Doc

//MainFrame 클래스
CClassView *pView=(CClassView *)GetActiveView(); //MainFrm -> View
CClassDoc *pDoc=(CClassDoc *)GetActiveDocument(); //MainFrm -> Doc
CClassApp *pApp=(CClassApp *)AfxGetApp(); //MainFrm -> App

//Doc 클래스
CClassApp *pApp=(CClassApp *)AfxGetApp(); //Doc -> App
CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //Doc -> MainFrm
CClassView *pView=(CClassView *)pMain->GetActiveView(); // Doc -> MainFrm -> View
CClassView *pView=(CClassView *)m_viewList.GetHead(); // Doc -> View

//App 클래스
CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //App -> MainFrm
CClassView *pView=(CClassView *)pMain->GetActiveView(); //App -> MainFrm -> View
CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument(); //App -> MainFrm -> Doc

33. ToolBar 추가하기
CMainFrame 으로 가서 멤버변수 추가
CToolBar m_wndToolBar1;
OnCreate 로 가서 다음 내용을 추가해준다 (위의 toolbar 부분을 복사하고 이름만 바꾸면 된다.3군데..)
if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}

그 함수내에서 //TODO 아래에 내용추가..역시..복사해서 이름만 바꾸면 된다.
m_wndToolBar1.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);
//DockControlBar(&m_wndToolBar1); <= 이부분 대신..
이거를 넣는다..
CRect toolRect; //툴바 영역을 얻을 사각형
this->RecalcLayout(); //현상태의 Client 영역을 구해서 저장한다
m_wndToolBar.GetWindowRect(&toolRect); //툴바영역을 저장한다
toolRect.left+=1; //사각형의 왼쪽을 1Pixel 줄인다
DockControlBar(&m_wndToolBar1,AFX_IDW_DOCKBAR_TOP,&toolRect); //ToolRect에 툴바를 붙인다
return 0;

34. ToolBar에 ComboBox붙이기
CComboBox m_combo; //객체생성
ID 등록 => view 메뉴 => resource symbol => new => ID_COMBO
oncreate 에 내용 추가 (콤보를 만들고 표시하는 내용)
m_wndToolBar.SetButtonInfo(10,IDC_COMBO,TBBS_SEPARATOR,150);
//툴바의 10번째버튼을 편집한다
CRect itemRect; //콤보를넣을 사각형을 만든다
m_wndToolBar.GetItemRect(10,&itemRect); //툴바의 10번째 버튼을 사각형에 넣는다
itemRect.left+=5; //앞여백
itemRect.right+=5; //뒤여백
itemRect.bottom+=100; //콤보가열릴 공간확보
m_combo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,itemRect,&m_wndToolBar,IDC_COMBO);
//콤보박스를 툴바에 붙여준다
m_combo.AddString("이름"); //내용추가
m_combo.SetCurSel(0); //셀 선택

35. Toolbar에 수동으로넣은 ComboBox 사용하기
afx_msg void [안내]태그제한으로등록되지않습니다-xxOnSelectCombo(); //원형
ON_CBN_SELCHANGE(IDC_COMBO,[안내]태그제한으로등록되지않습니다-xxOnSelectCombo) //메세지맵에 추가
CMainFrame *pMain=(CMainFrame *)GetParent(); //메인프레임 주소참조
CComboBox *pCom=(CComboBox *)(pMain->m_wndToolBar.GetDlgItem(IDC_COMBO));
//콤보박스의 주소를 가져온다, 접근할 때 메인프레임 -> 툴바 -> 콤보박스 의 순서로 가야한다
int n=pCom->GetCurSel(); //현재선택된 셀의 인덱스를 가져온다
if(n==CB_ERR) return; //선택된셀이 없으면 중지한다
CString str;
pMain->m_combo.GetLBText(n,str); //선택된셀의 Text를 가져온다

36. UPDATE_COMMAND 사용하기
pCmdUI->Enable(TRUE); //버튼 활성화
pCmdUI->SetText((bAdd)?"취소":"신규"); //버튼의 text 설정
pCmdUI->SetCheck(TRUE); //버튼 체크

37. 프로그램정보저장
CWinApp::GetProfileString(섹션명,항목명,기본값); // 함수를 사용한다. (문자열)
CWinApp::GetProfileInt(섹션명,항목명,기본값); //불러올때사용 (숫자)
CWinApp::WriteProfileString(섹션명,항목명,값); //저장할때 사용 (문자열)
CWinApp::WriteProfileInt(섹션명,항목명,값); //저장할때 사용 (숫자)
//불러올때 사용할함수
void CMainFrame::ActivateFrame(int nCmdShow) //프로그램 실행후 프레임생성될때 실행
//저장할 때 WM_DESTROY 메시지 사용

38. 컨트롤바 표시하기
CMainFrame *pMain=(CMainFrame *)GetParent(); //MainFrame 주소가져오기
pMain->ShowControlBar(&pMain->m_wndToolBar,bTool1,FALSE); //툴바를 bTool2 에따라 보이고 감춘다

39. Window 창크기,위치정보 저장하기
MainFrame 의 WM_DESTROY 에
WINDOWPLACEMENT w;
this->GetWindowPlacement(&w); //윈도우의 정보를 저장한다.
CString strRect;
strRect.Format("%04d,%04d,%04d,%04d", //04d 는 4자리 확보하고 남은건 0으로 채워라
w.rcNormalPosition.left,w.rcNormalPosition.top,
w.rcNormalPosition.right,w.rcNormalPosition.bottom); //윈도우의 위치,크기 확보..
BOOL bMax,bMin; //윈도우의 상태를 저장하기위한 변수
//w.falg 는 이전상태의 정보를 가지고 잇다!!
if(w.showCmd==SW_SHOWMINIMIZED) //최소화 상태
{
bMin=TRUE;
if(w.flags==0) //falg 값이 0 이면 이전 상태가 보통상태이다!!
bMax=FALSE;
else //이전상태가 최대화 상태
bMax=TRUE;
}
else
{
if(w.showCmd==SW_SHOWMAXIMIZED) //최대화상태
{
bMax=TRUE;
bMin=FALSE;
}
else //보통 상태
{
bMax=FALSE;
bMin=FALSE;
}
}
AfxGetApp()->WriteProfileString("WinStatus","Rect",strRect);
AfxGetApp()->WriteProfileInt("WinStatus","Max",bMax);
AfxGetApp()->WriteProfileInt("WinStatus","Min",bMin);

//읽어올차례..
ActivateFrame 함수로 가서
WINDOWPLACEMENT w; //윈도우의 상태를 저장하는 구조체..
BOOL bMax,bMin; //최대,최소상태를 저장할 변수
CString strRect; //창크기를 받아올 변수
strRect=AfxGetApp()->GetProfileString("WinStatus","Rect","0000,0000,0500,0700");
bMin=AfxGetApp()->GetProfileInt("WinStatus","Min",FALSE);
bMax=AfxGetApp()->GetProfileInt("WinStatus","Max",FALSE);
int a=atoi(strRect.Left(4)); //문자열을 int 로 바꿔준다.
int b=atoi(strRect.Mid(5,4)); //atoi 아스키 값을 int형으로 바꿔준다..
int c=atoi(strRect.Mid(10,4));
int d=atoi(strRect.Mid(15,4));
w.rcNormalPosition=CRect(a,b,c,d);
if(bMin)
{
w.showCmd=SW_SHOWMINIMIZED;
if(bMax)
{
w.flags=WPF_RESTORETOMAXIMIZED ;
}
else
{
w.flags=0;
}
}
else
{
if(bMax)
{
w.showCmd=SW_SHOWMAXIMIZED;
}
else
{
w.showCmd=SW_SHOWNORMAL;
}
}
this->SetWindowPlacement(&w); //설정된 값으로 윈도우를 그리게 한다..
//CFrameWnd::ActivateFrame(nCmdShow); //이건 반드시 주석처리한다..

40. progress Bar 쓰기

m_progress.SetRange(m_first,m_last); //Progress 범위설정하기
m_progress.SetStep(m_step); //Progress Step설정하기
//m_progress.StepIt(); //스텝만큼 움직이기
//또는 다음을 사용한다
for(int a=m_first;a<=m_last;a+=m_step) //a가 처음부터 끝까지
{
m_progress.SetPos(a); // 위치를 a에 맞춘다
Sleep(50); //천천히 움직이게한다
}

41. 파일대화상자 FileDialog 사용하기
void CConDlg1::OnFileopen() //파일열기 버튼
{
CFileDialog *fdlg; //파일대화상자 객체 생성 // 포인터로 만든다..
static char BASED_CODE szFilter[] = "Animate Video Files (*.avi)|*.avi|All Files (*.*)|*.*||";
//필터를 만들어 준다..이건 할줄 모름..
fdlg =new CFileDialog(TRUE, ".avi", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
//대화상자 만들기..이렇게 해야댄다..
if(fdlg->DoModal()==IDOK) //이제..대화상자를 띠우고..
{ //OK 누르면 실행될 부분..
m_filename=fdlg->GetPathName(); //대화상자에서 경로를 받아서 저장.
UpdateData(FALSE);
}
}
선생님이 해준거 //파일 다이얼로그 만들기
CFileDialog fdlg(TRUE,"avi",".avi",OFN_OEVRWRITEPROMPT,"Vidoe Files(*.avi)|*.avi|All Files(*.*)|*.*||");

42. Animate Control 사용하기
m_animate.Open(m_filename); //파일을 연다
m_animate.Play(0,-1,1); //(처음프레임,마지막프레임,반복횟수)
m_animate.Stop(); //정지시키기
m_ani.SetAutoStart(TRUE); //자동으로 시작한다
43. Control 의 Style 바꿔주기
Control.ModyfyStyle(제거할스타일,추가할스타일); //스타일은 MSDN내용 참조

44. 시스템 날자바꾸기 버튼
//SetSystemTime(),GetSystemTime() //GMT 표준시를 가져온다.
//GetLocalTime(),SetLocalTime() //현재 지역시간을 가져온다.

SYSTEMTIME st;
GetLocalTime(&st); //현재 시간, 날자를 넣는다.
st.wYear=m_date2.GetYear();
st.wMonth=m_date2.GetMonth();
st.wDay=m_date2.GetDay();
SetSystemTime(&st);

45. 시스템 시간 바꾸기 버튼
UpdateData(TRUE);
SYSTEMTIME st;
GetLocalTime(&st);
st.wHour=m_time.GetHour();
st.wMinute=m_time.GetMinute();
st.wSecond=m_time.GetSecond();
SetLocalTime(&st);

46.시스템의 드라이브 문자 얻기

char temp[50];
GetLogicalDriveStrings(sizeof(temp),temp);
CString str,str1;
int n=0;
while(*(temp+n)!=NULL)
{
str=temp+n;
str1+= " "+str.Left(2);
n+=4;
}

47. 현재 작업경로 얻기
char temp[MAX_PATH]; //MAX_PATH 는 경로길이의 최대를 define 해놓은것.
GetCurrentDirectory(sizeof(temp),temp); // 현작업하는 경로를 얻어온다.(경로 길이,문자형);

48. Tree Control 사용하기
HTREEITEM hmov,hmus; //핸들을받을 변수 이게 잇어야 하위 디렉토리 생성가능
hmov=m_tree.InsertItem("영화",TVI_ROOT,TVI_LAST); //,TVI_ROOT,TVI_LAST는 default
hm1=m_tree.InsertItem("외화",hmov); //hmov 아래 “외화”트리 생성
CImageList m_image; //그림을 사용하기 위한 클래스다!! 알아두자..
m_tree.SetImageList(&m_image,TVSIL_NORMAL); //Tree View Style Image List => TVSIL
hmov=m_tree.InsertItem("영화",0,1,TVI_ROOT,TVI_LAST); //,TVI_ROOT,TVI_LAST는 default
hmus=m_tree.InsertItem("가요",1,2); //("문자열",처음그림번호,선택시그림)
hm1=m_tree.InsertItem("외화",2,3,hmov); //그림 번호는 default 로 0이 들어간다..

49. List Control 사용하기
m_list.ModifyStyle(LVS_TYPEMASK, LVS_ICON); //리스트를 큰아이콘형태로 보인다
m_list.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); //리스트를 작은아이콘형태로 보인다
m_list.ModifyStyle(LVS_TYPEMASK, LVS_LIST); //리스트를 리스트형태로 보인다
m_list.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); //리스트를 자세히형태로 보인다

CImageList m_treeimage; //이미지리스트
CImageList m_small, m_large;
m_large.Create(IDB_LARGE,32,0,RGB(255,255,255)); //이거는 클래스에서 추가해준거다
m_small.Create(IDB_SMALL,16,0,RGB(255,255,255)); (bmp ID값,
m_list.SetImageList(&m_large,LVSIL_NORMAL);
m_list.SetImageList(&m_small,LVSIL_SMALL);
CString name[]={"홍길동","진달래","한국남","개나리"};
CString tel[]={"400-3759","304-7714","505-9058","700-9898"};
CString born[]={"1980-1-1","1981-12-20","1980-05-15","1981-08-31"};
CString sex[]={"남자","여자","남자","여자"};
m_list.InsertColumn(0,"이름",LVCFMT_LEFT,70);
m_list.InsertColumn(1,"전화번호",LVCFMT_LEFT,80);
m_list.InsertColumn(2,"생일",LVCFMT_LEFT,90);
m_list.InsertColumn(3,"성별",LVCFMT_LEFT,50);
LVITEM it; //리스트 구조체
char temp[100];
for(int a=0;a<4;a++)
{
int n=(sex[a]=="남자")?0:1;
m_list.InsertItem(a,name[a],n); //insert item 은 행을 만들고..
it.mask=LVIF_TEXT|LVIF_IMAGE; //마스크 설정
it.iItem=a;
it.iSubItem=1; //열 설정
strcpy(temp,tel[a]); //이거 모하는거냐..
it.pszText=temp;
m_list.SetItem(&it); // setitem 열에 정보를 넣는다.

it.iSubItem=2; //열 설정
strcpy(temp,born[a]); //이거 모하는거냐..
it.pszText=temp;
m_list.SetItem(&it); // setitem 열에 정보를 넣는다.

it.iSubItem=3; //열 설정
strcpy(temp,sex[a]); //이거 모하는거냐..
it.pszText=temp;
m_list.SetItem(&it); // setitem 열에 정보를 넣는다.


50. Bitmap Button 사용하기
CBitmapButton 을 사용한다! CButton 에서 상속 받는클래스임..
m_button1.Create(NULL,
WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,CRect(310,20,370,50),
this,IDC_MYBUTTON); //버튼만들기
m_button1.LoadBitmaps(IDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE); //버튼의 그림설정
m_button1.SizeToContent(); //버튼을 그림 크기로 맞춰 준다!!

그냥 버튼을 비트맵버튼으로 바꾸기 -> 버튼을 만든다 속성에서 OWNERDRA 속성에 체크!!
m_button2.LoadBitmaps(IDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE); //버튼의 그림설정
m_button2.SizeToContent(); //버튼을 그림 크기로 맞춰 준다!!

51. 중복없는 난수발생하기
int su; //발생된 난수저장
int a,b;
BOOL bDasi; //숫자가중복될경우 다시하기위한 변수
for(a=0;a<9;a++) //난수 9개 발생
{
bDasi=TRUE;
while(bDasi)
{
bDasi=FALSE;
su=rand()%10; //난수발생
for(b=0;b
{
if(temp[b]==su) //중복이면
{
bDasi=TRUE; //중복이 잇으면 다시while 문을 실행한다
break;
}//if
}//for
}//while
temp[a]=su; //중복이 아니면 대입한다

52. 메뉴 범위로 사용하기
ON_COMMAND_RANGE(ID_LEVEL3,ID_LEVEL9,OnLevel); //범위메세지 발생
//메뉴 ID의 값이 연속된 숫자일 경우 범위로 지정해서 사용할수잇다

53. 한,영 전환함수
void CCustView::SetHangul(BOOL bCheck) //T:한글 F:영문 이건 외우자..
{
HIMC hm=ImmGetContext(this->GetSafeHwnd()); //뷰클래스의 윈도우 핸들포인터를 얻는다.
if(bCheck)
{
::ImmSetConversionStatus(hm,1,0); //1은 한글 0은 영문
}
else
{
::ImmSetConversionStatus(hm,0,0); //영문으로 바꿔준다
}
::ImmReleaseContext(this->GetSafeHwnd(),hm); //장치를 풀어준다
}
#include "imm.h" //헤더 반드시 추가하고
imm32.lib (라이브러리 파일)를 반드시 링크해주어야 한다!
**** 라이브러리 추가하기
프로젝트메뉴 -> 셋팅 -> 링크탭

54. DLL함수정의하기
임포트함수 : extern "C" __declspec(dllimport) 리터형 함수명(매개변수,...) ;
- 메인프로그램에서 DLL에 있는 함수를 호출할때 사용한다.

엑스포트함수 : extern "C" __declspec(dllexport) 리터형 함수명(매개변수,...)
{
내용;
}

2011년 5월 6일 금요일

신경망 용어 정리

Activation(활성화 값)
신경망에서 뉴런에 인가되는 가중치 합

Adaline(아달라인)
패턴의 범주화에 쓰이는 Grossberg와 Carpenter에 의해 개발된 이론이며, 안정성-유연성(stability-plasticity) 딜레마에 대해 설명하는 데 쓰인다.

Adaptive Resonance Theory(ART)
단계적으로 문제를 풀어나가는 과정

Annealing(어닐링)
네트워크가 지역최소 값(Local Minimum)으로 떨어지는 것을 막는 처리

ART(Adaptive Resonance Theory)
ART1은 이진입력에 대한 이 이론의 초기개발 결과이다. ART2는 아날로그 입력에 대해 더욱 발전된 것이다. ART3은 가장 최근의 이론이다.

Artificial Neuron(인공 뉴런)
인공 신경망의 주된 목적은 인간의 뇌의 신경세포의 동작을 흉내내는 것이다. 인공 신경 세포는 신경망의 처리 요소이다.

Associative Memory(연상 메모리)
하나의 패턴이나 객체로서 그 자신이나 다른 것을 연상시키는 행위

Autoassociative(자기 연상)
하나의 패턴이나 객체로 그 자신과 대응시키는 것

Backpropagation(역전파)
출력층의 에러가 학습이 이루어지기 전에 이전 계층으로 피드백되는 피드포워드 네트워크를 위한 신경망 트레이닝 알고리즘. 만일, 이전 계층이 입력층이 아니면 이 은닉층의 에러는 이전 계층으로 피드백된다.

BAM
Bidirectional Associative Memory 네트워크 모델

Bias(바이어스)
뉴런의 Activation에 가해지는 값

Binary Digit
0 또는 1의 값

Bipolar Value
-1 또는 +1의 값

Boltzmann Machine(볼츠만 머신)
출력이 확률분포로 결정되는 한 신경망. 시뮬레이티드 어닐링(Simulated Annealing)을 이용하여 트레이닝되고 동작한다.

Brain-State-in-a-Box
Anderson의 단일 계층이며, 글자 그대로 연결된 신경망. 잡음이 섞이거나 불완전한 입력에서도 동작한다.

Cauchy Machine(코시 머신)
Boltzmann Machine과 비슷하며, Cauchy분포가 확률에 사용된다는 것만 다르다.

Cognitron(코그니트론)
Neocognitron의 선행자. 캐릭터를 인식하기 위해 개발된 네트워크

Competition(경쟁)
어떤 기준에 의해 winner가 뉴런의 계층에서 선택되는 과정. 경쟁(competition)은 억제(inhibition)에게 어떤 연결 가중치에 음의 부호의 값을 갖도록 하게 한다.

Conneciton(연결)
하나의 뉴런에서 다른 뉴런으로 입력을 전달하는 방법

Connection weight(연결 가중치)
연결과 관련된 수치적인 라벨이며 입력의 가중치 합에 사용된다.

Constraints(한정)
방정식이나 부등식으로 표현되는 조건이며 그 변수에 의해 만족되어야 한다.

Convergence(수렴)
최종 결과로서 과정을 끝내는 것

Crisp(크리스프)
퍼지의 반대-어떤 실체(entity)에 대한 특정한 수치적 양이나 값

Delta Rule(델타 규칙)
출력과 발생된 에러를 모두 사용하여 연결 가중치를 교정하기 위한 규칙이다. 또한 LMS규칙이라고도 불린다.

Energy Function(에너지 함수)
신경망에서 출력과 가중치의 함수이며, 시스템의 상태, 즉 Lyapunov 함수를 결정한다.

Excitation(여기)
연결에 양의 부호의 가중치를 가하여 출력이 뉴런을 fire하게 한다.

Exampler(견본)
신경망을 트레이닝 시키는 패턴이나 객체의 대표적인 예

Expert System(전문가 시스템)
시스템이 전문가처럼 수행하도록 하는 공식화된 규칙들의 집합

FAM(Fuzzy Associative Memory) 네트워크
퍼지 집합들 간을 관련시킨다.

Feedback(피드백)
퍼지 집합요소의 포함정도(Degree of Membership)의 값으로 이루어진 벡터

Fully connected Network(완전 연결 네트워크)
모든 뉴런이 모든 다른 뉴런과 연결된 신경망

Fuzzy(퍼지)
크리스프(Crisp)와 반대되는 변수와 관련이 있다. 퍼지양(Fuzzy Quantity)은 단일 수치값과 상반된 값의 범위를 나타낸다. 즉, "뜨겁다"와 "89.4도".

Fuzziness(퍼지니스)
어느 정도까지 중복되는 다른 개념. 예를 들면, 순조로운 온도와 차가운 온도에 대한 묘사는 약간의 온도 구간에서 중복된다.

Fuzzy Associative Memory(퍼지 연상 메모리)
퍼지 집합들 간에 관련을 짓기 위한 신경망 모델

Fuzzy Equivalence Relation(퍼지 등가 관계)
반사적이고, 대칭적이며, 바꾸어 놓을 수 있는 퍼지관계(퍼지 변수들 간의 관계)

Fuzzy Partial Order(퍼지 부분 차수)
반사적이고, 반대칭적이며, 천이적인 퍼지관계(퍼지 변수들 간의 관계)

Gain(이득)
액티베이션을 향상시키기 위한 어떤 수치적 요인. 동일한 목적을 위한 연결

Generalized Delta Rule(일반화된 델타규칙)
은닉층의 가중치가 역전파된 에러에 의해 교정되는 역전파 트레이닝(Training)과 같은 네트워크의 트레이닝에 쓰이는 규칙

Global Minimum(전역 최소값)
함수의 값이 함수 영역의 어떤 점에서의 값보다 크지 않은 점

Hamming Distance(해밍 거리)
이진 벡터가 서로 다른 위치의 수

Hebbian Learning(헵의 학습)
Hebb규칙이 사용되는 학습알고리즘

Heteroassociative(이질 연상)
두 개의 서로 다른 패턴이나 물체 사이의 연상을 하는 것

Hidden Layer(은닉층)
입력층과 출력층 사이에 있는 뉴런들의 배열

Hopfield network(홉필드 네트워크)
단일 계층이고, 완전히 연결되고, 자기 연상적인 신경망

Inhibition(억제)
다른 뉴런에 의한 Firing의 기회를 줄이기 위한 뉴런에 의한 시도

Input Layer(입력층)
외부 입력이나 신호가 가해지는 뉴런들의 배열

Instar(인스타)
다른 뉴런과 연결되어 있지 않은 뉴런

Lateral Connection(측면 연결)
같은 계층에 있는 두 뉴런 간의 연결

Layer(계층)
네트워크가 동작하기 위해 구성된 것과 비슷하게 구성한 뉴런들 간의 배열

Learning(학습)
네트워크 동작의 목적을 이루기 위해 연결 가중치의 적절한 집합을 찾는 과정

Linearly Separable(선형적으로 분리 가능한)
선형 장벽(Hyperplane)을 갖는 선형적이 집합의 두 서브셋(Subsets)

LMS Rule(최소 자승 평균 에러 규칙)
Least Mean Squared Error Rule. 자승 에러의 평균을 최소화하기 위한 목적. 델타 규칙과 동일하다.

Local Minimum(지역 최소값)
함수의 값이 이웃한 다른 점의 값보다 크지 않은 점

Long-Term Memory(LTM, 장기 메모리)
확장된 단계를 위해 남겨둔 인코드된 정보

Lyapunov Function(리야프노브 함수)
경계값 이하의 함수이며, 시스템의 상태의 모든 변화에 따라 감소하는 시스템의 상태를 나타낸다.

Madaline(마달라인)
입력층이 Adaline인 유닛을 갖는 신경망. 즉 다중-Adaline

Mappine(매핑)
두 집합의 요소들 간의 대응

Neural Network(신경망)
계층에서의 처리 요소들의 집합이며 뉴런 쌍들 간의 연결 끝의 집합. 입력이 한계층에서 수신되고 출력은 그와 같은 계층이나 다른 계층에서 발생된다.

Noise(잡음)
입력의 왜곡

Nonlinear Optimization(비선형 최적화)
그것의 목적이나 제한이 비선형적인 함수를 갖는 문제를 위한 해결책을 찾는 것

On Center Off Surround
여기적인(Excitatory)가중치를 가까이 있는 뉴런과의 연결에 할당하고, 억제적인 (Inhibitory) 가중치를 멀리 떨어진 뉴런과의 연결에 할당하는 것

Orthogonal Vectors(직교 벡터)
그 내적이 0이 된다.

Outstar(아웃스타)
입력 연결을 갖는 뉴런

Perceptron(퍼셉트론)
선형 패턴 매칭을 하기 위한 신경망

Plasticity(유연성)
새로운 입력으로 시뮬레이션 되거나 새로운 매핑을 학습하거나 또는 현재 존재하는 것을 수정할 수 있는 능력.

Resonance(공진)
입력을 범주화(Categorizing)할 때, 서로 다른 계층에 있는 두 뉴런들의 응답성. 두 방향이 등가인 상태.

Saturation(포화)
뉴런이 점화(fire)할 수 있는 빈도수의 제한 조건.

Self-Organization(자기 조직화)
출력층 뉴런을 개별적인 패턴이나 가케고리로 분할하는 과정이며, 자율학습 또는 클러스터링(Clustering)이라 불린다.

Short-Term Memory(STM, 단기 메모리)
대응하는 입력을 제거한 후에, 오랫동안 저장되지 않는 저장 정보.

Simulated Annealing(시뮬레이티드 어닐링)
에너지나 온도 또는 비용 등을 감소하도록 변화가 이루어지는 알고리즘

Stability(안정성)
네트워크 동작이 정상상태 해에 수렴하는 성질.

Supervised Learning(지도 학습)
견본 집합이 입력과 요구되는 출력의 쌍으로 구성된 학습처리.

Threshold Value(임계값)
뉴런이 점화할 것인가의 여부를 결정하기 위해 뉴런의 활성화 값과 비교하기 위해 사용되는 값. 종종 뉴런의 출력을 결정하는 데 있어 임계값이 0이 되도록 하기 위해 뉴런의 활성화 값에 바이어스 값이 더해진다.

Training(트레이닝)
입력과 출력자극(지도학습)을 인가하거나, 입력자극(자율학습)만을 인가하여 신경망이 학습하도록 도와주는 과정이며, 가중치가 변화되도록 해준다.

Unsupervised Learning(자율 학습)
출력에 대한 외부의 정보가 없는 학습이며, 또한 자기 조직화나 클러스터링이라고도 불린다.

Vigilance Parameter(경계 변수)
ART(Adaptive Resonance Theory)에 사용되는 파라미터. 이것은 네트워크의 종속시스템(Subsystem)의 활성화 값을 선택적으로 막아주기 위해 사용된다.

Weight(가중치)
뉴런이나 두 뉴런 간의 연결과 관련된 수이며, 뉴런의 활성화 값을 결정하기 위한 출력을 할당할 때 사용된다.