2010년 6월 25일 금요일

Control 배경 삭제

Control 의 배경을 투명하게 보이기 위해서는 BkMode의 TRANSPARENT를 사용하여야 한다.

 

사용 하는 방법

 

OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
          HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

          CWnd *pWndTemp;
          pWndTemp = GetDlgItem(IDC_STATIC_ID);

          if(pWnd == pWndTemp)
          {
                 /// 배경 투명으로 변경
                 pDC->SetBkMode(TRANSPARENT);
                return hbr = (HBRUSH)GetStockObject( NULL_BRUSH );
          }

          return hbr;
}

 

초기 생성할때 실행되며 원하는 Control의 CWnd를 얻어 사용

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

프로그램에서 Process 실행하기(exe)

프로그램 실행

CreateProcess(NULL, (LPSTR)"프로세스 경로명"), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

여러 ToolBar 를 하나의 ControlBar에 붙이기

Frame 에서 DockControlBar(CControlBar* pBar, CControlBar* pBarBase /* = NULL */) 를 상속받아 사용

 

void CControllerFrame::DockControlBar(CControlBar* pBar, CControlBar* pBarBase /* = NULL */)
{
 if (pBarBase != NULL)
 {
  CRect rcBase;
  DWORD dwStyleBase;
  UINT nDockBarID;

  RecalcLayout();

  pBarBase->GetWindowRect(rcBase);
  rcBase.OffsetRect(1,1);

  dwStyleBase = pBarBase->GetBarStyle();
  if  (dwStyleBase & CBRS_ALIGN_TOP)  nDockBarID = AFX_IDW_DOCKBAR_TOP;
  else if (dwStyleBase & CBRS_ALIGN_BOTTOM) nDockBarID = AFX_IDW_DOCKBAR_BOTTOM;
  else if (dwStyleBase & CBRS_ALIGN_LEFT)  nDockBarID = AFX_IDW_DOCKBAR_LEFT;
  else if (dwStyleBase & CBRS_ALIGN_RIGHT) nDockBarID = AFX_IDW_DOCKBAR_RIGHT;
  else          nDockBarID = 0;

  /// MDI 일때

  CMDIChildWnd::DockControlBar(pBar, nDockBarID, &rcBase);

  /// SDI일때

 /// CFrameWnd::DockControlBar(pBar, nDockBarID, &rcBase);
 }
 else

 {

 /// MID 일때
  CMDIChildWnd::DockControlBar(pBar);

 /// SDI 일때

  CFrameWnd::DockControlBar(pBar);

 }

}

 

Frame 에서 Toolbar를 생성하는 부분에 초기 생성되는 Bar를 넣고 그 위에 추가로 생성되는 Bar를 입력

 

OnCreate(LPCREATESTRUCT lpCreateStruct)

{

  .....

 /// pBarBase 가 NULL 이기 때문에 상위 Class 인 DockControlBar 호출
 DockControlBar(&m_wndToolBar);

 /// 재정의한 함수 적용후 호출

 DockControlBar( &m_wndEventToolBar, &m_wndToolBar);

.....

}


출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

창 움직이기

 

OnNcHitTest를 재사용 하면 된다


UINT CMemoMinDlg::OnNcHitTest(CPoint point)
{
 return HTCAPTION;
}

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

PtInRect

선택한 Point가 원하는 Rect 내부에 있는지 여부 확인

 

일정 공간에 마우스 또는 일정한 Point 가 위치 했는지 여부를 확인할때 사용한다.

 

 

if(rect.PtInRect(ptpoint) )
 {
  TRACE("hit Position \n");
 }

 

CRect 의 함수로 rect 내부에 ptpont(CPoint) 좌표가 위치 했는지 여부를 알려준다.

 

단 Rect Hight 와 Width 가 1보다 커야 한다.

 

return : BOOL 형식으로 내부에 위치하면 TRUE를 반환한다.


 

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

메뉴 띄우기

메뉴는 CMenu 띄우기

 

Resource 를 이용

Resource로 제작한 메뉴ResourceID (IDR_MENUMAIN)

 

 CMenu muTemp, *pOpenMenu;
 muTemp.LoadMenu(IDR_MENUMAIN);
 pOpenMenu = muTemp.GetSubMenu(0); // Resource 메뉴 번호
 pOpenMenu->TrackPopupMenu(TPM_LEFTALIGN, ptPoint.x, ptPoint.y, AfxGetMainWnd());

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

작업표시줄에 프로그램 않보이기

작업표시줄에 프로그램을 않보이게 실행이 필요한 경우

 

