retString = (std::tstring)((CString)recvBuf);
// 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);
}
// 스타일 변경
m_ctrlList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

// 체크박스 영역 클릭 여부
if ( pNMItemActivate->ptAction.x >= 5 &&pNMItemActivate->ptAction.x <= 20 )
{
    ....
}

// 체크박스 체크 여부
UINT uState = m_ctrlListFiles.GetItemState(i-1, LVIS_STATEIMAGEMASK);
if(BOOL((int)(uState)-1)>>12)
{
    // 체크가 되어 있을 경우
    ....
}
else
{
    // 체크가 안되어 있을 경우
    ....
}

// 아이템 선택된 상태로 변경
m_ctrlList.SetItemState(nIndex/*아이템 Index*/, LVIS_SELECTED, LVIS_SELECTED);
"C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE" "%1"
귀찮아서;;
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
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);
            }
        }
    }
}
HTML 컨트롤을 선택하여 기본적으로 제공되는 소스를 수정한 DHTML컨트롤.

기존의 IDHTCtrlUI을 삭제(이때, 컴파일 에러는 전부 주석처리)하고 외부로 노출될 UIObj Object를 추가했다.(ATL Object Wizard)

IDHTCtrl 인터페이스 생성부분에서 아래와 같이 수정 및 멤버변수를 추가했다.

// 웹 브라우저 생성, 인터페이스 교환
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
        CAxWindow wnd(m_hWnd);

        // 1. Web Browser 컨트롤 생성
        HRESULT        hr        =        wnd.CreateControl(IDH_DHTCTRL);
        if(SUCCEEDED(hr)) {
                hr        =        CComObject<CUIObj>::CreateInstance(&m_pUI);
                if(SUCCEEDED(hr)) {

                        // 2. Web Browser에게 연동되는 UIDisp 전달
                        CComQIPtr<IDispatch> pDisp(m_pUI);
                        hr        =        wnd.SetExternalDispatch(pDisp);
                }
                if(SUCCEEDED(hr)) {

                        // 3. Web Browser가 노출하고 있는 Interface 포인터 획득
                        hr        =        wnd.QueryControl(IID_IWebBrowser2, (void**)&m_spBrowser);

                        // 4. Web Browser와 실제 연동할 m_pUI인터페이스에게 Web Interface 전달
                        m_pUI->put_Web(m_spBrowser);
                }
        }
        return SUCCEEDED(hr)?0:-1;
}

CComObject<CUIObj>                *m_pUI;

//////////////////////////////////////////////////////////////////////////////

IUIObj 인터페이스에 Web property를 추가.

STDMETHODIMP CUIObj::get_Web(IUnknown **pVal)
{
        m_spBrowser->Navigate(m_urlPath,NULL,NULL,NULL,NULL);
        return S_OK;
}

STDMETHODIMP CUIObj::put_Web(IUnknown *newVal)
{
        m_spBrowser        =        (IWebBrowser2*)newVal;
        return S_OK;
}

GoToURL()이란 메소드도 추가하여 메소드 안에서 m_spBrowser->Navigate(m_urlPath,NULL,NULL,NULL,NULL)을 호출.

멤버변수
CComPtr<IWebBrowser2>        m_spBrowser;        //IDHCtrl 에서 전달되는 인터페이스 저장
CComBSTR                m_urlPath;                //URL 저장공간

OnClick()메소드도 옮겨오기....소스복사, IDL수정....뭐 대충 이정도밖에 기억안나네ㅡ.,ㅡ

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);
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
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 );