MFC에서 타이틀 변경은 어떻게 하나요?

메인 프레임의 타이틀은 변경을 해도
다른 작업을 하면 다시 원래대로 돌아갑니다.

"프로젝트이름 - 문서이름"

이렇게 되는데
바꾸려면 어떻게 하나요?

MFC용 ADO클래스

최신 포스트가 있습니다.
보시려면 여기를 클릭하세요.

-----------------------------------------------------------------------

MFC에서 DB를 연동하는 경우는 드문경우 입니다만,
공부를 목적으로 허접한 클래스 하나 만들어 봤습니다.

ADO가 성능면에서 떨어진다고는 하지만
ODBC셋팅이 별도 필요 없고, 소규모의 간단한 DB작업엔
괜찮을것 같아서 작업했습니다.

보시면 아시겠지만 가장 기초적인 작업만 할 수 있는 클래스 이구요
생성하면 커넥션을 엑티비티하는것이 아니고, Open으로 쿼리를 날리고,
그때마다 커넥션을 하므로 성능을 저하시키는 단점이 있습니다.
(차후 보완해야할 점입니다)


[CAdoDB.h] =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#pragma once

#import "C:program filescommon filessystemadomsado15.dll"
               no_namespace
               rename("EOF", "adoEOF")

class CAdoDB
{
public:
       CAdoDB(void);
       ~CAdoDB(void);
       BOOL Init(CString Filename);
       BOOL Open(CString sql, CString Filename = _T(""));
       BOOL IsEOF();
       CString GetValueString(CString Field);
       BOOL MoveNext();
       BOOL Close();

private:
       _RecordsetPtr m_pRs;
       CString m_strConnection;
       BOOL m_IsOpen;
};



[CAdoDB.cpp] =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#include "StdAfx.h"
#include "adodb.h"

CAdoDB::CAdoDB(void)
{
       if ( FAILED(m_pRs.CreateInstance(__uuidof(Recordset))) )
               AfxMessageBox(_T("com 객체 생성에 실패 하였습니다."), MB_OK, NULL);

       m_strConnection = _T("");
       m_IsOpen = FALSE;
}

CAdoDB::~CAdoDB(void)
{
}

BOOL CAdoDB::Init(CString Filename)
{
       if ( m_pRs==NULL )
               return FALSE;

       m_strConnection = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=") + Filename;

       return FALSE;
}