EX Style를 변경하면된다.

 

  ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

Tray Icon 만들기

VC++ 에서는 Tray ICon 만들기가 정말 쉽다.

 

여기 저기 많은 자료를 찾아봤는데

 

http://erik-ymkim.blogspot.com/2008/01/how-to-use-tray-icon-with-vc.html 여기에 정리되어 있는

 

자료가 제일 간단하게 정리되어 있습니다. ^^

 

^^ 쉽게 보면

 

Header 에

NOTIFYICONDATA m_NotiIcon; 선언

 

초기 생성에 아래 내용 입력 (Create 또는 OnInitDialog())

 m_NotiIcon.cbSize = sizeof(m_NotiIcon);
 m_NotiIcon.hWnd = this->m_hWnd;
 m_NotiIcon.uID = IDI_TRAY_ICON;
 m_NotiIcon.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
 m_NotiIcon.uCallbackMessage = WM_MY_TRAYICON;
 m_NotiIcon.hIcon = AfxGetApp()->LoadIcon(IDI_TRAY_ICON);
 strcpy(m_NotiIcon.szTip, "MemoMin");
 Shell_NotifyIcon(NIM_ADD, &m_NotiIcon);

각각의 전달되는 메시지에 맞게 Event 처리

TrayIConMsg(WPARAM wParam, LPARAM lParam)

switch(lParam)
 {
 case WM_RBUTTONDOWN:
  {
   break;
  }
 case WM_LBUTTONDBLCLK:
  {
   break;
  }
 }

 

Event는 PreTranslateMessage(MSG* pMsg) 에서 받으면 되니까

PreTranslateMessage(MSG* pMsg)

{

if(pMsg->hwnd == m_NotiIcon.hWnd)
 {
  TrayIConMsg(pMsg->lParam, pMsg->message); // 메시지 받아 바로 전달 ^^

 }

}

 

이렇게 처리하면 쉽게 가능하다 ^^

 

프로그램 종료시에는

Shell_NotifyIcon(NIM_DELETE, &m_NotiIcon);

Icon을 삭제해주는 쎈스 ~~

 

만약에 여러개의 TrayICon을 주기적으로 변경해주기 위해서는

현재 보여지고 있는 TrayICon을 삭제하교 새로운 TrayICon을 띄워주면 된다.

 

삭제하고 새로보여줄때

Shell_NotifyIcon( NIM_MODIFY, &m_NotiIcon);

위에 것을 잘 활용하면 움직이는 것처럼 보여줄수 있다. ^^


출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

CWind 상속 받기 (주의점)

CWind를 상속 받을 때는 주의 점

 

CWind를 상속받을 때 Class Name RegisterClass 함수로 등록하여 사용

 

CreateEx(0, AfxRegisterWndClass(0, LoadCursor(IDC_ARROW), (HBRUSH)GetStockObject(WHITE_BRUSH)), "NewClassName",WS_POPUP|WS_SYSMENU|WS_VISIBLE|WS_CAPTION, CRect(0,0,200,200), this, NULL);

 

삭제시에는

this->delete 로 삭제 하게됨으로

생성한 Class 나 또는 PostNcDestroy(); 함수를 이용하여 삭제

 

 

http://msdn.microsoft.com/en-us/library/1xb05f0h(VS.80).aspx

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

CFile을 이용한 File 제어

MFC에서 제공하는

 

CFile 라이브러리를 이용해서 파일을 제어해봤다.

 

사실 API 를 이용하는 것보다 쉬울줄 알았는데 쓰기에는 쉬워도 제작하기는 불편하다. ㅋㅋ

 

-- Class를 이용한 접근

CMultiFileControl.h

 

-- API 를 이용한 접근

MultiFileControl.h

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

ADO를 이용한 DB 접속

 

가장 많이 쓰는 DB 접속 라이브러리

 

당연히 MFC를 이용하여 제작 했구..

 

쓰기 편하도록 작업했는데 ㅋㅋㅋ 글쎄 ^0^

 

#import "C:/program files/common files/system/ado/msado15.dll" rename("EOF", "EndOfFile")

Dll 을 이용했기 때문에 위 경로에 있어야하는 것은 당연한 일 ~~

 

데이터는 RecPtr 을 이용하여 리턴하는데 쓰는 법은 여기저기서 찾아보심 빠를 듯하네여 ^0^

 

시간되면 RecPtr 사용법 설명도 올릴께요 ^0^

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

선택한 폴더 아래 모든 파일 찾기

