GSI

사용자 삽입 이미지

CStatic를 사용한 Outlook 스타일의 컨트롤
해당 아이템을 누르면 뒤에 있는 아이템은 아래로 내려간다.
아이템헤더의 구조체를 Link 구조의 형태로 구성해서 처리 하였다.

더 추가되어야할 것은 에니메이션 처리 되는 형태와
아이템이 펼쳐 지면 해당 아이템의 내용이 표시되어야 한다.
이 부분은 ListCtrl로 처리 하면 될듯 하다.

소스코드 :

Posted by gsi
:

사용자 삽입 이미지

해당 이미지의 특정 칼라의 외곽픽셀을 선별해서 최대, 최소 사각형을 구하는 프로그램을
구성중에 있습니다.
아무래도 이것을 사용할 수 있는 용도가 어떤게 있을지는 모르지만.

개선해야될 부분도 많으며, 가운데가 비어 있는 이미지의 경우 오류가 조금 나기도 한다.

앞으로 테스트로 몇가지 더 해볼만한 프로그램이 될듯..

소스코드 :



혹 필요하신분은 받아 가세요 ^^..
Posted by gsi
:

ListCtrl의 LPARAM의 포인터 변수 지우는 방법!!

가끔 생각해 보면 참 바보 같다는 생각이 든다.
기존의 작업 스탈을 보면 ListCtrl의 하나하나의 열에 해당 포인터 변수를 추가해서
사용하게 되는 경우가 많은데,
이때 포인터 변수이기 때문에 메모리를 소거해야 하는 부담감에 휩싸이게 된다.
하지만 난 이제까지 몰랐던것이다.. -.-;

ListCtrl의 흐름 자체를 말이다.

삭제를 할때 나는 해당 아이템을 DeleteItem(i); 이런식으로 하기 전에 사용자 데이터를
지워주어야 하는줄 알았다.
하지만 이 작업은 중간 중간 수정을 하거나 모두 지우거나 추가 하면서
몇가지 부수적인 작업패턴을 부적절하게 발생 시키게 된다.

하지만 이것은 아래의 함수에서 DeleteItem(), DeleteAllItem()을 할때 매번 호출 되는
오버라이드 함수가 있었다는 사실을 알게 되었다.

즉,
ON_NOTIFY(LVN_DELETEITEM, IDC_LIST_IMAGELIST, OnLvnDeleteitemListImagelist)
이 함수를 오버라이딩 해서 사용하게 되면 해당 아이템이 지워질때
이 함수가 호출 되게 된다. 다시 말해서 이 함수 안에서 해당 하는 아이템만
지워 주면 다른건 신경 쓰지 않아도 되는 것이다.


그렇다면 모두 지우는 과정에서는 어떻게 되는가 하고 모르는 분들이라면 질문을 할텐데요.
위의 함수가 그 개수만큼 호출 됩니다.

그래서 위의 함수에서 해당 데이터를 지워 주기만 하면 된다는 것이죠.
아래 처름요.

void CDlgProgrammingPage::OnLvnDeleteitemListImagelist(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
 
 // 메모리 삭제하기
 CString* pStr = (CString*)m_ImageList.GetItemData(pNMLV->iItem);  //<-- 이 부분은 작업자가 포함시킨 포인터 변수(가정)
 SAFE_DELETE(pStr);

 *pResult = 0;
}

Posted by gsi
:

가끔 테스트로 이름을 짰다가 다른 이름으로 변경하고 싶을때가 있는데요.
다 찾아서 하는것도 좋지만.
자동으로 바꿔 주는 프로그램이 있습니다.

VS 프로젝트 까지.. ^^

VSProjectRenamer :
Posted by gsi
:

원격지에 있는 파일의 사이즈 체크 하는 방법

DWORD GetUrlFileLength (CString url)
{
 DWORD filesize;

 TCHAR   szCause[255];
 CString CauseOfError;
 TRY
 {
  CInternetSession session;
  CHttpFile *remotefile= (CHttpFile*)session.OpenURL(url,1,INTERNET_FLAG_TRANSFER_BINARY);
  TCHAR szContentLength[32];
  DWORD dwInfoSize = 32;
  DWORD dwFileSize = 0;
  BOOL bGotFileSize = FALSE;
  if (remotefile->QueryInfo ( HTTP_QUERY_CONTENT_LENGTH, szContentLength, &dwInfoSize , NULL))
  {
   bGotFileSize = TRUE;
   dwFileSize = (DWORD) _ttol(szContentLength);
   filesize = dwFileSize;// Return 값에 할당.
  }
  else
  { // 에러나 나서 파일이 없을경우에
   filesize = -1 ;
  }
  remotefile->Close ();
  session.Close ();
  delete remotefile;
  delete session;
 }

 CATCH_ALL(error)
 {
  AfxMessageBox ("서버로부터 파일 크기를 얻어오는 과정에서 에러발생");
  error->GetErrorMessage(szCause,254,NULL);
  CauseOfError.Format("%s",szCause);
  AfxMessageBox (CauseOfError);
 }
 END_CATCH_ALL;

 return filesize;
}

원격지에 있는 파일 다운로드 받기

void DownloadUrlFileBuffer (CString url)
{
 DWORD dwServiceType = AFX_INET_SERVICE_HTTP;
 CString szServer, szObject, szInfo;

 INTERNET_PORT nPort;
 INTERNET_PROXY_INFO m_proxyinfo;

 CInternetSession m_SessionDownload;
 CHttpConnection* m_pConnection = NULL;
 CHttpFile* m_pHttpFile = NULL;
 CFile FileWrite;

 DWORD d_BytesRead=0;
 DWORD d_FileSize=0;

 char szHTTPBuffer[199926];

 ZeroMemory(szHTTPBuffer, sizeof(szHTTPBuffer));

 //start Download Routine
 ::AfxParseURL(url.GetBuffer(url.GetLength()), dwServiceType, szServer, szObject, nPort);

 try
 {
  m_pConnection = m_SessionDownload.GetHttpConnection(szServer,INTERNET_FLAG_KEEP_CONNECTION, nPort,NULL, NULL);
  m_pHttpFile= m_pConnection->OpenRequest("GET",szObject,NULL,0, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION);
 }
 catch(CInternetException* m_pException)
 {
  //exception found
  //lots of clean up code
  return;
 }

 if(m_pHttpFile)
 {
  if(!FileWrite.Open("d:\\aaa.gif", CFile::modeCreate | CFile::modeReadWrite | CFile::shareDenyNone ))
  {
   //exception found
   //lots of clean up code
   return;
  }

  try
  {
   m_pHttpFile->SendRequest(NULL);
  }
  catch(CInternetException* m_pException)
  {
   //exception found
   //lots of clean up code
   return;
  }

  m_pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, d_FileSize);
  m_pHttpFile->QueryInfo(HTTP_QUERY_MAX, szInfo);

  while(d_BytesRead = m_pHttpFile->Read((void*)szHTTPBuffer,199926))
  {
   FileWrite.Write((void *)szHTTPBuffer,d_BytesRead);
   memset(szHTTPBuffer, 0, sizeof(szHTTPBuffer));
  }

  szServer.Empty();
  szObject.Empty();

  m_SessionDownload.Close();
  m_pConnection->Close();
  m_pHttpFile->Close();

  delete m_SessionDownload;
  delete m_pConnection;
  delete m_pHttpFile;

  FileWrite.Close();
 }
}

위에 있는 FileWrite 부분이 그 부분이며, 이 부분을 해당 프로젝트에 맞도록 고쳐야 할 것이다.
Posted by gsi
: