tuple 삽입 가져오기

 //데이터 삽입
std::unordered_map <long, std::tuple< int, long, CString >> mapRank;
mapRank[1000] = make_tuple(3, 5, "TEST");

//데이터 가져오기
for (auto info : mapRank)
{
std::tuple_element<0, decltype(info.second)>::type nRank = std::get<0>(info.second);
std::tuple_element<1, decltype(info.second)>::type nCount = std::get<1>(info.second);
std::tuple_element<2, decltype(info.second)>::type strTemp = std::get<2>(info.second);
}


std::tuple_element<0, decltype(mapRank[1000])>::type nRank = std::get<0>(mapRank[1000]);
std::tuple_element<1, decltype(mapRank[1000])>::type nCount = std::get<1>(mapRank[1000]);
std::tuple_element<2, decltype(mapRank[1000])>::type strTemp = std::get<2>(mapRank[1000]);

 

 

tuple 정렬

#define TRIPLE_PAIR std::pair<long, std::tuple< int, long, CString >>

bool CompareRank(const TRIPLE_PAIR& a, const TRIPLE_PAIR& b) {
//if (a.second.second == b.second.second) return a.second < b.second;
std::tuple_element<1, decltype(a.second)>::type nNum1 = std::get<1>(a.second);
std::tuple_element<1, decltype(b.second)>::type nNum2 = std::get<1>(b.second);
return nNum1 > nNum2;
}

void CalcRank()
{

std::unordered_map <long, std::tuple< int, long, CString >> mapRank
mapRank[1000] = make_tuple(3, 5, "TEST");

//정렬
std::vector <TRIPLE_PAIR> vecTemp(mapRank.begin(), mapRank.end());
sort(vecTemp.begin(), vecTemp.end(), CompareRank);

//해당 분류결함의 순위와 개수 찾기
for (int i = 0; i < vecTemp.size(); i++)
{
std::tuple_element<1, decltype(vecTemp[i].second)>::type nTemp = std::get<1>(vecTemp[i].second);
int nRank = nTemp;
}

}

 

 

 

 

Pair 삽입 가져오기

//데이터 삽입
std::unordered_map<long, std::pair<int, long>> mapRank;
mapRank.clear();
mapRank[1000] = make_pair(0,0);

//데이터 가져오기
int nRank =  mapRank[1000] .first;
long lCount =  mapRank[1000] .second;

 

 

 

Pair 정렬

#define DOULBE_PAIR std::pair<long, std::pair<int, long>>
bool Compare(const DOULBE_PAIR& a, const DOULBE_PAIR& b) {
//if (a.second.second == b.second.second) return a.second < b.second;
return a.second.second > b.second.second;
}

void CalcRank()
{
std::unordered_map<long, std::pair<int, long>> mapRank;
mapRank.clear();

mapRank[1000] = make_pair(0,0);


//분류별 결함 정렬
std::vector <DOULBE_PAIR> vecTemp(mapRank.begin() , mapRank.end());
sort(vecTemp.begin(), vecTemp.end(), Compare);


for (int i = 0 ; i < vecTemp.size(); i++)
{
int nRank = vecTemp[i].second.first;
long lCount = vecTemp[i].second.second;
}
}

 

 

참조 : https://psychoria.tistory.com/entry/C-11-stdpair%EB%A5%BC-%ED%99%95%EC%9E%A5%ED%95%9C-stdtuple

 

DateTimePicker 값 설정 , 불러오기 

 

값 설정하기

리소스 아이디 : IDC_DATETIMEPICKER_DAY_START

 

COleDateTime timeNow = COleDateTime::GetCurrentTime();

COleDateTime(timeNow.GetYear(), timeNow.GetMonth(), timeNow.GetDay(), 00, 00, 00);

CDateTimeCtrl *pStartTimeCtl = (CDateTimeCtrl *)GetDlgItem(IDC_DATETIMEPICKER_DAY_START);

pStartTimeCtl->SetTime(COleDateTime(timeNow.GetYear(), timeNow.GetMonth()-2, timeNow.GetDay(), 00, 00, 00));

 

값 가져오기

CDateTimeCtrl *pStartTimeCtl = (CDateTimeCtrl *)GetDlgItem(IDC_DATETIMEPICKER_DAY_START);

COleDateTime dateStartTime;

pStartTimeCtl->GetTime(dateStartTime);

int nYear = dateStartTime.GetYear();

int nMonth = dateStartTime.GetMonth();

int nDay = dateStartTime.GetDay();

 

 

참조 : https://blog.naver.com/krazie99/30094019069

 