갑자기 개발 파일 목록화를 진행한단다.

 

내용이 너무 많아 하나하나 정리하기 힘들어

 

선택한 폴더 아래의 모든 파일을 찾아 파일로 저장하는 프로그램을 제작해 보았다.

 

선택한 폴더의 하위 폴더까지 검색하여 목록을 파일로 구분자는 TAB을 이용하여 저장하였다.

 

 

 

Open 버튼을 선택하면

 

파일 경로를 선택하는 찾이 뜬다

 

창은  SHBrowseForFolder 사용


/************************************************************************/
/* 시작 폴더 Open                                                                              */
/************************************************************************/
void CFileAllLoadDlg::OnBnClickedButtonopen()
{
 /// 저장된 폴더 수량 초기화
 m_nFoldCount = 0;
 /// 파일 이름 count 초기화 (Message 리스트 수량)
 m_nIndexList = 0;
 ITEMIDLIST *pildBrowse;
 char pszPathname[MAX_PATH];
 BROWSEINFO bInfo;
 memset( &bInfo, 0, sizeof(bInfo));
 bInfo.hwndOwner = GetSafeHwnd();
 bInfo.pidlRoot = NULL;
 bInfo.pszDisplayName = (LPSTR)(LPCWSTR)pszPathname;
 bInfo.lpszTitle = _T("디렉토리를 선택하세요");
 bInfo.ulFlags = BIF_RETURNONLYFSDIRS;
 pildBrowse = ::SHBrowseForFolder(&bInfo);

 if(pildBrowse != NULL)
 {
  /// Open 한 폴더 열기
  SHGetPathFromIDList(pildBrowse, (LPTSTR)pszPathname);
  (LPCTSTR)pszPathname;

  CString strPathName = (LPCTSTR)pszPathname; //dlgFile.GetPathName();
  /// 폴더 Open 실패
  if(strPathName == "")
   return;

  /// 폴더 이름 저장
  m_LISTDIR.push_back(strPathName);
  GetFileNameData();
  /// Open 프로그래스 위치
  m_ctrPrograssOpen.SetPos(1);
 }
}

 

http://tong.nate.com/gabester/24397313 내용 참조

 

CFileFind 를 이용하여 폴더의 내용 검색

 

하위 폴더는 따로 List 에 입력하여 관리

 


/************************************************************************/
/*  파일 이름 찾기                                                               */
/************************************************************************/
void CFileAllLoadDlg::GetFileNameData()
{
 LISTDIR::iterator iter;

 iter = m_LISTDIR.begin();
 CString strPath = (*iter);
 /// 파일 객체 생성
 m_pFileFind = new CFileFind;
 CString strFolderTemp = strPath+_T("\\*.* ");

 m_ctrDirPas.SetWindowText(strFolderTemp);
 m_ctrDirPas.UpdateWindow();
 /// 파일 읽기
 BOOL bWorking = m_pFileFind->FindFile(strFolderTemp);
 if(bWorking == TRUE)
 {
  m_nTime = SetTimer(1, 300, 0);
 }
}

 

파일은 바로 저장 및 메시지로 표시

 

Timer 를 이용하여 파일 내용 검색

   BOOL bWorking = m_pFileFind->FindNextFile();
   int nCount = (int)m_LISTDIR.size();
   /// 선택한 다름파일 이없는 경우 삭제
   if(bWorking == FALSE)
   {
    m_nFoldCount = m_nFoldCount+1;
    int nState =(100*m_nFoldCount)/nCount;
    m_ctrPrograssOpen.SetPos(nState-1);

    KillTimer(m_nTime);
    m_pFileFind->Close();
    delete m_pFileFind;
    m_pFileFind = NULL;
    m_LISTDIR.pop_front();
    CheckFolder();

    break;
   }
   
   /// 점인경우
   if(m_pFileFind->IsDots())
    break;

   CString strStateFolder = m_pFileFind->GetFilePath();
   /// 내부 폴더인경우
   if(m_pFileFind->IsDirectory())
   {
    CString strFolder = m_pFileFind->GetFilePath();
    /// 폴더 저장
    m_LISTDIR.push_back(strFolder);
   }
   else
   {
    CString strFileNameTemp = m_pFileFind->GetFileName();
    int nfindFile = strFileNameTemp.ReverseFind('.');
    int nTotalFile = strFileNameTemp.GetLength();
    CString strLoadFile = strFileNameTemp.Left(nfindFile);
    CString strFileT = strFileNameTemp.Right(nTotalFile-nfindFile);

    m_nIndexList = m_nIndexList+1;
    CString strFolder = m_pFileFind->GetFilePath();
    int nFind = strFolder.ReverseFind('\\');
    strFolder = strFolder.Left(nFind);
    CString strIndex;
    strIndex.Format("%d", m_nIndexList);

    strFolder = strIndex+"  "+strFolder+" "+strLoadFile+" "+strFileT;
    m_pCMultiFileControl->WriteFileData("FileLoad.ini", (LPTSTR)(LPCTSTR)strFolder, m_nIndexList, WRITE_INSERTLINE);
    TRACE(_T("%s\n"), strFileNameTemp);

    if(m_ctrListMessage.GetCount() > 50 )
     m_ctrListMessage.DeleteString(0);

    m_ctrListMessage.AddString(strFolder);
    //   m_ctrListMessage.SetSel(m_ctrListMessage.GetCount()-1, TRUE);
    m_ctrListMessage.UpdateWindow();
   }

 

