<

C#에서는 FILE 핸들러로 바로 확인이 가능한데 C++는 한줄에 쓰기 번거러워 따로 함수를 만들어서 사용한다.


유니코드가 아닌 프로젝트도 있어 분기처리 해준다.



bool isExistFile(CString _strFile)
{
#ifdef _UNICODE
	return(_waccess_s(_strFile, 0) != -1);
#else
	return (_access_s(_strFile, 0) != -1);
#endif
	
}


블로그 이미지

Lunik

이제 사회첫걸음 걷고 있는 개발자.

MFC에서 ComboBox(콤보박스) 사용시 사용자가 임의적으로 항목을 수정할 수 있다.


물론 수정된 값을 받는 경우도 있지만, 해당 선택된 항목의 index값을 가져와서 쓰는경우 매개변수가 잘못되었다는 등의 오류가 발생 할 수 있다.


사용자가 수정할 항목이 아닌 경우라면 이를 ReadOnly로 바꿔줄 필요가 있다.


ReadOnly 설정은 따로 코드를 수정하는 경우도 있지만, 간단하게 해당 리소스 속성항목에서 


Type를 "Drop List"로 바꿔주면 된다.


아래는 Reference에 나와있는 Style Type별 상태

StyleWhen is list box visibleStatic or edit control
SimpleAlwaysEdit
Drop-downWhen dropped downEdit
Drop-down listWhen dropped downStatic


블로그 이미지

Lunik

이제 사회첫걸음 걷고 있는 개발자.

Create로 생성한 모달리스 다이얼로그(dlgModal2)의 생성하고 show가 되었는지 확인하는 조건식


if( dlgModal2 != NULL && dlgModal2->IsWindowVisible() == TRUE )

보이고 숨길떄에는


dlgModal2.ShowWindow(SW_SHOW);
dlgModal2.ShowWindow(SW_HIDE);


이렇게 사용하면 되고


부모창 destory시 반드시 자식 모달리스도 delete해줘야한다.

블로그 이미지

Lunik

이제 사회첫걸음 걷고 있는 개발자.

사용한 버젼은 CGridCtrl v2.20 이며 생성된 그리드컨트롤에

체크박스를 생성할때 아래와 같이 추가하면된다.

m_gridBinTable.SetCellType(nRow, nCol, RUNTIME_CLASS(CGridCellCheck));	//
pCell = (CGridCellCheck*)m_gridBinTable.GetCell(nRow, nCol);


블로그 이미지

Lunik

이제 사회첫걸음 걷고 있는 개발자.

Tag c++, mfc

출처 : http://bigmark.tistory.com/7


1. 부모 다이얼로그 생성


2. 자식 다이얼로그 생성


- 자식 다이얼로그 속성창에서 style은 child, border는 NONE 으로 설정 변경


3. 부모 다이얼로그의 헤더파일에서 해당 자식 다이얼로그 변수 포인터로 생성


CChildDlg *m_pChildDlg;



4. 부모 다이얼로그의 OnInitDialog에서



m_pChildDlg = new CChildDlg;
m_pChildDlg->Create( CChildDlg::IDD, this );
m_pChildDlg->ShowWindow( SW_SHOW );
m_pChildDlg->MoveWindow( rcDlg ); // 크기는 알아서 맞게 지정


이렇게 하면 자식 다이얼로그가 부모 다이얼로그에 붙는다.

블로그 이미지

Lunik

이제 사회첫걸음 걷고 있는 개발자.

MFC 로 시리얼 통신하는 코드의 일부이다. 

이번에 공부를 하면서 참고한 코드이다.

WriteByte()함수에서 버퍼크기를 수정하여 사용하면 될듯싶다.


프로그램 종료시 시리얼도 닫아주는걸 잊지말자.


SerialPort.h

class CSerialPort
{
public:
	CSerialPort();
	~CSerialPort();
private:
	HANDLE	m_hComm;
	DCB		m_dcb;
	COMMTIMEOUTS m_CommTimeouts;
	BOOL	m_bPortReady;
	bool	m_bWriteRC;
	bool	m_bReadRC;
	DWORD	m_iBytesWritten;
	DWORD	m_iBytesRead;
	DWORD	m_dwBytesRead;
	BYTE	m_nWriteData[DATA_SIZE];

public:
	void ClosePort();
	bool ReadByte(BYTE &resp);
	bool ReadByte(BYTE* &resp, UINT size);
	bool WriteByte(BYTE *pBuff);
	int SetLevel(int nChannel, int nValue);
	int LightOnOff(int nChannel, bool bOn);
	bool OpenPort(CString portname);
	bool SetCommunicationTimeouts(DWORD ReadIntervalTimeout,
		DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant,
		DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant);
	bool ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD fParity,
		BYTE  Parity, BYTE StopBits);
	BOOL ch_state[4];
	BOOL comm_status = OFF;
};

