2015년 4월 25일 토요일
CRecordSet Data가 잘립니다. 현상 해결 방법
Visual C++SQL: SQL 및 C++ 데이터 형식(ODBC)
참고
이 내용은 MFC ODBC 클래스에 적용됩니다. MFC DAO 클래스를 사용하려면 DAO 도움말의 "Microsoft Jet 데이터베이스 엔진 SQL과 ANSI SQL의 비교" 항목을 참조하십시오.
다음은 ANSI SQL 데이터 형식을 C++ 데이터 형식으로 매핑한 표입니다. 이 표는 MSDN LIBRARY CD의 ODBC SDK 프로그래머 참조에 있는 부록 D의 C 언어 내용을 보완한 것입니다. 마법사는 대부분의 데이터 형식 매핑을 자동으로 관리합니다. 마법사를 사용하지 않는 경우 해당 매핑 정보를 사용하면 필드 교환 코드를 직접 작성하기가 쉬워집니다.
C++ 데이터 형식에 매핑되는 ANSI SQL 데이터 형식
ANSI SQL 데이터 형식 C++ 데이터 형식
CHAR
CString
DECIMAL
CString 1
SMALLINT
int
REAL
float
INTEGER
long
FLOAT
double
DOUBLE
double
NUMERIC
CString 1
VARCHAR
CString
LONGVARCHAR
CLongBinary, CString 2
BIT
BOOL
TINYINT
BYTE
BIGINT
CString 1
BINARY
CByteArray
VARBINARY
CByteArray
LONGVARBINARY
CLongBinary, CByteArray 3
DATE
CTime, CString
TIME
CTime, CString
TIMESTAMP
CTime, CString
1. SQL_C_CHAR가 기본 ODBC 전송 형식이기 때문에 ANSI DECIMAL 및 NUMERIC은 CString에 매핑됩니다.
2. 255자를 넘는 문자 데이터는 CString에 매핑될 때 기본값으로 잘립니다. RFX_Text의 nMaxLength 인수를 명시적으로 설정하면 잘림 길이를 늘릴 수 있습니다.
3. 255자를 넘는 이진 데이터는 CByteArray에 매핑될 때 기본값으로 잘립니다. RFX_Binary의 nMaxLength 인수를 명시적으로 설정하면 잘림 길이를 늘릴 수 있습니다.
ODBC 커서 라이브러리를 사용하지 않는 경우 Microsoft SQL Server ODBC 드라이버 및 MFC ODBC 데이터베이스 클래스를 사용하여 둘 이상의 긴 가변 길이 필드를 업데이트하려고 하면 문제가 발생할 수 있습니다. ODBC 형식 SQL_LONGVARCHAR 및 SQL_LONGVARBINARY는 텍스트 및 이미지 SQL 서버 형식으로 매핑됩니다. 동일한 CRecordset::Update 호출에서 둘 이상의 긴 가변 길이 필드를 업데이트하면 CDBException이 throw됩니다. 따라서 CRecordset::Update를 사용하여 여러 개의 긴 열을 동시에 업데이트하면 안 됩니다. 여러 개의 긴 열은 ODBC API SQLPutData를 사용하여 동시에 업데이트할 수 있습니다. ODBC 커서 라이브러리를 사용할 수도 있습니다. 그러나 SQL Server 드라이버처럼 커서를 지원하지만 커서 라이브러리가 필요 없는 드라이버에 대해서는 ODBC 커서 라이브러리를 사용하지 않는 것이 좋습니다.
MFC ODBC 데이터베이스 클래스 및 Microsoft SQL Server ODBC 드라이버와 함께 ODBC 커서 라이브러리를 사용하는 경우 CRecordset::Update를 호출한 다음 CRecordset::Requery를 호출하면 CDBException과 함께 ASSERT가 발생할 수도 있습니다. 그러므로 CRecordset::Requery 대신 CRecordset::Close를 호출한 다음 CRecordset::Open을 호출하는 것이 좋습니다. 다른 해결책은 ODBC 커서 라이브러리를 사용하지 않는 것입니다. SQL Server 및 SQL Server ODBC 드라이버는 기본적으로 커서를 지원하기 때문에 ODBC 커서 라이브러리가 필요하지 않습니다.
참고 항목
개념
SQL
SQL: SQL 직접 호출(ODBC)
출처 : http://msdn2.microsoft.com/ko-kr/library/eshhha8h(VS.80).aspx
내 출처: http://blog.naver.com/saojung50?Redirect=Log&logNo=120037017632
감사요
라벨:
문자 짤림,
CRecordSet,
MFC,
MoveNext
2015년 4월 6일 월요일
[MFC] CTimeSpan 날짜 비교
CTime time (2015,2,2,3,2,1)
CTime time2 (2015,4,2,4,2,1)
CSpanTime timedif = time - time2;
초 단위로 timedif에 차이값이 저장된다.
주의점은 time 선언시 CTime time(2015,1,1) 처럼 Year,Month,Day까지만 적지 말자.
동작하지 않는다..
선언문을 확인해보니 H:M:S 까지 적지 않으면 제대로 동작하지 않는다.
[MFC] CTime과 String 변환 방법
유니코드 문자집합을 사용하는 경우로 한정합니다. (Visual Studio 2008 기준)
//=================================================================
// 1. CTime 에서 CString 으로 변환할 때
CString strDateTime;
CTime tiTime(2008, 11, 12, 14, 54, 0); // 2008년 11월 12일 오후2시 54분 0초
strDateTime = tiTime.Format(_T("%04Y-%02m-%02d %02H:%02M:%02S"));
//=================================================================
// 2. CString에서 CTime 으로 변환할 때
CString strDateTime = _T("2008-11-12 14:54:00");
int nYear = _wtoi(strDateTime.Left(4));
int nMon = _wtoi(strDateTime.Mid(5,2);
int nDay = _wtoi(strDateTime.Mid(8,2);
int nHour = _wtoi(strDateTime.Mid(11,2);
int nMin = _wtoi(strDateTime.Mid(14,2);
int nSec = _wtoi(strDateTime.Mid(17,2);
CTime tiTime(nYear, nMon, nDay, nHour, nMin, nSec);
//=================================================================
// 3. 활용 사례
// 1) SQL DB 에 넣고 뺄 때
// 2) Console Log View/Save
이상 허접한 팁이었습니다.
출처: http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8191&page=21
2015년 4월 1일 수요일
[MFC] 한글 깨짐 현상 해결
트랙백 주소 : http://www.tipssoft.com/bulletin/tb.php/QnA/255
(VC++ 6.0 )
Insert Resource에서 Dialog - IDD_DIALOGBAR [English (U.S.)] 해서 다이얼로그 박스를 만든 후
실행해 보면 다이얼로그 박스에 있는 한글이 다 깨집니다. 다이얼로그 박스 폰트를 굴림 등으로 해도 마찬가지고요.
Insert Resource에서 Dialog 밑에 있는 것들을 보면 뒤에 다 English (U.S.)]이 붙어 있는데 한글판은 따로 있는 것인지?
한글을 제대로 나오게 하려면 어떻게 해야 하나요?
관리자 08-07-02 19:51
Date : 05-07-25 18:20
질문을 읽어보니 현재 님은 리소스의 언어설정이 영문으로 되어 있습니다.
이럴 경우 한글을 사용한다 하더라고 깨지는 현상이 발생됩니다.
먼저 리소스뷰에서 변경하고자 하는 리소스를 선택하신 후 오른쪽마우스 버튼을 눌러 나오는 팝업에서
Properties 를 선택, Language 부분의 내용을 Englis(U.S) 에서 Korean 으로 바꾸어 주시면 됩니다.
모든 변경 작업을 완료하신 후 ReBuild All 을 한번 실행해서 변경된 결과가 잘 나오는지 확인 해보세요
그럼 더운 날씨에 건강 유의하시고, 언제든지 문의 주세요.........
출처: http://www.tipssoft.com/bulletin/board.php?bo_table=QnA&wr_id=255
2015년 3월 19일 목요일
[MFC] MessageBox
Message Box 공부에 Vㅔ리 굳한 사이트 소개
nt MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
- 조그만 별도의 윈도우를 열어서 사용자에게 정보를 전달하거나 질문을 하는 장치
- 인수설명
hWnd : 부모 윈도우의 핸들을 입력한다. 부모가 없을 경우 NULL로 입력
lpText : 출력할 메시지의 내용을 입력한다. 모든 포맷의 문자열을 입력할 수 있다.
lpCaption : 메세지박스의 타이틀에 나타날 문자열을 입력한다. 기본값은 Error 이다.
uType : 메시지박스의 버튼,아이콘,동작방식을 결정한다. 여러 플래그를 | 로 조합사용한다.
|
인수 : uType (버튼의 종류
선택)
| |
|
플래그
|
설 명
|
|
MB_ABORTRETRYIGNORE
|
Abort, Retry, Ignore 세 개의
버튼 표시
|
|
MB_OK
|
Ok 버튼
표시
|
|
MB_OKCANCEL
|
Ok, Cancel 두 개의 버튼
표시
|
|
MB_RETRYCANCEL
|
Retry, Cancel 두 개의 버튼
표시
|
|
MB_YESNO
|
Yes, No, 두 개의 버튼
표시
|
|
MB_YESNOCANCEL
|
Yes, No, Cancel 세 개의 버튼
표시
|
|
인수 : uType (버튼의 아이콘
선택)
| |
|
플래그
|
설 명
|
|
MB_ICONEXCLAMATION, MB_ICONWARNING
|
|
|
MB_ICONINFORMATION, MB_ICONASTERISK
|
|
|
MB_ICONQUESTION
|
|
|
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND
|
|
|
인수 : uType (디폴트 버튼
지정)
| |
|
플래그
|
설 명
|
|
MB_DEFBUTTON1
|
첫번째 버튼이 디폴트 버튼이 된다.
(기본값)
|
|
MB_DEFBUTTON2
|
두번째 버튼이 디폴트 버튼이
된다.
|
|
MB_DEFBUTTON3
|
세두번째 버튼이 디폴트 버튼이
된다.
|
|
MB_DEFBUTTON4
|
네번째 버튼이 디폴트 버튼이
된다.
|
|
인수 : uType (모달 여부
선택)
| |
|
플래그
|
설 명
|
|
MB_APPMODAL
|
hWnd 윈도우의 모달 대화상자로 열리므로 메시지
박스를 닫기 전에는 같은 스레드에 속한 다른 윈도우로 전환할 수 없다. 그러나 다른 스레드의 윈도우로 전환할 수는 있으며 팝업 윈도우로도 전환할
수 있다. 아무 플래그도 지정되지 않으면 이 모드가 디폴트로 적용됨.
|
|
MB_SYSTEMMODAL
|
MB_APPMODAL과 동일하되 항상 위 스타일을
가져 모든 윈도우보다 위에 배치된다. 메모리 부족 등의 긴급한 상황을 알리고자 할 때 이 플래그를 사용.
|
|
MB_TASKMODAL
|
MS_APPMODAL과 동일하되 hWnd가
NULL일 경우 현재 스레드에 속한 모든 최상위 윈도우가 사용 금지된다는 점이 다르다. DLL이나 라이브러리에서 부모 윈도우로 지정할만한
윈도우가 없을 때 이 플래그를 사용한다.
|
|
인수 : uType (기타 옵션
선택)
| |
|
플래그
|
설 명
|
|
MB_DEFAULT_DESKTOP_ONLY
|
사용자가 로그온안 후 응용 프로그램이 실행되고 있는 디폴트 데스크
탑인 경우만 메시지 박스가 나타나도록 한다.
|
|
MB_HELP
|
도움말 버튼을 보여준다. 이 버튼을 누르거나 F1키를 누르면 Help
이벤트가 발생한다.
|
|
MB_RIGHT
|
메시지를 오른쪽으로 정렬한다.
|
|
MB_RTLREADING
|
아랍이나 헤브루 윈도우즈에서 오른쪽에서 왼쪽 읽기로 출력한다. 한글
윈도우즈에서는 의미가 없다.
|
|
MB_SETFOREGROUND
|
메시지 박스를 포그라운드 윈도우로 만든다. 시스템은 내부적으로
SetForegroundWindow 함수를 호출한다.
|
|
MB_TOPMOST
|
항상 위 옵션으로 메시지 박스를
생성한다.
|
|
MB_SERVICE_NOTIFICATION
|
NT의 서비스 프로그램만 사용할 수 있는
플래그이다. 현재 로긴한 사용자가 없더라도 액티브되어 있는 데스크 탑에 메시지 박스를 출력한다. 이 경우 hWnd는 반드시 NULL이어야
한다.
|
|
MB_SERVICE_NOTIFICATION_NT3X
|
MB_SERVICE_NOTIFICATION와
동일하되 NT 3.51버전에서 사용한다.
|
- 리턴값 : 메시지 박스를 생성할 메모리가 부족할 경우 0을 리턴한다. 그 외의 경우 사용자가
누른 버튼의 ID를 리턴한다.
값
|
버 튼
|
IDABORT
|
Abort 버튼을 누를 경우
|
IDCANCEL
|
Cancel 버튼을 누를 경우 Esc키를 눌러 대화상자를 닫을 때도 이 값이 리턴된다.
|
IDIGNORE
|
Ignore 버튼을 누를 경우
|
IDNO
|
No 버튼을 누를 경우
|
IDOK
|
Ok 버튼을 누를 경우
|
IDRETRY
|
Retry 버튼을 누를 경우
|
IDYES
|
Yes 버튼을 누를 경우
|
출처: http://devlog.cafe24.com/xe/index.php?mid=board_oHhP60&search_target=tag&search_keyword=MessageBox&document_srl=288
2015년 3월 4일 수요일
Unresolved External Symbol CWinApp::writeProfileStringAd
위와 같은 말도 안되는 에러가 발생하였다.
google에 검색을 해봐도 WriteProfileStringAd란 함수는 존재 조차 하지 않는다.
그런 이상한 에러가 발생하여 반나절을 고생한 끝에 ...
오타임을 발견하였다.
위와 같은 어의없는 실수가 발생한 원인은 바로
Function명에서 마우스 우클릭 Go to Definiton Of WriteProfileString 으로
점프해서 들어가서 나도 모르게 오타 d 를 추가 해버린것이다.
기본적으로 제공하는 함수에는 Definition 점프하지 않도록 주의해야 겠다..
google에 검색을 해봐도 WriteProfileStringAd란 함수는 존재 조차 하지 않는다.
그런 이상한 에러가 발생하여 반나절을 고생한 끝에 ...
오타임을 발견하였다.
위와 같은 어의없는 실수가 발생한 원인은 바로
Function명에서 마우스 우클릭 Go to Definiton Of WriteProfileString 으로
점프해서 들어가서 나도 모르게 오타 d 를 추가 해버린것이다.
기본적으로 제공하는 함수에는 Definition 점프하지 않도록 주의해야 겠다..
2015년 2월 6일 금요일
[MFC] ListCtrl Header Column 개수 얻기
CListCtrl &ctrlList = GetListCtrl();/*< 동적 리스트 컨트롤 핸들 */
CHeaderCtrl *pHeaderCtrl; /*< 리스트 컨트롤 헤더 인스턴스의 포인터 */
pHeaderCtrl = ctrlList.GetHeaderCtrl();
nCount = pHeaderCtrl->GetItemCount();
if (-1 == nCount)
{
AfxMessageBox(_T("Header Column not exist"));
return;
}
출처: http://six605.tistory.com/194
Vㅔ리 굳
CHeaderCtrl *pHeaderCtrl; /*< 리스트 컨트롤 헤더 인스턴스의 포인터 */
pHeaderCtrl = ctrlList.GetHeaderCtrl();
nCount = pHeaderCtrl->GetItemCount();
if (-1 == nCount)
{
AfxMessageBox(_T("Header Column not exist"));
return;
}
출처: http://six605.tistory.com/194
Vㅔ리 굳
[MFC] 리스트 컨트롤 컬럼 헤더 텍스트 얻기
How to find the text column header of a CListCtrl in MFC
CString GetColumnName( CListCtrl * list, int nCol )
{
CString strNome;
CHeaderCtrl* pHdr = list->GetHeaderCtrl();
if ( pHdr )
if ( nCol < pHdr->GetItemCount() )
{
HDITEM hdi;
hdi.mask = HDI_TEXT;
hdi.pszText = strNome.GetBuffer( 256 );
hdi.cchTextMax = 256;
pHdr->GetItem( nCol, &hdi );
strNome.ReleaseBuffer();
}
return strNome;
}출처: http://surpassing.tistory.com/403
2014년 11월 21일 금요일
[MFC] Listctrl Item 간 위치 변경
첨부화일을 참고하세요.......
void MoveTo(CListCtrl* pList, int index1, int index2) // index1 < index2 이고..
{ // index1의 item을 index2+1로 이동후 index1의 item은 지움..
if(index1==index2) return;
int idx1 = index1;
int idx2 = index2;
if(index1 > index2)
{
idx1 = index2;
idx2 = index1;
}
int nCount = pList->GetHeaderCtrl()->GetItemCount();
CString str;
str = pList->GetItemText(idx1,0);
pList->InsertItem(idx2+1, str);
for(int k=1; kGetItemText(idx1,k);
pList->SetItemText(idx2+1, k,str);
}
pList->DeleteItem(idx1);
}
void CABC11Dlg::OnButtonMoveup()
{
// TODO: Add your control notification handler code here
CListCtrl *pList = &m_list; /////////////
POSITION pos = pList->GetFirstSelectedItemPosition();
if(pos == NULL) return;
int PreIndex=-1;
int Index;
while(pos)
{
Index = pList->GetNextSelectedItem(pos);
if( PreIndex+1 != Index)
{
MoveTo(pList, Index, Index-1);
pList->SetItemState(Index-1, LVIS_SELECTED, LVIS_SELECTED);
PreIndex = Index-1;
}
else
PreIndex = Index;
}
}
void CABC11Dlg::OnButtonMovedown()
{
// TODO: Add your control notification handler code here
CListCtrl *pList = &m_list; ////////
POSITION pos = pList->GetFirstSelectedItemPosition();
if(pos == NULL) return;
vector IndexData;
while(pos)
{
int Index = pList->GetNextSelectedItem(pos);
IndexData.push_back(Index);
}
int size = IndexData.size()-1;
int PreIndex=pList->GetItemCount();
int Index;
for( ;0<=size ; --size)
{
Index = IndexData[size];
if(Index+1 != PreIndex)
{
MoveTo(pList, Index, Index+1);
pList->SetItemState(Index+1, LVIS_SELECTED, LVIS_SELECTED);
PreIndex = Index+1;
}
else
PreIndex = Index;
}
}
Vㅔ리 굳
출처: http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MaeulNo=20&no=874306&ref=874281
[MFC] listctrl SetItemStatus 를 이용한 다중 선택
결국 for문인가..
int i = 0;
for(i = 0; i<_lcDataReport.GetItemCount(); i++){
_lcDataReport.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
}
출처: http://adnoctum.tistory.com/176
[MFC] ListCtrl 기본 예제
List Control
List control은 아이콘, 작은 아이콘, 간단히, 보고서의 네 가지 형태로 데이터를 보여주는 컨트롤입니다. 이중 보고서 모드가 List control에 설정된 데이터를 가장 자세히 보여주는 모드입니다. 따라서 List control에 데이터를 설정할 때는 이 모드를 기준으로 하면 됩니다. 보고서 모드에는 하나의 아이템에 대해 가로줄로 여러 가지 데이터를 보여줄 수 있는데, 이러한 가루 줄을 각각 컬럼이라고 하고, 컬럼 맨 위에 각 컬럼의 제목을 표시하는 줄을 컬럼 헤더라고 합니다.
|구현하고자 하는 기능|
List control을 포함하는 대화상자를 만들어 보도록 합니다. 선택항목 삭제, 위로, 아래로 등을 이용해 위치를 바꾸고 삭제하는 프로그램을 만들어 보겠습니다.
|App Wizard|
스켈레톤 코드를 생성한다.
프로젝트 생성
다이얼로그 형식의 프로젝트를 생성합니다.
Project type
Project name
MFC AppWizard (exe)
ListControl
Step. 1
Dialog based
|App Setup|
사용자 인터페이스 요소들을 시작적으로 디자인한다.
대화상자 리소스 디자인
위와 같이 대화상자에 List control을 올려놓고, List control의 속성을 설정합니다. List control의 속성을 아래에 정리 해 놓았습니다.
속성 정리
속성
의미
View
Icon, Small Icon, List, Report 중 하나를 선택할 수 있습니다.
Allign
Left, Right 중 하나를 선택할 수 있으며, 아이콘 정렬의 기준을 설정합니다.
Sort
None, Ascending, Descending 중 하나를 선택할 수 있으며, 정렬 방법을 설정합니다.
Single selection
오직 하나의 항목만 선택할 수 있도록 합니다.
Auto arrange
Icon 또는 Small Icon에서 아이콘들을 자동으로 정렬되도록 합니다.
No label wrap
아이콘과 함께 쓰이는 텍스트가 한 줄로 쓰여지도록 합니다.
Edit labels
텍스트를 편집할 수 있게 합니다. 이 스타일을 선택하면 텍스트 편집이 끝나면 LVN_ENDLABELEDIT 이벤트가 발생합니다.
No column header
Report에서 컬럼 헤더를 표시하지 않도록 합니다.
No sort header
컬럼 헤더가 표시되더라도 동작하지 않도록 합니다. 보통 컬럼 헤더는 정렬 모드를 바꾸기 위해 사용됩니다.
속성 설정
컨트롤
ID
Caption
기타
List control
IDC_LIST1
[View] 속성 [Report]
Push Button1
IDC_BUTTON_UP
위로
Push Button2
IDC_BUTTON_DOWN
아래로
Push Button3
IDC_BUTTON_DELETE
삭제
Push Button4
IDC_BUTTON_PRINT
출력
탭 순서 설정
순서가 중요한 프로그램이 아니어서 순서 지정 없이 진행합니다.
|Class Wizard|
AppStudio에서 시각적으로 디자인된 요소들을 실제 프로그램 코드와 연결 시킨다. 새로운 클래스를 정의한다. 각 컨트롤들의 메시지 핸들러를 재 정의한다.
컨트롤과 멤버 변수 연결
Class Wizard 의 Member Variables 에서 연결 시킨다.
Control
Type
Member
List control
Control
CListCtrl m_ctrlList
CListCtrl의 주요 멤버 함수
List control에 컬럼 및 아이템을 추가 삭제등 한다.
멤버 함수
기능
InsertItem
새로운 항목을 추가 합니다.
DeleteItem
지정된 항목을 삭제 합니다.
DeleteAllitems
모든 항목들을 삭제 합니다.
GetItemCount
항목의 개수를 얻습니다.
SetItem
GetItem
각각의 아이템의 정보를 설정합니다.
각각의 아이템의 정보를 얻습니다.
SetItemText
GetItemText
각각의 아이템의 텍스트를 설정합니다.
각각의 아이템의 텍스트를 얻습니다.
InsertColumn
새로운 컬럼을 추가 합니다.
DeleteColumn
지정된 컬럼을 삭제 합니다.
SetImageList
GetImageList
각각의 아이콘으로 사용될 이미지 리스트를 설정합니다.
각각의 아이콘으로 사용될 이미지 리스트를 얻습니다.
List Control이 발생시키는 이벤트
List control이 발생시키는 주요 이벤트
이벤트
발생 시기
LVN_COLUMNCLICK
컬럼 헤더가 클릭 되었을 때
LVN_DELETEITEM
항목이 삭제 되었을 때
LVN_DELETEALLITEMS
모든 항목이 삭제 되었을 때
LVN_INSERTITEM
새로운 항목이 추가 되었을 때
LVN_ITEMCHANGED
선택된 항목이 다른 항목으로 변경 되었을 때
LVN_KEYDOWN
키보드가 눌렸을 때
메시지 핸들러 재 정의
각각의 버튼들의 메시지 핸들러를 재 정의 합니다.
void CListControlDlg::OnButtonUp()
{
}
void CListControlDlg::OnButtonDown()
{
}
void CListControlDlg::OnButtonDelete()
{
}
void CListControlDlg::OnButtonPrint()
{
}
|코딩|
컨트롤 초기화
//컬럼을 생성합니다.
BOOL CListControlDlg::OnInitDialog()
{
CRect rect;
m_ctrlList.GetClientRect(&rect);
m_ctrlList.InsertColumn(0, _T("이름"), LVCFMT_LEFT, 100);
m_ctrlList.InsertColumn(1, _T("나이"), LVCFMT_RIGHT, 100);
m_ctrlList.InsertColumn(2, _T("성별"), LVCFMT_CENTER, 100);
m_ctrlList.InsertColumn(3, _T("전화"), LVCFMT_LEFT, rect.Width()-220);
return TRUE; // return TRUE unless you set the focus to a control
}
아이템 추가
//각 컬럼에 아이템을 추가한다.
BOOL CListControlDlg::OnInitDialog()
{
CString str;
for(int i=0; i<7; i++)
{
m_ctrlList.InsertItem(i, strName[i], rand()%5);
str.Format("%d",rand()%100);
m_ctrlList.SetItemText(i, 1, str);
if(rand()%2 == 0) str="남자";
else str = "여자";
m_ctrlList.SetItemText(i,2,str);
str.Format("%03d - %04d", rand()%1000, rand()%10000);
m_ctrlList.SetItemText(i,3,str);
}
return TRUE;
}
선택 항목 위로
//아이템을 선택하고 위로 버튼을 눌렀을 때를 처리한다.
void CListControlDlg::OnButtonUp()
{
POSITION pos;
while(pos = m_ctrlList.GetFirstSelectedItemPosition())
{
int nSelItem = m_ctrlList.GetNextSelectedItem(pos);
CString strTemp;
strTemp = m_ctrlList.GetItemText(nSelItem-1, 0);
if(!strTemp.IsEmpty())
{
CString strName, strAge, strSex, strTel;
strName = m_ctrlList.GetItemText(nSelItem,0);
strAge = m_ctrlList.GetItemText(nSelItem,1);
strSex = m_ctrlList.GetItemText(nSelItem,2);
strTel = m_ctrlList.GetItemText(nSelItem,3);
m_ctrlList.DeleteItem(nSelItem);
m_ctrlList.InsertItem(nSelItem-1, strName, 0);
m_ctrlList.SetItemText(nSelItem-1, 1, strAge);
m_ctrlList.SetItemText(nSelItem-1, 2, strSex);
m_ctrlList.SetItemText(nSelItem-1, 3, strTel);
}
else
break;
}
}
선택 항목 아래로
//아이템을 선택하고 아래로 버튼을 눌렀을 때를 처리한다.
void CListControlDlg::OnButtonDown()
{
POSITION pos;
while(pos = m_ctrlList.GetFirstSelectedItemPosition())
{
int nSelItem = m_ctrlList.GetNextSelectedItem(pos);
CString strTemp;
strTemp = m_ctrlList.GetItemText(nSelItem+1, 0);
if(!strTemp.IsEmpty())
{
CString strName, strAge, strSex, strTel;
strName = m_ctrlList.GetItemText(nSelItem,0);
strAge = m_ctrlList.GetItemText(nSelItem,1);
strSex = m_ctrlList.GetItemText(nSelItem,2);
strTel = m_ctrlList.GetItemText(nSelItem,3);
m_ctrlList.DeleteItem(nSelItem);
m_ctrlList.InsertItem(nSelItem+1, strName, 0);
m_ctrlList.SetItemText(nSelItem+1, 1, strAge);
m_ctrlList.SetItemText(nSelItem+1, 2, strSex);
m_ctrlList.SetItemText(nSelItem+1, 3, strTel);
}
else
break;
}
}
선택 항목 삭제
//아이템을 선택하고 삭제 버튼을 눌렀을 때를 처리한다.
// 다중선택시
void GetIndex()
{
int nItemCount = m_ctrlList.GetSelectedCount();
POSITION pos = m_ctrlList.GetFirstSelectedItemPosition();
for (int i = 0; i < nItemCount; i++)
{
int nIndex = m_ctrlList.GetNextSelectedItem(pos);
}
}
// 단일 선택
int GetIndex()
{
int nSelectedItem = m_ctrlList.GetNextItem( -1, LVNI_SELECTED );
CString strKey = m_ctrlList.GetItemText(nSelectedItem, 0);
if ( strKey == "")
{
return -1;
}
return nSeletedItem;
}
// 다중 선택한거 골라서 삭제
int nItem;
POSITION pos;
pos = m_ctrlList.GetFirstSelectedItemPosition();
while (pos != NULL)
{
nItem = m_ctrlList.GetNextSelectedItem(pos);
m_ctrlList.DeleteItem(nItem);
pos = m_ctrlList.GetFirstSelectedItemPosition();
}
항목 삭제
//출력 버튼을 눌렀을 때를 처리한다.
void CListControlDlg::OnButtonPrint()
{
int nSelItem = 0;
CString strPrint, strTemp;
while(1)
{
strTemp = m_ctrlList.GetItemText(nSelItem,0);
if(strTemp.IsEmpty()) break;
strTemp += " ";
strTemp += m_ctrlList.GetItemText(nSelItem,1);
strTemp += " ";
strTemp += m_ctrlList.GetItemText(nSelItem,2);
strTemp += " ";
strTemp += m_ctrlList.GetItemText(nSelItem,3);
strTemp += "\n";
strPrint += strTemp;
nSelItem ++;
}
AfxMessageBox(strPrint);
}
문자열 이용삭제
일반적으로 리스트 컨트롤에서 아이템을 지우려면 DeleteItem 이라는 함수를
사용합니다.하지만 이 함수가 지우고자하는 아이템의 인덱스를 요구하기 때문에
님이 사용하고자 하는 직접적인 형태는 아닌것 같네요.. 따라서 아이템 스트링을
가지고 삭제하고 싶다면 FindItem이라는 함수를 사용해서 먼저 해당 아이템의
인덱스를 얻은 후, DeleteItem을 사용하면 될것 같습니다. 해당 코드를 함수로
구성해 보면 다음과 같습니다...
void 해당클래스::DeleteItemWithString(const char *parm_name)
{
LVFINDINFO find_item;
find_item.flags = LVFI_STRING;
find_item.psz = parm_name;
int index = 리스트컨트롤.FindItem(&find_item);
if(-1 != index) 리스트컨트롤.DeleteItem(index);
}
이렇게 하면 리스트 컨트롤에서 지우고자 하는 아이템의 이름이 "홍길동"
이라면 다음과 같이 호출하면 됩니다.
DeleteItemWithString("홍길동");
체크 선택, 해제
m_ctrlList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES );
//출력 버튼을 눌렀을 때를 처리한다.
void CListControlDlg::Secheck(BOOL _bisCheck)
{
int nCntlist = m_ctrlList.GetIemcount();
for(int i = 0; i < nCntlist; i++)
{
m_ctrlList.SetCheck(i, _bisCheck);
}
}
아이템 선택
// 1개 이상 선택 및 확인
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
{
AfxMessageBox(_T("No items were selected!\n"));
}
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
CString temp = m_list.GetItemText(nItem,0);
}
}
temp.Format(_T("%s seq가 선택됨"),temp);
AfxMessageBox(temp);
아이템 선택리스트 컨트롤 사용시 원하는 라인에 포커스 설정 및 라인 이동
Ex)
CListCtrl m_list;
m_list.SetItemState( -1, 0, LVIS_SELECTED|LVIS_FOCUSED );
m_list.SetItemState(nRow, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
m_list.EnsureVisible(nRow, FALSE);
m_list.SetFocus();
// 깜박임 없이 마지막 라인으로 자동 스트롤 된다.
m_list.SendMessage(WM_VSCROLL,SB_BOTTOM,NULL);
설명)
SetItemState(옵션1, 옵션2, 옵션3)
옵션1 : 선택라인
옵션2 : 선택한 상태로 리스트를 출력(옵션3에서 나열된 옵션에서만 선택 가능)
옵션3 : 옵션2에서 선택할수 있는 옵션 나열
// 해당 라인으로 스크롤 이동
EnsureVisible
// 해당 라인으로 포커스 설정
SetFocus
선택은 - SetItemState( nCount, LVIS_SELECTED, LVIS_SELECTED );
비선택은 - SetItemState( nCount, 0, LVIS_SELECTED );
LVIS_SELECTED 는 선택
LVIS_FOCUSED 는 포커스.. - 키보드 로 이동한다거 할때 이넘을 기준으로 움직이는거임..
ps.
마우스로 클릭할경우에는 컨트롤키를 누르지 않은 이상 하나만 선택되고, 포커스가 맞춰지는데 위의 코드로 선택만 설정해주게 되면 기존에 선택된 아이템이 있을경우 추가로 선택이 되기때문에 기존에 선택된것들은 지우든지 한다.
물론 LVS_SINGLESEL 스타일이 적용되어있다면 관계없다.
쵝오로 잘 정리되어 있음
출처: http://izen8.tistory.com/696
[MFC] ListCtrl Row 순서 변경
최초 시도 시에는 InsertItem으로 넣은 후에 기존 Row를 삭제하는 방법을 선택
2,3번 변경시 3번을 2번 위치로 변경
index1 = 2;
CString str = listctrl.GetItemText(index1,0);
index2 = 3;
listctrl.InsertItem(index2+1, str);
listctrl.DeleteItem(index1);
하지만 위와 같이 동작할 때 이상하게 InsertItem의 위치가 틀어짐
그래서 다른 방법을 생각해 냄
일단 2번,3번 열의 데이터를 각각 저장
2번 열 데이터 저장 (CString str1)
3번 열 데이터 저장 (CString str2)
그리고 SetItemText로 데이터 변경
listctrl.SetItemText(index1,str2);
listctrl.SetItemText(index2,str1);
미션 컴플리트
2013년 6월 26일 수요일
[MFC] MySQL 함수 정리
CString query;
query.Format(" blur blur");
쿼리 실행
ado.ExecuteSQL(query, 0)
검색결과 개수
int count = ado.GetRecordCount();
컬럼 값 구하기
CString temp;
ado.GetFieldValue( column number, temp, _T(""));
다음 값 가져오기
ado.m_ptrRecordset->Moveext();
쿼리값 마지막 찾기
while(!ado.m_ptrRecordset->adoEOF)
{
다음 값 가져오기
ado.m_ptrRecordset->Moveext();
}
query.Format(" blur blur");
쿼리 실행
ado.ExecuteSQL(query, 0)
검색결과 개수
int count = ado.GetRecordCount();
컬럼 값 구하기
CString temp;
ado.GetFieldValue( column number, temp, _T(""));
다음 값 가져오기
ado.m_ptrRecordset->Moveext();
쿼리값 마지막 찾기
while(!ado.m_ptrRecordset->adoEOF)
{
다음 값 가져오기
ado.m_ptrRecordset->Moveext();
}
2013년 6월 22일 토요일
[MFC] 소멸자에 대해
소멸자를 클래스 헤더와 cpp구현파일에 만드시면 됩니다
*.h파일에서
class Test
{
public:
*.cpp파일에서...
Test::~Test()
{
출처: http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67426403&qb=bWZjIOyGjOupuOyekA==&enc=utf8§ion=kin&rank=2&search_sort=0&spq=0&pid=RNSRM35Y7vZsst0T%2BnZsssssstZ-126518&sid=UcVUNnJvLCkAAHZHGv8
*.h파일에서
class Test
{
public:
virtual ~Test(); // 가급적 virtual로 선언 하시길..};
*.cpp파일에서...
Test::~Test()
{
// delete 리소스}
출처: http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67426403&qb=bWZjIOyGjOupuOyekA==&enc=utf8§ion=kin&rank=2&search_sort=0&spq=0&pid=RNSRM35Y7vZsst0T%2BnZsssssstZ-126518&sid=UcVUNnJvLCkAAHZHGv8
[MFC] unresolved external symbol "public: __thiscall
이 에러.. 정말 어렵다. ㅠㅠ
아아아아
해결방법이 더 쉬워서 멘붕......
프로젝트 빌드를 하다보면 특히
svn을 사용해서 하다 보면,
있던 파일이 빠져 버리기도 한다.
새로 추가 된 파일을 Add 하지 않은 상태로
새로 Commit을 할 경우 빠져 버리는 것이다.
이런 경우에
Add files to Projet를 이용해서
해당 Files 를 추가하면 에러가 사라진다....
참조 : http://messier2000.blog.me/90007238675
감사합니다.
아아아아
해결방법이 더 쉬워서 멘붕......
프로젝트 빌드를 하다보면 특히
svn을 사용해서 하다 보면,
있던 파일이 빠져 버리기도 한다.
새로 추가 된 파일을 Add 하지 않은 상태로
새로 Commit을 할 경우 빠져 버리는 것이다.
이런 경우에
Add files to Projet를 이용해서
해당 Files 를 추가하면 에러가 사라진다....
참조 : http://messier2000.blog.me/90007238675
감사합니다.
2013년 6월 10일 월요일
[MFC] ComboBox
CCombobox m_combo_box;
dropdown의 edit 창의 메세지 얻기
m_combo_box.GetWindowText();
combobox의 item 모두 지우기
m_combo_box.ResetContent();
선택한 라인의 String 가져오기
CString current;
m_combo_box.GetLBText( m_combo_box.GetCurSel(), current);
dropdown의 edit 창의 메세지 얻기
m_combo_box.GetWindowText();
combobox의 item 모두 지우기
m_combo_box.ResetContent();
선택한 라인의 String 가져오기
CString current;
m_combo_box.GetLBText( m_combo_box.GetCurSel(), current);
2013년 6월 5일 수요일
2013년 6월 3일 월요일
[MFC] dropdown ombobox의 edit 영역 가져 오기
[MFC]메모 - 리스트 박스 콤보 박스
HINE.egloos.com/1178336
리스트 박스에서 코드로 내용 입력 하기
- CListBox 객체를 만들고, 객체의 멤버 함수 InsertString, AddStrign 등으로 추가한다.
에디트 컨트롤의 내용을 리스트 박스로 입력하기
- 에디트 컨트롤에 입력된 문자열을 CListBox 객체의 멤버함수의 인자로 보낸다.
- 콤보 박스에 입력할때도 같은 방식으로 할 수 있다.
- GetCurSel 함수로 선택된 인덱스를 검색하고, GetText 함수로 원하는 문자열 변수로 저장시켜 준다.
-FindString() 함수를 이용한다.
콤보 박스의 Drop List 타입은 콤보 박스 내의 입력이 불가능하게 만들고
Drop Down은 에디트 컨트롤 처럼 입력이 가능하도록 해준다.
DropDown 형식의 콤보박스에서 쓰여진 텍스트를 콤보박스내에 입력하려면
DropDown형식의 콤보박스의 스트링 객체를 추가한 후에 리스트 박스에
문자열을 추가하듯이 하면 된다.
스트링 객체를 추가 하지 않고, GetWindowText 함수를 이용하면 좀더 쉽게 문자열 추가가 가능해진다
리스트박스, 콤보 박스의 삽입 추가는 해당 객체의 멤버 함수를 잘 이용하여야 한다.
출처 : http://valley.egloos.com/viewer/?url=http://hine.egloos.com/1178336
- CListBox 객체를 만들고, 객체의 멤버 함수 InsertString, AddStrign 등으로 추가한다.
에디트 컨트롤의 내용을 리스트 박스로 입력하기
- 에디트 컨트롤에 입력된 문자열을 CListBox 객체의 멤버함수의 인자로 보낸다.
- 콤보 박스에 입력할때도 같은 방식으로 할 수 있다.
사용예제)선택된 리스트 박스의 내용을 다른 곳으로 저장하기
void CListComboView::OnButtonEditToListAdd()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_clList.InsertString( m_clList.GetCount(), m_csListAddStr);
}
- GetCurSel 함수로 선택된 인덱스를 검색하고, GetText 함수로 원하는 문자열 변수로 저장시켜 준다.
사용예제)리스트 박스의 원하는 문자열을 검색
void CListComboView::OnSelchangeList()
{
// TODO: Add your control notification handler code here
int index = m_clList.GetCurSel();
m_clList.GetText(index, m_clkSelected);
UpdateData(FALSE);
}
-FindString() 함수를 이용한다.
콤보 박스의 Drop List 타입은 콤보 박스 내의 입력이 불가능하게 만들고
Drop Down은 에디트 컨트롤 처럼 입력이 가능하도록 해준다.
DropDown 형식의 콤보박스에서 쓰여진 텍스트를 콤보박스내에 입력하려면
DropDown형식의 콤보박스의 스트링 객체를 추가한 후에 리스트 박스에
문자열을 추가하듯이 하면 된다.
스트링 객체를 추가 하지 않고, GetWindowText 함수를 이용하면 좀더 쉽게 문자열 추가가 가능해진다
리스트박스, 콤보 박스의 삽입 추가는 해당 객체의 멤버 함수를 잘 이용하여야 한다.
출처 : http://valley.egloos.com/viewer/?url=http://hine.egloos.com/1178336
[MFC] DWORD -> CString
CString cstrTemp;
cstrTemp.Format(L"%lu", (ULONG)dword);
안되면
DWORD dwnumber = 1234;
CString csNumber;
csNumber.Format("%lu", dwNumber);
cstrTemp.Format(L"%lu", (ULONG)dword);
안되면
DWORD dwnumber = 1234;
CString csNumber;
csNumber.Format("%lu", dwNumber);
피드 구독하기:
글 (Atom)