retString = (std::tstring)((CString)recvBuf);
MFC/MFC General
- Converting from char[] to tstring 2011.03.15
- Dialog 배경색상 변경 2011.03.10
- 파일연결 바꾸기 2010.07.15
- 문자열 인코딩 체크함수 2009.05.21
- 윈도우 최상위로 끌어올리기 2009.02.24
- 트레이 아이콘 만들기 2009.02.13
- 죽을때 에러메세지 안 보이기 2009.02.13
- 해상도 변경 2009.02.13
- 현재 모듈의 실행경로 얻어오기 2009.02.13
- 프로세스 실행시키고 작업이 완료되기까지 기다리기 2009.02.13
Converting from char[] to tstring
2011. 3. 15. 09:16
Dialog 배경색상 변경
2011. 3. 10. 10:49
// WM_ERASEBKGND 메세지 추가
BOOL CMyDialog::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
CBrush myBrush(RGB(255, 255, 255)); // dialog background color
CBrush *pOld = pDC->SelectObject(&myBrush);
BOOL bRes = pDC->PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOld); // restore old brush
return bRes; // CDialog::OnEraseBkgnd(pDC);
}
파일연결 바꾸기
2010. 7. 15. 15:44
"C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE" "%1"
귀찮아서;;
귀찮아서;;
문자열 인코딩 체크함수
2009. 5. 21. 11:30
int CheckEncodingType(CString strPage)
{
//////////////////////////////////////////////////////////////////////////
//
// Function : CheckEncodingType
// Param : LPCTSTR lpFilelocation 파일의 저장위치
// Return : integer; 0 = ANSI
// 1 = UTF-8
// 2 = Unicode LE
// 3 = Unicdoe BE
// -1 = File Error
//
// description : 텍스트의 인코딩 형식을 찾아 리턴한다
int nRet = 0;
BYTE btBuf[8];
memset(btBuf, 0, 8);
//BOM 정의
BYTE btBOM_UnicodeBE[] = {0xFE, 0xFF};
BYTE btBOM_UnicodeLE[] = {0xFF, 0xFE};
BYTE btBOM_UTF8[] = {0xEF, 0xBB, 0xBF};
//3바이트이상
if(strPage.GetLength() < 3)
return -1;
if(memcmp(btBuf, btBOM_UnicodeLE, 2) == 0) //Unicode Little Endian
{
nRet = 2;
return nRet;
}
else if(memcmp(btBuf, btBOM_UnicodeBE, 2) == 0) //Unicode Big Endian
{
nRet = 3;
return nRet;
}
else if(memcmp(btBuf, btBOM_UTF8, 3) == 0) //UTF-8
{
nRet = 1;
return nRet;
}
// ANSI와 UTF-8을 노가다로 판단하는 루틴
memset(btBuf, 0, 8);
int nLookNum = 0; // 이후 출현할 바이트 개수값
int nRead = 0;
int nANSINum = 0;
for (int i=0; i 0) //내부 검사
{
nLookNum--;
if(btBuf[0] >= 0x80 && btBuf[0] <= 0xBF)
continue;
else
return 0; //ANSI 리턴
}
else //최외각 검사
{
if(btBuf[0] >= 0xC0 && btBuf[0] <= 0xDF) nLookNum = 1;
else if(btBuf[0] >= 0xE0 && btBuf[0] <= 0xEF) nLookNum = 2;
else if(btBuf[0] >= 0xF0 && btBuf[0] <= 0xF7) nLookNum = 3;
else if(btBuf[0] >= 0xF8 && btBuf[0] <= 0xFB) nLookNum = 4;
else if(btBuf[0] == 0xFC || btBuf[0] == 0xFD) nLookNum = 5;
else nANSINum++;
continue;
}
}
}
if(nRead != nANSINum) nRet = 1;
else nRet = 0;
return nRet;
}
출처 : 데브피아
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=568605&ref=561246
윈도우 최상위로 끌어올리기
2009. 2. 24. 13:59
if(::GetForegroundWindow() != GetSafeHwnd()) {
HWND hActiveWnd = ::GetForegroundWindow();
if(hActiveWnd != NULL) {
DWORD ThreadID = GetWindowThreadProcessId(hActiveWnd, NULL);
DWORD CurrentThreadID = GetCurrentThreadId();
if(CurrentThreadID != ThreadID) {
if(AttachThreadInput(CurrentThreadID, ThreadID, TRUE)) {
::BringWindowToTop(GetSafeHwnd());
AttachThreadInput(CurrentThreadID, ThreadID, FALSE);
}
}
}
}
트레이 아이콘 만들기
2009. 2. 13. 12:55
void CTestDlg::TrayIcon()
{
if(!m_TaskFlag)
{
ShowWindow(SW_HIDE);
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = m_hWnd; //현재 다이얼로그의 윈도우 핸들
nid.uID = IDR_MAINFRAME; //아이콘의 리소스ID
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage = UM_ICONNOTIFY; //우리가 만든 메시지
nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
lstrcpy(nid.szTip,"우리가 만든 태스크바"); // 툴팁
Shell_NotifyIcon(NIM_ADD,&nid);
// taskBar상태영역에 아이콘 추가,삭제,수정할때 시스템에 메시지 전달
SendMessage(WM_SETICON,(WPARAM)TRUE,(LPARAM)nid.hIcon);
// taskBar 상태영역에 아이콘 설정
m_TaskFlag = TRUE;
}
}
이 함수를 실행하면 현재의 창이 사라지면서 트레이 아이콘이 생깁니다.
void CDetectPointDlg::TrayCallback(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
{
case WM_RBUTTONDOWN:
AfxMessageBox("트레이 아이콘!");
break;
case WM_LBUTTONDOWN:
ShowWindow(SW_SHOW);
m_TaskFlag = FALSE;
break;
case WM_RBUTTONDBLCLK:
CMenu menu, *pSubMenu;
if(!menu.LoadMenu(IDR_MENU)) return 0;
if(!(pSubMenu = menu.GetSubMenu(0))) return 0;
CPoint pos;
GetCursorPos(&pos);
SetForegroundWindow();
pSubMenu->TrackPopupMenu(TPM_RIGHTALIGN, pos.x, pos.y, this);
menu.DestroyMenu();
break;
}
}
이 함수는 오른쪽 밑에 있는 트레이 아이콘에 대한 이벤트 처리하는 부분이고요...
BEGIN_MESSAGE_MAP에 메세지 연결 해주시고...
ON_MESSAGE(UM_ICONNOTIFY,TrayCallback) // 메시지 추가
#define UM_ICONNOTIFY WM_USER+6001
이것두 추가해 주셔야 합니다...
// 트레이 종료..
Shell_NotifyIcon(NIM_DELETE, &nid);
{
if(!m_TaskFlag)
{
ShowWindow(SW_HIDE);
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = m_hWnd; //현재 다이얼로그의 윈도우 핸들
nid.uID = IDR_MAINFRAME; //아이콘의 리소스ID
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage = UM_ICONNOTIFY; //우리가 만든 메시지
nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
lstrcpy(nid.szTip,"우리가 만든 태스크바"); // 툴팁
Shell_NotifyIcon(NIM_ADD,&nid);
// taskBar상태영역에 아이콘 추가,삭제,수정할때 시스템에 메시지 전달
SendMessage(WM_SETICON,(WPARAM)TRUE,(LPARAM)nid.hIcon);
// taskBar 상태영역에 아이콘 설정
m_TaskFlag = TRUE;
}
}
이 함수를 실행하면 현재의 창이 사라지면서 트레이 아이콘이 생깁니다.
void CDetectPointDlg::TrayCallback(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
{
case WM_RBUTTONDOWN:
AfxMessageBox("트레이 아이콘!");
break;
case WM_LBUTTONDOWN:
ShowWindow(SW_SHOW);
m_TaskFlag = FALSE;
break;
case WM_RBUTTONDBLCLK:
CMenu menu, *pSubMenu;
if(!menu.LoadMenu(IDR_MENU)) return 0;
if(!(pSubMenu = menu.GetSubMenu(0))) return 0;
CPoint pos;
GetCursorPos(&pos);
SetForegroundWindow();
pSubMenu->TrackPopupMenu(TPM_RIGHTALIGN, pos.x, pos.y, this);
menu.DestroyMenu();
break;
}
}
이 함수는 오른쪽 밑에 있는 트레이 아이콘에 대한 이벤트 처리하는 부분이고요...
BEGIN_MESSAGE_MAP에 메세지 연결 해주시고...
ON_MESSAGE(UM_ICONNOTIFY,TrayCallback) // 메시지 추가
#define UM_ICONNOTIFY WM_USER+6001
이것두 추가해 주셔야 합니다...
// 트레이 종료..
Shell_NotifyIcon(NIM_DELETE, &nid);
죽을때 에러메세지 안 보이기
2009. 2. 13. 11:04
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
해상도 변경
2009. 2. 13. 10:43
DEVMODE stMode ;
ZeroMemory(&stMode, sizeof(DEVMODE));
stMode.dmSize = sizeof(DEVMODE);
stMode.dmBitsPerPel = 16; // 16비트 칼라로 변경
stMode.dmPelsWidth = 1024; // 프로그램 실행위한 최소 가로 해상도
stMode.dmPelsHeight = 768; // 프로그램 실행위한 최소 세로 해상도
stMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
ChangeDisplaySettings(&stMode, CDS_FULLSCREEN );
현재 모듈의 실행경로 얻어오기
2009. 2. 13. 10:25
char szProgrampath[_MAX_PATH], szDrive[_MAX_DRIVE], szDir[_MAX_DIR];
GetModuleFileName( NULL, szProgrampath, _MAX_PATH);
_splitpath(szProgrampath, szDrive, szDir, NULL, NULL);
// 멤버변수 m_strPath에 담는다.
m_strPath.Format("%s%s", szDrive, szDir);
프로세스 실행시키고 작업이 완료되기까지 기다리기
2009. 2. 13. 10:15
프로세스를 실행시키고.. 해당프로세스의 작업이 완료되었는지 기다린뒤 다음 코드를 수행하는 루틴
CString strDir;
char szDrive[_MAX_DRIVE], szDir[_MAX_DIR];
_splitpath(g_strFilePath.GetBuffer(g_strFilePath.GetLength()),szDrive,szDir,NULL,NULL);
strDir.Format("%s%s",szDrive,szDir);
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof (SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = "open";
sei.lpFile = g_strFilePath;
sei.lpDirectory = strDir.GetBuffer(strDir.Length());
sei.lpParameter = "test.txt -t.."
sei.nShow = SW_SHOWNORMAL;
if (ShellExecuteEx (&sei))
{
WaitForSingleObject (sei.hProcess, INFINITE);
}
// 익스플로러 띄우기..
ShellExecute(NULL, "open", "iexplore.exe", "http://dynaforce.tistory..com", NULL, SW_SHOWNORMAL);
////////////////////////////////////////////////////////////////////////////////////////////
WaitForSingleObject앞에
WaitForInputIdle(sei.hProcess, INFINITE);//해당프로그램이 초기화완료될때까지 대기
프로그램의 초기화 시간이 긴 경우 사용
ps. ShellExecuteEx안에서 CreateProcess를 내부적으로 호출
CString strDir;
char szDrive[_MAX_DRIVE], szDir[_MAX_DIR];
_splitpath(g_strFilePath.GetBuffer(g_strFilePath.GetLength()),szDrive,szDir,NULL,NULL);
strDir.Format("%s%s",szDrive,szDir);
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof (SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = "open";
sei.lpFile = g_strFilePath;
sei.lpDirectory = strDir.GetBuffer(strDir.Length());
sei.lpParameter = "test.txt -t.."
sei.nShow = SW_SHOWNORMAL;
if (ShellExecuteEx (&sei))
{
WaitForSingleObject (sei.hProcess, INFINITE);
}
// 익스플로러 띄우기..
ShellExecute(NULL, "open", "iexplore.exe", "http://dynaforce.tistory..com", NULL, SW_SHOWNORMAL);
////////////////////////////////////////////////////////////////////////////////////////////
WaitForSingleObject앞에
WaitForInputIdle(sei.hProcess, INFINITE);//해당프로그램이 초기화완료될때까지 대기
프로그램의 초기화 시간이 긴 경우 사용
ps. ShellExecuteEx안에서 CreateProcess를 내부적으로 호출