extern CSerialPort m_serial;



SerialPort.cpp

#include "stdafx.h" #include "SerialPort.h" CSerialPort m_serial; CSerialPort::CSerialPort() { } CSerialPort::~CSerialPort() { } bool CSerialPort::OpenPort(CString portname) { m_hComm = CreateFile(L"//./" + portname, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (m_hComm == INVALID_HANDLE_VALUE) { return false; } else return true; } bool CSerialPort::ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD fParity, BYTE Parity, BYTE StopBits) { if ((m_bPortReady = GetCommState(m_hComm, &m_dcb)) == 0) { //MessageBox(L"GetCommState Error", L"Error", MB_OK + MB_ICONERROR); CloseHandle(m_hComm); return false; } m_dcb.BaudRate = BaudRate; m_dcb.ByteSize = ByteSize; m_dcb.Parity = Parity; m_dcb.StopBits = StopBits; m_dcb.fBinary = true; m_dcb.fDsrSensitivity = false; m_dcb.fParity = fParity; m_dcb.fOutX = false; m_dcb.fInX = false; m_dcb.fNull = false; m_dcb.fAbortOnError = true; m_dcb.fOutxCtsFlow = false; m_dcb.fOutxDsrFlow = false; m_dcb.fDtrControl = DTR_CONTROL_DISABLE; m_dcb.fDsrSensitivity = false; m_dcb.fRtsControl = RTS_CONTROL_DISABLE; m_dcb.fOutxCtsFlow = false; m_dcb.fOutxCtsFlow = false; m_bPortReady = SetCommState(m_hComm, &m_dcb); if (m_bPortReady == 0) { MessageBox((HWND)"SetCommState Error",NULL, L"Error", MB_OK + MB_ICONERROR); CloseHandle(m_hComm); return false; } return true; } bool CSerialPort::SetCommunicationTimeouts(DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant) { if ((m_bPortReady = GetCommTimeouts(m_hComm, &m_CommTimeouts)) == 0) return false; m_CommTimeouts.ReadIntervalTimeout = ReadIntervalTimeout; m_CommTimeouts.ReadTotalTimeoutConstant = ReadTotalTimeoutConstant; m_CommTimeouts.ReadTotalTimeoutMultiplier = ReadTotalTimeoutMultiplier; m_CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant; m_CommTimeouts.WriteTotalTimeoutMultiplier = WriteTotalTimeoutMultiplier; m_bPortReady = SetCommTimeouts(m_hComm, &m_CommTimeouts); if (m_bPortReady == 0) { MessageBox((HWND)"StCommTimeouts function failed", NULL, L"Com Port Error", MB_OK + MB_ICONERROR); CloseHandle(m_hComm); return false; } return true; } bool CSerialPort::WriteByte(BYTE *pBuff) { m_iBytesWritten = 0; BYTE temp[9] = { NULL }; for (int i = 0; i < 9;i++) { temp[i] = pBuff[i]; } if (WriteFile(m_hComm, temp, 9, &m_iBytesWritten, NULL) == 0) return false; else return true; } bool CSerialPort::ReadByte(BYTE &resp) { BYTE rx; resp = 0; DWORD dwBytesTransferred = 0; if (ReadFile(m_hComm, &rx, 1, &dwBytesTransferred, 0)) { if (dwBytesTransferred == 1) { resp = rx; return true; } } return false; } bool CSerialPort::ReadByte(BYTE* &resp, UINT size) { DWORD dwBytesTransferred = 0; if (ReadFile(m_hComm, resp, size, &dwBytesTransferred, 0)) { if (dwBytesTransferred == size) return true; } return false; } void CSerialPort::ClosePort() { CloseHandle(m_hComm); return; }


블로그 이미지

Lunik

이제 사회첫걸음 걷고 있는 개발자.