저장된 List 이용 하위 폴더 확인


/************************************************************************/
/* 하위폴더 여부 확인                                                             */
/************************************************************************/
void CFileAllLoadDlg::CheckFolder()
{
 int nCont = (int)m_LISTDIR.size();
 if( nCont > 0)
 {
  /// 하위폴더가 있을시
  GetFileNameData();
 }
 else
  m_ctrPrograssOpen.SetPos(100);
}

 

첨부 내용은 디버거 버전의 Install 프로그램 ^^

 

소스코드는 요청해주시면 바로 올리겠습니다.



출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

Visual Studio 에서 Warning LNK4070 오류

 

Output File Name를 바꾸면  Warning이 발생한다.

 

처리방법은 def파일을 변경해주면된다.

 

Output File Name와 동일하게 projectName을 변경해준다.

 

; projectName.def : Declares the module parameters for the DLL.

LIBRARY      "projectName"

EXPORTS
    ; Explicit exports can go here

출처 :

 

http://blog.naver.com/lantis00?Redirect=Log&logNo=70022613729

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

CFont 사용

파라미터가 너무 많아 잘잊어 버리는 거. ^0^

 

// The code fragment shows how to create a font object,
// select the font object into a DC (device context) for text
// drawing, and finally delete the font object.

// Initializes a CFont object with the specified characteristics.
CFont font;
VERIFY(font.CreateFont(
   12,                        // nHeight
   0,                         // nWidth
   0,                         // nEscapement
   0,                         // nOrientation
   FW_NORMAL,                 // nWeight
   FALSE,                     // bItalic
   FALSE,                     // bUnderline
   0,                         // cStrikeOut
   ANSI_CHARSET,              // nCharSet
   OUT_DEFAULT_PRECIS,        // nOutPrecision
   CLIP_DEFAULT_PRECIS,       // nClipPrecision
   DEFAULT_QUALITY,           // nQuality
   DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
   _T("Arial")));                 // lpszFacename

// Do something with the font just created...
CClientDC dc(this); 
CFont* def_font = dc.SelectObject(&font);
dc.TextOut(5, 5, _T("Hello"), 5);
dc.SelectObject(def_font);

// Done with the font.  Delete the font object.
font.DeleteObject();

 

# 출처 : MSDN

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

ADO를 이용한 MDB 파일 읽기

중요 소스만 ..........

 

/// 선언

#import "C:/program files/common files/system/ado/msado15.dll" rename("EOF", "EndOfFile")

typedef ADODB::_RecordsetPtr  RecPtr;
typedef ADODB::_ConnectionPtr CnnPtr;
typedef ADODB::_CommandPtr ComPtr;

 

/// 생성

m_pconnection.CreateInstance(__uuidof(ADODB::Connection) );

 

/// DB Open

m_pconnection->Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source= aaa.mdb;", "", "", -1)

 

/// cursor 위치

m_pconnection->CursorLocation = ADODB::adUseClient;

/// Query 입력 실행

CString strQuery;

RecPtr recPtr = NULL;

recPtr = m_pconnection->Execute(strQuery, NULL, ADODB::adOptionUnspecified); // 쿼리 실행

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

CScrollView 생성

 

/// Scroll 이 생성될 크기

/// View 가 생성되면 서 일정한 Rect를 가지게 되는게

/// 그 Rect 보다 큰 값을 넣으면 Scroll 이 생성된다.

 

 CSize sizeTotal;
 sizeTotal.cx = 768;
 sizeTotal.cy = 1024;
 SetScrollSizes(MM_TEXT, sizeTotal);

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통