MFC Tip!! - 정리편 (펌) - ToolBar에 ComboBox붙이기, 프로그램정보저장, 컨트롤바 표시하기, Window 창크기,위치정보 저장하기
C++ 2007. 10. 27. 01:37 |(펌) - http://fefene.tistory.com/88
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 주소가져오기
//툴바를 bTool2 에따라 보이고 감춘다
pMain->ShowControlBar(&pMain->m_wndToolBar,bTool1,FALSE);
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); //이건 반드시 주석처리한다..