API:MFC

구차니의 잡동사니 위키
이동: 둘러보기, 찾기

목차

MFC

에디트 컨트롤(CEdit)

  • GetWindowTextW() 에디트 내의 문자열을 받아옴
  • SetWindowText() / SetWindowTextW() 내용 전부 바꿈
  • SetSel() + ReplaceSel() 에디트 박스의 내용을 선택하고 내용을 치환함(가장 끝을 선택하면 내용 덧붙이기로 응용 가능)
  • EnableWindow() 해당 컨트롤의 활성화 상태를 변경
  • multiline
    • 다이얼로그 편집에서 멀티라인을 켜주어야 \n으로 개행이 적용됨


버튼 컨트롤(Cbutton)

버튼

라디오

  • 라디오 버튼은 순서대로, 그룹의 처음에 변수를 연결하여 사용함
  • GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO2) 는 IDC_RADIO1과 IDC_RADIO2 중에 선택된 인덱스 값을 돌려줌
  • ((CButton*)GetDlgItem(IDC_RADIO2))->SetCheck(true) 식으로 특정 다이얼로그 아이템을 선택하여 체크할 수 있음


슬라이드 컨트롤(CSliderCtrl)

  • Auto Ticks - 일정 간격으로 마크를 표시하도록 함
    • SetTicFreq() 으로 간격을 지정함
  • Tick Marks - 슬라이더에 마크를 표시하도록 함
    • SetTic() 으로 특정 위치에 마크를 표시함
  • SetTicFreq()와 SetTic()을 동시에 사용할 수 없음
  • SetRange() 으로 슬라이더의 범위를 설정
  • SetPos() 슬라이더를 특정 위치로 지정 함


콤보박스 컨트롤(CComboBox)

  • 드랍다운 박스를 만듬
  • SetCurSel() 로 원하는 순서를 선택함
  • AddString() 으로 문자열을 추가함
    • 다이얼로그 편집에서 Sort는 True가 기본 값이므로 입력한 순서대로 출력하기 위해서는 False로 바꾸어 주어야 함
  • ResetContent() 로 콤보박스의 내용을 한번에 전체 삭제 할 수 있음

다이얼로그

파일 다이얼로그

CString filter = _T("*.*||");
CFileDialog fd(TRUE, NULL, NULL, 0, filter, this);

if(fd.DoModal() == IDOK)
{
	fd.GetPathName();
}

mouse button down 이벤트 처리

BOOL CtestDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	CRect rect;
	if(pMsg->message == WM_LBUTTONDOWN) 
	{
		CButton *pButton;
		pButton = (CButton *)GetDlgItem(IDC_BUTTON1);
		pButton->GetWindowRect(rect);
		if(rect.PtInRect(pMsg->pt))
		{
			// 여기 할 거
		}
	}
}

ESC 종료 막기

BOOL CtestDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) return TRUE;
}

ALT키 조합 입력 받기

BOOL CtestDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	if(pMsg->message == WM_SYSKEYDOWN) // ALT + 방향키
	{
		switch(pMsg->wParam)
		{
		case VK_LEFT:
			break;
		case VK_RIGHT:
			break;
		case VK_UP:
			break;
		case VK_DOWN:
			break;
		case VK_RETURN:
			break;
		}
	}
}

UpdateData()

  • 컨트롤 변수의 값을 갱신한다는 의미
    • TRUE는 UI로 부터 변수에 값을 불러올 때 사용
    • FALSE는 변수의 값을 UI에 적용할 때 사용

문자열(CString / CStringA)

  • 유니코드 사용시 CString
  • 1바이트 문자열은 CStringA로 사용가능
  • LPCSTR과의 변환
  • signed / unsigned 유의

Win32 API

시리얼

시리얼 열기

  • \\.\COM10 이런식으로 사용해야 10번 이후의 포트를 열 수 있음
  • _T("\\\\.\\COM10")

시리얼 포트 목록 얻기

void CtestDlg::getComList(void)
{
	TCHAR lpTargetPath[5000]; // buffer to store the path of the COMPORTS
	DWORD test;
	bool gotPort=0; // in case the port is not found

	for(int i=0; i<255; i++) // checking ports from COM0 to COM255
	{
		CString str;
		str.Format(_T("%d"),i);
		CString ComName=CString("COM") + CString(str); // converting to COM0, COM1, COM2

		test = QueryDosDevice(ComName, (LPWSTR)lpTargetPath, 5000);

		// Test the return value and error if any
		if(test!=0) //QueryDosDevice returns zero if it didn't find an object
		{
			cout << ComName; // print usable com port
			gotPort=1; // found port
		}

		if(::GetLastError()==ERROR_INSUFFICIENT_BUFFER)
		{
			lpTargetPath[10000]; // in case the buffer got filled, increase size of the buffer.
			continue;
		}

	}
}


윈속(winsock)

HTTP 소켓

int CtestDlg::httpconn()
{
	CString host, port, query, id, pw;
	CString sURL;
	char content[2048];

	CInternetSession	*pSession = NULL;
	CHttpConnection		*pHttpConnect = NULL;
	CHttpFile			*pHttpFile = NULL;
	INTERNET_PORT		nPort;
	DWORD dwServiceType = 0;
	DWORD m_dwStatusCode = 0;
	LPCTSTR pszAppendHeader = NULL;
	CString strServerName, strObject, szHeaders, strCompleteString;

	id = _T("userid");
	id = _T("userpw");
	host = _T("localhost");
	port = _T("80");

	CString query_prefix(_T("/index.html"));
	sURL = CString("http://") + host + CString(":") + port + query;
	
	AfxParseURL(sURL, dwServiceType, strServerName, strObject, nPort);
	pSession = new CInternetSession;
	pHttpConnect = pSession->GetHttpConnection(strServerName,80,id,pw); 
	pHttpFile = pHttpConnect->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);
	pHttpFile->SendRequest();
	pHttpFile->QueryInfoStatusCode(m_dwStatusCode);
	pHttpFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, szHeaders);
	memset(content, 0x00, 2048);
	pHttpFile->Read(content, pHttpFile->GetLength());
	
	cout << content;

	if(pHttpFile)		{pHttpFile->Close();	delete pHttpFile;		pHttpFile = NULL;	}
	if(pHttpConnect)	{pHttpConnect->Close();	delete pHttpConnect;	pHttpConnect = NULL;	}
	if(pSession)		{pSession->Close();		delete pSession;		pSession = NULL;	}

	return 0;
}

외부 프로그램 실행

void CtestDlg::runExternal()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CString cmd;
	CString port(_T("\\\\.\\COM10"));
	CString baud(_T("115200"));
	CString execname(_T("downloader.exe"));
	CString filename;

	WCHAR pathstr[256];
	GetModuleFileNameW(NULL, pathstr, 256);
	PathRemoveFileSpec(pathstr);
	CString path(pathstr);

	cmd.AppendFormat(_T("\"%s\\%s\" %s %s \"%s\""),path, execname, port, baud, filename);
	m_ret.SetWindowTextW(cmd);

	WinExec((CStringA)cmd, SW_SHOW);
}

파일 다이얼로그

개인 도구
이름공간

변수
행위
둘러보기
도구모음