HWND hCommTarget = ::FindWindow(NULL, _T("Vision"));
if (hCommTarget == NULL)
{
OutputListbox(m_listOutputPLC, _T("Not Found Vision Program") + strSetValue);
return;
}

 

FindWindow 사용시 위와 같이 사용하면  프로그램을 찾아야 하는데

프로그램 명과 동일한 폴더를 열어놓으면 폴더를 인식할 수 있음

 

그래서 대상 프로그램에 윈도우 클래스를 정해주면 보다 명확하게 타겟을 찾아갈 수 있음

 

HWND hCommTarget = ::FindWindow(_T("Sanot"), _T("Vision"));
if (hCommTarget == NULL)
{
OutputListbox(m_listOutputPLC, _T("Not Found Vision Program") + strSetValue);
return;
}

 

 

대상 프로그램

BOOL CTestApp::InitInstance()
{
    WNDCLASS wc;
    GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wc);
    wc.lpszClassName = _T("Sanot");
    AfxRegisterClass(&wc);

   //...
}


BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
   //...

  cs.lpszClass = _T(" Sanot ");

  //...
}

Load 

CString strPath;
TCHAR szFilter[] = _T("Image File(*.png;*.bmp;*.jpg;*.gif)|*.bmp;*.jpg;*.gif;*.png|BMP file(*.bmp)|*.bmp|"
"JPG file(*.jpg)|*.jpg|GIF file(*.gif)|*.gif|PNG file(*.png)|*.png|"
"All Files(*.*)|*.*||");

//TCHAR szFilter[] = "All Files(*.*)|*.*|";  //모든파일

CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, NULL);
if (IDOK == dlg.DoModal())
{
CString strPath;
strPath = dlg.GetPathName();
std::string strImage;
strImage = std::string(CT2CA(strPath.operator LPCWSTR()));
Mat cvSrc = imread(strImage, IMREAD_COLOR);
}

Save

CFileDialog dlg(FALSE, _T("png"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("Image File(*.png;*.bmp;*.jpg;*.gif)|*.bmp;*.jpg;*.gif;*.png|BMP file(*.bmp)|*.bmp|"
   "JPG file(*.jpg)|*.jpg|GIF file(*.gif)|*.gif|PNG file(*.png)|*.png|"));
if (dlg.DoModal() == IDOK)
{
 CString strPath;
  strPath = dlg.GetPathName();
  std::string strImage;
  strImage = std::string(CT2CA(strPath.operator LPCWSTR()));
}

Load 여러개

CString strFilter = _T("Image File(*.BMP;*.JPG) | *.BMP;*.JPG; | All Files(*.*) | *.* || ");
CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT, strFilter, NULL);
char fileBuffer[4096] = { 0 };
CString strBuffer;
dlg.m_ofn.lpstrFile = strBuffer.GetBuffer(4096);
dlg.m_ofn.nMaxFile = sizeof(fileBuffer);
dlg.m_ofn.nMaxFile = 4096;
CString strPath;
int nOpenFirst = m_listImage.GetItemCount();

if (IDOK == dlg.DoModal())
{
POSITION pos = dlg.GetStartPosition();
int listIndex = m_listImage.GetItemCount();
if (listIndex < 0)
{
listIndex = 0;
}
while (pos != NULL)
{
strPath = dlg.GetNextPathName(pos); 
//여기서 처리

}
}

void JobQueue ::clearJobs()
 {
  // I want to avoid pop in a loop
    while (!m_Queue.empty())
    {
        m_Queue.pop();
    }
}

int main() {
    queue <int> q1;
    // stuff
    q1 = queue<int>();  
}

#include <algorithm>

void clear( std::queue<int> &q )
{
   std::queue<int> empty;
   std::swap( q, empty );
}

출처 : https://stackoverflow.com/questions/709146/how-do-i-clear-the-stdqueue-efficiently


#include <locale.h>                    추가
setlocale(LC_ALL, "korean");

 

 쓰기


setlocale(LC_ALL, "korean");
CString strPath = strExePath + _T("\\ClickLog.txt");   //파일저장 경로

CStdioFile file;
if (file.Open(strPath, CFile::modeCreate | CFile::modeWrite))
{
   file.SeekToEnd();                       
   file.WriteString(strText);     
   file.Close();                           
}

읽기

CStdioFile file;
CString strPath = strExePath + _T("\\ClickLog.txt");

if(!file.Open(strPath,CFile::modeRead,NULL))
   return; 

CString strText; 
while(file.ReadString(strText))
{
   TRACE(strText);
}
file.Close();

 

 

 

//출처 : https://blog.naver.com/mu_kk/130165080003

