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);

Posted by 모과이IT
,

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);
   }
  }
 }
}
Posted by 모과이IT
,

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<strPage.GetLength(); i++)
    {
        btBuf[0] = strPage.GetAt(i);
        nRead++;
        //7F (=127)보다 작은 경우는 패스
        if(btBuf[0] <= 0x7F && nLookNum == 0)
        {
            nANSINum++;
            continue;
        }
        //FF, FE일 경우는 UTF-8이 될 수 없다.
        else if((btBuf[0] == 0xFF || btBuf[0] == 0xFE) && nLookNum == 0)
        {
            return 0;
        }
        //7F보다 큰경우 UTF-8 판단작업 들어감
        else
        {
            if(nLookNum > 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;
}

Posted by 모과이IT
,

[CString -> char * 변환]

CString str;
str = "Hello";
char* ss = LPSTR(LPCTSTR(str));

[char * --> CString 변환]

char ss[] = "Hello";
CString str;
str.Format("%s", ss);

Or

char *ss = "Hello";
CString str;
str = ss;

유용한 팁임
Posted by 모과이IT
,

해당 View를 CScrollView로 설정하지 않았다면 스크롤바를 만드는게 곤란하다
CScrollView는 미리 설정을 해줘야하는데 내가 이걸 설정 안하고 코드를 상당부분 진행해서 곤란했는데

해법은 

해당 View의 CView를 CScrollView로 모두 고친 뒤
이 코드를 추가해준다.

<헤더>
==============================================================
protected:
irtual void OnInitialUpdate(); // 생성 후 처음 호출되었습니다. 
================================================================
void CSalePriceDlgFormView::OnInitialUpdate()
{
 CSize sizeTotal;
 // TODO: 이 뷰의 전체 크기를 계산합니다.
 sizeTotal.cx = 1600;
 sizeTotal.cy = 1200;

 SetScrollSizes(MM_TEXT, sizeTotal); // 스크롤 사이즈 설정
}

<헤더>
===========================================================================
public:
virtual void OnDraw(CDC* pDC);      // 이 뷰를 그리기 위해 재정의되었습니다
afx_msg void OnPaint();
===========================================================================
void CSalePriceDlgFormView::OnDraw(CDC* pDC)
{
 /*CPoint pointCursor;
 char text[100];
 GetCursorPos( &pointCursor );
 sprintf(text, "Mouse=%3d, %3d ", pointCursor.x, pointCursor.y);
 pDC->TextOut(5, 15, text, strlen(text)); */
}
void CSalePriceDlgFormView:OnPaint()
{
 CPaintDC dc(this); // device context for painting
 // TODO: 여기에 메시지 처리기 코드를 추가합니다.
 // 그리기 메시지에 대해서는 CScrollView::OnPaint()을(를) 호출하지 마십시오.

 int nVertScroll = GetScrollPos(SB_VERT); // 폭
 int nHorzScroll = GetScrollPos(SB_HORZ); // 높이

}

Posted by 모과이IT
,

 [팁] CSplitterWnd에 아무 윈도우나 넣자 2000-04-29 오전 2:12:47
전상연 번호: 7393  / 읽음:766
안녕하세요. 클럽 개설을 축하드립니다.

화면을 분할하고 싶을 때 MFC라면 당연히 CSplitterWnd를 사용하겠죠?
그런데 CSplitterWnd는 안에 들어가는 윈도우를 만들기 위해서 
CSplitterWnd::CreateView 함수를 호출합니다.

전 이름 때문에 이 함수가 CView를 계승한 클래스에 대해서만 동작하
는 줄 알았었는데 (MFC에서 자동으로 만들어주는 코드도 뷰에 대해서
만 나오기도 하죠) 사실은 CWnd를 계승한 클래스면 모두 동작한답니
다. -_-;

단 조건이 있는데 만들 클래스가 MFC의 동적생성 메카니즘을 지원해
야 한다는거죠. 즉, CRuntimeClass::CreateObject를 사용할 수 있어
야 합니다. 이를 위해서는 class 내부에서는 DECLARE_DYNCREATE나 
DECLARE_SERIAL 매크로를 사용하고, 소스파일에서 
IMPLEMENT_DYNCREATE나 IMPLEMENT_SERIAL 매크로를 사용해주면 됩니
다.

쉽죠?
혹시 다들 아시는거였나요? 제가 며칠전에 알게 되서 다른 분들도 모
르셨을까봐 적어봤습니다. ^^;;
Posted by 모과이IT
,