BOOL CAdoDB::Open(CString sql, CString Filename)
{
       HRESULT hr;

       if ( m_pRs==NULL )
               return FALSE;

       Close();

       if ( Filename.IsEmpty() && m_strConnection.IsEmpty() )
               return FALSE;

       m_strConnection = (Filename.IsEmpty())?(m_strConnection):(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=")+Filename);

       try
       {

               hr = m_pRs->Open( (LPTSTR)(LPCTSTR)sql, (LPTSTR)(LPCTSTR)m_strConnection,
                                                 adOpenForwardOnly, adLockOptimistic, adCmdUnknown);
       }
       catch(_com_error &e)
       {
               TRACE(" Description: %s
", (LPCTSTR) e.Description());
       }
       catch(...)
       {
               TRACE("*** Unhandled Exception ***");
       }

       if ( SUCCEEDED( hr ) )
               m_IsOpen = TRUE;

       if ( sql.TrimLeft().Left(7).CollateNoCase( "SELECT " ) )
       {
               m_IsOpen = FALSE;
       }

       return SUCCEEDED( hr );
}

BOOL CAdoDB::IsEOF()
{
       if ( !m_IsOpen )
               return TRUE;

       return (BOOL)m_pRs->GetadoEOF();
}

CString CAdoDB::GetValueString(CString Field)
{
       if ( !m_IsOpen || IsEOF() )
               return "";

       _variant_t vt = m_pRs->GetCollect( (LPTSTR)(LPCTSTR)Field );

       return ( (vt.vt == VT_NULL)? ("") : vt );
}

BOOL CAdoDB::MoveNext()
{
       if ( !m_IsOpen )
               return FALSE;

       HRESULT hr = m_pRs->MoveNext();

       return SUCCEEDED( hr );
}

BOOL CAdoDB::Close()
{
       if ( !m_IsOpen )
               return TRUE;

       m_IsOpen = FALSE;

       return SUCCEEDED( m_pRs->Close() );
}

Http프로토콜을 이용한 파일 다운로드

[CODE type=c++]
//-------------------------------------------------------------------------------------//
// Function    : GetFile
// Parameter: LPCTSTR url, LPCTSTR filename
// Return    : CString            
//            - 성공하면 "YES" 실패하면 에러메시지를 반환
// Note        : url의 파일을 받아서 filename에 저장한다.
//            LPCTSTR url      - http프로토콜을 이용해 받아올 파일의 전체경로
//            LPCTSTR filename - 파일을 저장할 local경로
//-------------------------------------------------------------------------------------//
CString CInternetImageCtrl::GetFile(LPCTSTR url, LPCTSTR filename)
{
  HINTERNET hInternet, hURL;

  // 연결
  hInternet = InternetOpen( L"HTTPFILE", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

  if ( hInternet == NULL )
     return L"인터넷이 연결되어 있지 않습니다.";

// url
  hURL = InternetOpenUrl( hInternet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
  if ( hURL==NULL )
  {
     InternetCloseHandle( hInternet );
     return L"서버오류로 연결할 수 없습니다.";
  }

  // 연결정보 확인
  TCHAR szStatusCode[10000];
  DWORD dwInfoSize = 10000;
  HttpQueryInfo(hURL, HTTP_QUERY_STATUS_CODE, szStatusCode, &dwInfoSize, NULL);


  long nStatusCode = _ttol(szStatusCode);
  if (nStatusCode == HTTP_STATUS_OK)
  { // 정상

     //  local file 생성
     HANDLE hFile;
     hFile = CreateFile( filename, GENERIC_WRITE, 0, NULL,
                         CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );

     DWORD size;
     DWORD dwRead, dwWritten; //, Recv=0;
     char* buf = NULL;

     do
     {
        InternetQueryDataAvailable( hURL, &size, 0, 0 );
        buf = new char[size];
        InternetReadFile( hURL, buf, size, &dwRead );

        WriteFile( hFile, buf, dwRead, &dwWritten, NULL );
        delete buf;

     } while ( dwRead != 0 );

     CloseHandle( hFile );

  }
  else if (nStatusCode == HTTP_STATUS_NOT_FOUND)
  { // 404에러
     InternetCloseHandle( hInternet );
     InternetCloseHandle( hURL );
     return L"그림이 준비되지 않았습니다";
  } else
  { // 그외의 에러..
     InternetCloseHandle( hInternet );
     InternetCloseHandle( hURL );
     CString str;
     str.Format( L"Unknown Error
Err code : %d", nStatusCode);
     return str;
  }

  InternetCloseHandle( hInternet );
  InternetCloseHandle( hURL );

  return L"YES";
}


[/HTML][/CODE]

Http프로토콜을 이용한 파일 업로드

http서버에 올리는 소스이기 때문에
당연히 서버에 업로드 권한이 있어야 합니다.

[CODE type=c++]



void HttpPutFile(LPCTSTR wszServerURL, LPCTSTR wszRemoteFilePath,
                      LPCTSTR wszLocalFilePath, TCHAR nPort,
                      LPCTSTR wszLoginUserID, LPCTSTR wszLoginPassword )
{
/*
       TCHAR wszServerURL[100]         = L"solergy.com";
       TCHAR wszLocalFilePath[100]     = L"\Program Files\hanaro\Sign_AS\7250.bmp";
       TCHAR wszRemoteFilePath[100]  = L"/hanaro/sign/as/7250.bmp";
       TCHAR wszLoginUserID[100]       = L"";
       TCHAR wszLoginPassword[100]  = L"";
       TCHAR nPort                              = 80;
*/
       HINTERNET hInternet, hURL, hRequest;

       // 연결
       hInternet = InternetOpen( L"HTTPFILE", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
       if ( hInternet == NULL )
       {
               MessageBox( NULL, L"인터넷이 연결되어 있지 않습니다.", L"Warning", MB_OK);
               return;
       }

       // url
       hURL = InternetConnect( hInternet, wszServerURL, nPort,
                                                       wszLoginUserID, wszLoginPassword,
                                                       INTERNET_SERVICE_HTTP, 0, 0);
       if ( hURL==NULL )
       {
               InternetCloseHandle( hInternet );
               MessageBox( NULL, L"서버오류로 연결할 수 없습니다.", L"Warning", MB_OK);
               return;
       }

       INTERNET_BUFFERS        iBuf = {0};
       iBuf.dwStructSize = sizeof( INTERNET_BUFFERS );

       hRequest = HttpOpenRequest( hURL, L"PUT", wszRemoteFilePath, NULL, NULL, NULL, 0, 0 );
       if ( !hRequest )
       {
               InternetCloseHandle( hURL );
               InternetCloseHandle( hInternet );
               MessageBox( NULL, L"Request open Failed", L"Warning", MB_OK);
               return;
       }

       //  local file 오픈
       HANDLE hFile;
       hFile = CreateFile( wszLocalFilePath, GENERIC_READ, FILE_SHARE_READ, NULL,
                                               OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
       if ( hFile == INVALID_HANDLE_VALUE )
       {
               MessageBox( NULL, L"Invalid read File", L"warning", MB_OK);
               InternetCloseHandle( hRequest );
               InternetCloseHandle( hInternet );
               InternetCloseHandle( hURL );
               return;
       }


       DWORD dwWritten;
       DWORD dwFileSize, dwFilePos=0, dwRead;

       dwFileSize = GetFileSize( hFile, NULL );
       iBuf.dwBufferTotal = dwFileSize;

       if( !HttpSendRequestEx( hRequest, &iBuf, NULL, HSR_INITIATE, 0 ) )
       {
               MessageBox( NULL, L"SendRequest Failed", L"warning", MB_OK);
               CloseHandle( hFile );
               InternetCloseHandle( hRequest );
               InternetCloseHandle( hInternet );
               InternetCloseHandle( hURL );
               return;
       }

       char buf[512];
       DWORD cnt=0;
       dwFilePos = 0;
       do
       {
               SetFilePointer( hFile, dwFilePos, NULL, FILE_BEGIN );
               if( !ReadFile( hFile, buf, sizeof(buf), &dwRead, NULL) )
               {
                       MessageBox( NULL, L"Local File read error", L"Warning", MB_OK);
                       break;
               };

               InternetSetFilePointer( hRequest, dwFilePos, NULL, FILE_BEGIN, 0 );
               if( !InternetWriteFile( hRequest, buf, dwRead, &dwWritten ) )
               {
                       MessageBox( NULL, L"Remote File write error", L"Warning", MB_OK);
                       break;
               };
               dwFilePos += dwWritten;

       } while ( dwRead == sizeof(buf) );


       CloseHandle( hFile );

       if( !HttpEndRequest( hRequest, NULL, 0, 0 ) )
       {
               MessageBox( NULL, L"EndRequest Failed", L"warning", MB_OK);
       }

       InternetCloseHandle( hRequest );
       InternetCloseHandle( hInternet );
       InternetCloseHandle( hURL );

}

[/HTML][/CODE]



EVC에서 다이얼로그에서 메인프레임의 타이틀 바꾸기..

여러 다이알로그를 띄우는 프로그램의 경우
그때그때마다 타이틀의 내용을 바꾸고 싶을때가 있습니다.
그런데 제가 아직 허접해서.. 쉽질 않더군여.. ㅡ.ㅡ
타이틀을 바꾸어도 포커스가 뷰로 옮겨가버리구여..

그래서 쉽게 바꿀 수 있는 방법을 생각해 봤습니다.

먼저. 메인프래임의 해더파일에 다음을 추가합니다.

public:
inline void SetFrameTitle(CString str) { SetWindowText( str ); };


그리고, 어디서든 참조하기 쉬운 해더파일에..
stdafx.h같은 곳에..

다음 코드를 추가합니다.
#define _SetTitle(str) { ((CMainFrame*)AfxGetMainWnd())->SetFrameTitle( (str) ); ::SetActiveWindow ( AfxGetMainWnd()->m_hWnd ); SetActiveWindow(); }

이렇게 하구나서.
무슨 다이알로그던 타이틀을 바꾸고 싶으면.
_SetTitle( _T("바꾸고 싶은 타이틀") );
이렇게만 코딩해 주면 됩니다.

일단 전 이렇게 구현했는데...
더 좋은 방법 있으시면 알려주세요.

좋은 시간 되세요. ^^

컴파일시 꼬이는 헤더파일 방지..

#if !defined(HEADERFILE)

#define HEADERFILE


class MyClass
{
... . .. . .
. . . . . .
}

--- 해더 파일의 내용 ---


#endif

---------------------------------------------------------

이렇게 해주면 HEADERFILE라는 키워드가 define되어 있으면
#if ~~ #endif 안의 내용은 컴파일 되지 않습니다.
처음 한번만 컴파일하고, 다시는 컴파일 하지 않게 되는거죠.
그래서 해더파일이 꼬여있어도 에러를 발생하지 않습니다.

보통 위저드를 통해 클래스를 생성하면
HEADERFILE라는 키워드 대신.
클래스이름과 UUID가 조합되어 생성되더군요.

즐프~

레지스트리, ini파일 간단히 사용하기.

SetRegistryKey(_T("회사명")); 가 선언되어 있는 경우
(App 클래스의 Initinstance함수에 선언됨)

HKEY_CURRENT_USER->Software->회사명->프로그램명 안에
WriteProfileString(섹션, 엔트리, 값) 함수로 문자열값을 쓰거나
CString str = GetProfileString(섹션, 엔트리, 디폴트값) 함수로 문자열값을 가져올 수 있다.

SetRegistryKey()가 선언되어 있지 않다면, 실행화일과 동일한 이름에 확장자가 .ini형태로 \windows 폴더 밑에 INI파일이 생성되어 관리된다.


<출처>
http://www.dotnetx.info/


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

제가 실제 사용해 보니.
SetRegistryKey, WriteProfileString등의 함수가.
app의 맴버더군요.
app 클래스를 참조 하여 사용 하셔야 합니다.