'공부 > MFC_자주쓸거' 카테고리의 다른 글

[MFC] 파일열기 대화상자 CFileDialog  (0) 2023.03.30
[MFC] Queue 초기화  (0) 2023.03.22
[MFC] 리스트 박스 값 가져오기 ListBox  (0) 2022.12.07
[MFC] 실행파일 경로  (0) 2022.12.07
[MFC] 파일 존재 여부 체크  (0) 2022.12.06
CString strText; 
CListBox *pListLog = (CListBox *)GetDlgItem(IDC_LIST_LOG);
int nIndex = pListLog->GetCurSel();

if (nIndex != LB_ERR)
{
       pListLog->GetText(nIndex, strText);
}

 

Ex)


void CDVSSystemServerView::OnLbnDblclkListLog()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

CString strText; 
CListBox *pListLog = (CListBox *)GetDlgItem(IDC_LIST_LOG);
int nIndex = pListLog->GetCurSel();
if (nIndex != LB_ERR)
{
pListLog->GetText(nIndex, strText);

TCHAR szPath[_MAX_PATH + 1];
GetModuleFileName(AfxGetApp()->m_hInstance, szPath, _MAX_PATH);
CString strExePath = szPath;
int nLen = strExePath.ReverseFind('\\');
if (nLen > 0)
strExePath = strExePath.Left(nLen);

setlocale(LC_ALL, "korean");
CString strPath = strExePath + _T("\\ClickLog.txt");

CStdioFile file;
if (file.Open(strPath, CFile::modeCreate | CFile::modeWrite))
{
file.SeekToEnd();                       
file.WriteString(strText);     
file.Close();                           
}

ShellExecute(NULL,_T("open"),_T("notepad"), strPath, NULL,SW_SHOW);
}
}

'공부 > MFC_자주쓸거' 카테고리의 다른 글

[MFC] Queue 초기화  (0) 2023.03.22
[MFC] CStdioFile txt 파일 읽기 쓰기  (0) 2022.12.07
[MFC] 실행파일 경로  (0) 2022.12.07
[MFC] 파일 존재 여부 체크  (0) 2022.12.06
[MFC] 처리시간 체크  (0) 2022.09.16
// 실행파일이 존재하는 폴더 경로 반환
CString CSqlite3Manager::GetModulePath()
{
TCHAR szPath[MAX_PATH];
memset(szPath, 0x00, MAX_PATH);

::GetModuleFileName(NULL, szPath, MAX_PATH);

CString sTempPath = szPath;
int iLength = sTempPath.GetLength();
int iPos = sTempPath.ReverseFind(TCHAR('\\'));

CString sModulePath = sTempPath.Left(iPos);
sModulePath += _T("\\");
return sModulePath;
}

 

CFileFind find;
BOOL bRet = find.FindFile(_T("D:\\Text.txt"));
if (bRet)
{
//파일존재
}
else
{
//파일 없음
}

 

출처 : https://m.blog.naver.com/kyuhgmi/40130934218

최상단에 추가 

//시간체크
#include < windows.h >
LARGE_INTEGER Frequency;
LARGE_INTEGER BeginTime;
LARGE_INTEGER Endtime;
#define CHECK_TIME_START QueryPerformanceCounter( &BeginTime );
#define CHECK_TIME_END QueryPerformanceCounter( &Endtime );
#define GET_TIME_SEC(a) QueryPerformanceFrequency(&Frequency); int64 elapsed = Endtime.QuadPart- BeginTime.QuadPart; a = float((double)elapsed / (double)Frequency.QuadPart );
#define GET_TIME_MSEC(a) QueryPerformanceFrequency(&Frequency); int64 elapsed = Endtime.QuadPart- BeginTime.QuadPart; a = float((double)elapsed / (double)Frequency.QuadPart * 1000.0);
//

사용

CHECK_TIME_START;
//동작
Sleep(500);
//
CHECK_TIME_END;
float fTime = 0.0;
GET_TIME_MSEC(fTime);

출처 : https://jangjy.tistory.com/95

 

 CTime time = CTime::GetCurrentTime();
 CString str = time.Format("%Y년 %m월 %d일"); // %들은 포맷 종류 (아래 참고)
 AfxMessageBox(str);

//
CTime::GetCurrentTime().Format("%Y%m%d%H%M%S");

 

 

%y - 뒤 2자리 (09)

%Y - 전체 (2009)

 

%m - 01~12 (03)

%b - 영어 3글자 (Mar)

%B - 영어 전체 (March)

 

%d - 01~31 월 기준 (10)

%j - 001~365 년 기준 (069)

 

%H - 00~23 24시 기준 (14)

%I (대문자 아이) - 01~12 12시 기준 (02)

 

%M - 00~59 (12)

 

%S - 00~59 (15)

 

요일

%a - 요약 (Tue)

%A - 요일 (Tuesday)

%w - 일요일 0 기준 (2)

%U - 00~53 년기준으로 시작주 일요일 (10)

%W - 00~53 년기준으로 시작주 월요일 (10)

 

기타

%p - AM/PM (PM)

%x - 월/일/년 (03/10/09)

%X - 시:분:초 (14:12:15)

%c - 월/일/년 시:분:초 (03/10/09 14:12:15)
%% - % 기호 (%)

%z, %Z - 시간대 이름 (대한민국 표준시)

 

 

참고 : http://www.devlab.pe.kr/10

 


// Type
// 0: 파일 경로만 복사
// 1: 파일 이름만 복사
// 2: 파일 확장자 복사
// 3: 확장자를 뺀 파일명 복사
// 4: 2번케이스의 파일 확장자에서 .을 뺌.
CString strClip(CString str, int nType)
{
 //파일 Full Path를 복사
 TCHAR szTmp[4096];
 StrCpy(szTmp, str);
 CString strTmp;

 CString strResult = _T("");

 switch(nType)
 {
 case 0:
  //파일의 경로만 복사.
  PathRemoveFileSpec(szTmp);
  strResult = szTmp;
  break;

 case 1:
  // 1: 파일 이름만 복사
  strResult = PathFindFileName(szTmp);
  //strResult = szTmp;
  break;

 case 2:
  // 2: 파일 확장자 복사
  strResult = PathFindExtension(szTmp);
  break;

 case 3:
  // 3: 확장자를 뺀 파일명 복사
  strTmp = PathFindFileName(szTmp);
  ZeroMemory(szTmp, 4096);
  StrCpy(szTmp, strTmp);
  PathRemoveExtension(szTmp);
  strResult = szTmp;
  break;

 case 4:
  // 4: 2번케이스의 파일 확장자에서 .을 뺌.
  strResult = PathFindExtension(szTmp);
  strResult = strResult.Right(strResult.GetLength()-1);
  break;
 }


 return strResult;
}


출처: https://blog.naver.com/just720/40206748318

폴더선택 다이얼로그

 BROWSEINFO BrInfo;
TCHAR szBuffer[512];                                      // 경로저장 버퍼 

::ZeroMemory(&BrInfo, sizeof(BROWSEINFO));
::ZeroMemory(szBuffer, 512);

BrInfo.hwndOwner = GetSafeHwnd();
BrInfo.lpszTitle = _T("파일이 저장될 폴더를 선택하세요");
BrInfo.ulFlags = BIF_NEWDIALOGSTYLE | BIF_EDITBOX | BIF_RETURNONLYFSDIRS;
LPITEMIDLIST pItemIdList = ::SHBrowseForFolder(&BrInfo);
::SHGetPathFromIDList(pItemIdList, szBuffer);               // 파일경로 읽어오기

        // 경로를 가져와 사용할 경우, Edit Control 에 값 저장
CString str;
str.Format(_T("%s"), szBuffer);
SetDlgItemText(IDC_EDIT2, str);  

 

파일선택 다이얼로그

CString str = _T("All files(*.*)|*.*|"); // 모든 파일 표시
//CString strFilter = _T("Image File(*.BMP;*.JPG) | *.BMP;*.JPG; | All Files(*.*) | *.* || ");
// _T("Excel 파일 (*.xls, *.xlsx) |*.xls; *.xlsx|"); 와 같이 확장자를 제한하여 표시할 수 있음
CFileDialog dlg(TRUE, _T("*.dat"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, str, this);
//CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT, strFilter, NULL);

if (dlg.DoModal() == IDOK)
{
CString strPathName = dlg.GetPathName();
                // 파일 경로를 가져와 사용할 경우, Edit Control에 값 저장
SetDlgItemText(IDC_EDIT1, strPathName);  
}

 

출처 : https://psmkr0225.tistory.com/192

현재시간 가져오기

CString strTime = CTime::GetCurrentTime().Format("%y-%m-%d %H:%M:%S");

 

시간 체크

 

CStopWatch stopWatch;
stopWatch.Start();

// 처리

stopWatch.End();
strMsg.Format(_T("[Test Time]  Time: %.3f sec-----"), stopWatch.GetDurationSecond());

 

//메인프레임 포인터얻기

CMainFrame * pFrame = reinterpret_cast<CMainFrame*>(AfxGetApp()->GetMainWnd());

//View포인터
 (CTestView *)pFrame->GetActiveView();

//Doc포인터
CTestDoc  m_pDocument = reinterpret_cast<CTestDoc *>(pFrame->GetActiveDocument());

 

//가끔 NULL 나와서 다운됨  (사용X)

( CMainFrame * pFrame = (CMainFrame*)AfxGetMainWnd(); )

 

 

//참고 : https://six605.tistory.com/261

#include <experimental/filesystem>


string strDrawDirname = "FileDir";  //실행파일 위치에 있는 폴더이름  // 탐색할 폴더명
for (auto& p : experimental::filesystem::directory_iterator(strDrawDirname))  //경로 내 모든 파일 루프
{
string strFile = strDrawDirname + "\\" + p.path().filename().string();
CString strPath;
strPath.Format(_T("%S"), strFile.c_str());  //탐색한 폴더 내 파일 명

}

 

 

//WriteProfileString(_T(""), _T("레지스트리에서저장될이름"), 변수);


void SaveData()
{
CWinApp *pApp = AfxGetApp();
pApp->WriteProfileString(_T(""), _T("m_strSrcPath"), m_strSrcPath);
pApp->WriteProfileInt(_T(""), _T("m_nFPS"), m_nFPS);
}

void LoadData()
{
CWinApp *pApp = AfxGetApp();
m_strSrcPath = pApp->GetProfileString(_T(""), _T("m_strSrcPath"), _T(""));
m_nFPS = pApp->GetProfileIntA(_T(""), _T("m_nFPS"), 70);
}

'공부 > MFC_자주쓸거' 카테고리의 다른 글

[MFC]메인프레임 포인터 얻기  (0) 2022.05.06
[MFC] 폴더내 파일 탐색  (0) 2022.02.14
[MFC] 작업표시줄 숨기기  (0) 2021.07.07
[MFC]리스트박스 데이터 추가  (0) 2021.07.05
[MFC] 중복실행 방지  (0) 2021.05.27
void CMainFrame::ShowWindowTaskbar(BOOL bShow)
{
APPBARDATA stAppBarData;
ZeroMemory(&stAppBarData, sizeof(stAppBarData));
stAppBarData.cbSize = sizeof(stAppBarData);
stAppBarData.hWnd = (HWND)FindWindow(_T("Shell_TrayWnd"), NULL);
if (bShow)
{
stAppBarData.lParam |= ABS_ALWAYSONTOP;
}
else
{
stAppBarData.lParam |= ABS_AUTOHIDE;
}
SHAppBarMessage(ABM_SETSTATE, &stAppBarData);
}

출처: https://m.blog.naver.com/itrainl4/90092899174

리스트박스를 화면 표출 로그로 사용할시 사용

리스트박스 컨트롤 설정 sort : false 로 설정

 

CString strLog;
OutputListbox(m_listOutput, strLog);


void CExampleDlg::OutputListbox(CListBox& box, CString str)
{
SYSTEMTIME cur_time;
GetLocalTime(&cur_time);
CString strTime;
strTime.Format(_T("[%02d:%02d:%02d.%03d] "),
cur_time.wHour,
cur_time.wMinute,
cur_time.wSecond,
cur_time.wMilliseconds
);

UpdateData(TRUE);
box.AddString(_T(" >  ") + strTime + str);
box.SetCurSel(box.GetCount() - 1);  // Log 최신으로 커서이동

UpdateData(FALSE);
}

MFC 프로그램 중복 실행 방지

 

C프로젝트명App가 있는 cpp 파일에서 해당 코드 작성


/************************ 중복 실행 체크 ************************/
// 컴파일러에게이어플리케이션의모든인스턴스들사이에서공유될수있는
// Shared 섹션을구성하고초기화된변수를삽입하도록한다.
#pragma data_seg("Shared")
volatile LONG g_lApplicationInstances = 0;
#pragma data_seg()
// 링커에게Shared 섹션을읽고, 쓰고, 공유가능한섹션으로설정할것을알려준다.
#pragma comment(linker, "/Section:Shared,RWS")
/************************ end  중복 실행 체크 ************************/

//...

BOOL C프로젝트명App::InitInstance()
{
/************************  중복 실행 체크 ************************/
if (g_lApplicationInstances > 0)
{
// g_lApplicationInstances 가0 이상이 면프로그램이이미실행중이다.
//AfxMessageBox(_T("This Program is already running."));
return FALSE;
}
else
{
// g_lApplicationInstances에1을더하여 프로그램의인스턴스가추가된것을설정한다.
InterlockedExchangeAdd(&g_lApplicationInstances, 1);
}

//기존내용

//


}

+ Recent posts