익스플로러에서 새창으로 창을 열때 최대화를 시켜주는 파일...

아래는 제작자가 쓴 설명...

1.0 버전 (DLL 파일)

링크를 클릭해서 새창이 열린경우 IE가 죄대화 창으로 열리지 않죠. 일일이 최대화 시키기 귀찮아서 만들어 봤습니다.

설치는
첨부한 파일을 windows 폴더에 넣으시고 실행창에서
regsvr32 IEMaximizer.dll

삭제는
regsvr32 /u IEMaximizer.dll
한후 파일 삭제해 주시면 됩니다.

IE 새창이 특정 사이즈로 고정돼 띄워질 때(예:팝업창)는 전체 창으로 띄우지 않고 원래 상태 그대로 띄우도록 했습니다.


1.5 버전(설치 파일)

링크를 클릭해서 새창이 열린경우 IE가 죄대화 창으로 열리지 않죠. 일일이 최대화 시키기 귀찮아서 만들어 봤습니다.
IE 새창이 특정 사이즈로 고정돼 띄워질 때(예:팝업창)는 전체 창으로 띄우지 않고 원래 상태 그대로 띄우도록 했습니다.

개선점은
* 윈도업데이트 페이지나 프로그램이 설치되면서 생기는 홈피링크 클릭시에도 전체창으로 띄워지도록 했습니다.
* 최대화시 보통창에서 최대화 창으로 변하는 모습이 보였는데 이제는 바로 최대화 창으로 뜨도록 했습니다.
* 설치 파일 형태로 제공됩니다.


출처 : http://www.mizniz.net

Posted by Gungume
,

예전에 급조해서 만든 리네이머에서 일련번호 관련 소스이다...

여기서 일련번호란 사용자가 변경할 파일명을 "File ## Name ###" 이라고 입력한다면..."File 01 Name 001", "File 02 Name 002", "File 03 Name 003" 형식으로 번호가 증가되는 것을 의미한다...

파일명 중간에 임의의 일련번호 기호인 '#'을 넣어도 위와 같이 일련번호가 생성되는 방법으로 구현하느라 머리 좀 썼다...머 일련번호가 보통 파일명 끝에만 붙지만 중간에 넣어도 작동되게 한 이유는....알씨에서 파일명 일괄변경 할때 저런것도 되길래 나도 그냥 해봤다 ㅡㅡ;

알고리즘(?)의 기본 원리는 별거 없다...그냥 사용자가 일련번호 기호를 포함한 변경할 파일명을 전부 입력했다면 그냥 문자열 길이만큼 루프를 돌면서 문자 하나씩 비교를 한다..

일반 문자이면 결과변수에 값을 넣고 만약에 '#'이라면 연속되는 '#'의 갯수를 파악해서 CString클래스의 Format() 함수를 이용해서 일련번호를 만든후 이 값을 결과변수에 넣었다...

이 간단한거를....하루죙일 생각해서야 만들었다...

더 큰 문제(?)는 루프를 너무 많이 돈다...초기에 한번만 반복하고 이후에는 숫자만 바꿔주면 될듯한데 도저히 방법이 안 떠오른당 ㅡㅡ;

아래는 리네이머에 있는 일련번호 관련 풀소스이다...

리스트컨트롤에 있는 데이터 갯수만큼 반복문을 돌면서 하나씩 이름을 바꾸는거다...

파일명 변경후에는 원본 파일의 확장자를 따로 파싱해서 붙여버리는 형식이다...

막코딩하다가 만들어진 알고리즘이라 주석을 심하게 달아놓음 ㅡㅡ;

void CRenamerDlg::OnEnChangeEditRename()
{
	// 입력한 형식데로 파일명 변경...일련번호 포함
	UpdateData(TRUE);
	CString strData = m_strRename; // 사용자가 입력한 변경할 파일명
	CString strTmp = _T("");  // 파일명 변경에 필요한 임시 변수
	CString strResult = _T("");  // 최종적으로 변경할 파일명
	
	int nTotalCnt = 1;  // 일련번호 카운터
	int nLength = 0;  // 각각의 일련번호 자릿수
	char ext[32];   // 파일경로에서 확장자만 따로 저장
	
	// 리스트컨트롤에 있는 모든 데이터에 대해 반복...
	for(int i=0; i<m_listCtrl.GetItemCount(); i++)
	{
		// 변경할 파일명의 길이만큼 반복...
		// 기본 로직은 일반 문자열과 일련번호인 #을 구분해서 
		// strResult에 계속 저장...
		for(int j=0; j<strData.GetLength(); j++)
		{
			// 한 문자씩 불러와서 # 문자인지 여부 판단
			// # 문자인경우 연속적으로 몇개 붙어있는지 판단
			// 연속적으로 붙어있는 갯수가 곧 일련번호의 자리수
			// 예 Test ### -> Test 001
			if(strData.GetAt(j) == '#')
			{
				while(strData.GetAt(j) == '#')
				{
					nLength++; // #문자 갯수 증가
					j++;  // 연속된 문자 판단위해 다음 문자로 이동
				}
				// while문 내에서 j값을 통해 다음 문자로 이동후에 비교를 하므로...
				// while문 탈출후 다시 위의 for문으로 돌아가면...
				// 다음, 다음 문자로 이동하므르로 문자 하나가 비교가 안되기에
				// j값 1 감소시킴
				j--;
				
				// 일련번호 완성
				strTmp.Format("%0*d", nLength, nTotalCnt);
				nLength=0;
				
				// strResult에 일련번호 데이터 추가
				strResult += strTmp;
			}
			else
			{
				// strResult에 단순 문자값 추가
				strResult += strData.GetAt(j);
			}
		}
		// 이곳까지오면 변경할 확장자가 없는 파일명 완성
		// 리스트컨트롤의 0번 칼럼은 Drag & Drop를 이용 데이터를 추가할때
		// 각 파일의 절대경로가 들어가 있음...
		// 이 정보 이용 각 파일의 확장자를 얻어올 수 있음...
		// 위에서 얻은 변경할 파일명과 원본 파일의 확장자를 합쳐서...
		// 변경할 파일명 최종 완성
		_splitpath(m_listCtrl.GetItemText(i, 0), NULL, NULL, NULL, ext);
		strResult+=ext;
		
		// 변경할 파일명을 3번 칼럼에 삽입
		m_listCtrl.SetItem(i, 3, LVIF_TEXT, strResult, NULL, NULL, NULL, NULL);
		
		strResult.Empty();
		nTotalCnt++;
	}
}

Posted by Gungume
,

ZemnaExplorer

자료실 2006. 10. 2. 22:07



Zemna Explorer

데브피아에서 퍼온 자료...

"이 폴더로 명령프롬프트 열기" 기능 때문에 포맷후 항상 사용한다...

닷넷 2003에서 코딩한것 같은데 관련 DLL 파일이 있어야 실행되는 듯 하다...


출처 : 데브피아 -> 고생하는 개발자들을 조금이나마 편하게... 'ZemnaExplorer' 입니다.
Posted by Gungume
,

Windows Script 5.6

자료실 2006. 10. 2. 21:57



마소에서 제공하는 윈도우 기반 스크립트 엔진...

원래 뭐를 목적으로 만들었는지는 모르겠지만,스크립트 오류 등으로 인해 웹상에서 로그인 등이 안될 때 설치해주면 된다...ㅡㅡ;
Posted by Gungume
,




Microsoft Virtual Machine

Posted by Gungume
,

Renamer.exe

파일명 일괄변경 프로그램



개인적으로 사진파일의 이름을 변경할때 쓰려고 급히 만든 파일명 일괄변경 프로그램...ㅡㅡ;

특별한 기능 없이 Drag & Drop를 이용 리스트컨트롤에 이름을 변경할 파일을 추가시키고 에디트박스에 일괄변경할 이름과 일련번호를 붙혀주면 파일명 부분만 변경하는 프로그램...

폴더는 목록에 추가되지 않고 파일의 확장자는 구분없이 목록에 추가되지만 특별한 기능 없이 파일명만 변경시키므로 목적에 따라 그림파일, 음악파일 등 나름데로 분류를 정해서 사용하는게 좋음...

개인사용 목적으로 만든거라서 딱히 rename() 함수에 대한 에러처리는 안함;;;


XP 스타일 버튼 클래스 출처 : http://www.softechsoftware.it/cxpstylebuttonst.html
Source: https://github.com/gungume/Renamer/releases/tag/0.1
(사용언어 및 제작툴 : MFC / VS2003)


최신버전 받기


Posted by Gungume
,




Drag & Drop 되는 리스트컨트롤


서브클래싱을 통해서 Drag&Drop이 되는 리스트컨트롤을 만드는 방법...

일단 서브클래싱을 하기 위해서 CListCtrl을 상속 받은 클래스 생성...

Drag&Drop을 할때 발생되는 메시지인 "WM_DROPFILES"과 관련된 함수인 "OnDropFiles()" 함수를 오버라이딩 한다...

"OnDropFiles()" 안에서 다음 과정을 통해 Drag&Drop된 파일, 폴더의 기본적인 정보를 얻을 수 있다...

일단 사용할 변수를 선언한다...
CHAR  szPath[1024];     // Drag&Drop된 파일, 폴더의 절대경로 저장
UINT  uiFileNum;            // Drag&Drop된 파일, 폴더의 갯수 저장

아래와 같은 방법으로 DragQueryFile() 함수를 이용해서 기본적인 정보를 얻어올 수 있다.
uiFileNum = DragQueryFile(hDropInfo, 0xffffffff, NULL, 0);
for ( UINT i = 0 ; i < uiFileNum ; i++ )
{
     DragQueryFile(hDropInfo, i, (LPTSTR)szPath, 1023);
      // 데이터 처리...
}

소스를 대략적으로 보면 소스의 첫줄처럼 DragQueryFile() 함수의 매개변수를 주면 Drag&Drop된 파일, 폴더의 갯수를 얻어올 수 있다. (MSDN에 그렇게 나온다 ㅡㅡ;)

이렇게 얻어온 갯수로 반복문을 돌면서 반복문 안쪽의 DragQueryFile() 함수처럼 매개변수를 줌으로써 Drag&Drop된 파일, 폴더의 절대경로를 얻어올 수 있다...

이렇게 얻어온 정보를 이용 다양한 데이터 처리가 가능하다...

이렇게 만든 클래스를 CListCtrl로 선언된 객체에서 바꾸고 리스트컨트롤의 속성에서 "Accept Files"를 TRUE로 설정함으로서 사용가능하다...


기본 내용 출처 : 데브피아 -> [짱!!선임] 파일 드래그&드롭 리스트 컨트롤입니다.
(사용언어 및 제작툴 : MFC / VS2003)

Posted by Gungume
,

- 스타일 -
CListCtrl.SetExtendedStyle( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );

- 칼럼 초기화 -
CListCtrl.InsertColumn(0, "칼럼명", LVCFMT_LEFT, 100, -1);
(인덱스, 칼람명, 정렬방향, 칼럼길이, 서브아이템 갯수)

- 데이터 삽입 -
CListCtrl.InsertItem(nCnt, "문자열");
(인덱스, 삽입될 문자열)

- 서브아이템 추가 -
CListCtrl.SetItem(nCnt, 1, LVIF_TEXT, "문자열", NULL, NULL, NULL, NULL);
(인덱스, 서브아이템 인덱스, 데이터 형식, 삽입될 문자열, ~~~~)

Posted by Gungume
,

시스템 이미지 얻기

MFC/TIP 2006. 8. 25. 13:03




시스템 이미지 얻기

탐색기 등을 제작하다보면 각각의 파일이나 폴더에 대한 아이콘이 필요하게 된다.
이런 아이콘은 프로그램 제작시 리소스 등을 이용해서 미리 준비한 아이콘을 사용할 수도 있지만 현재 윈도우에서 사용하고 있는 각각의 파일과 폴더에 대한 아이콘을 얻어와서 사용할 수도 있다.
아래의 예는 시스템의 이미지를 얻어와서 리스트컨트롤에 데이터를 뿌려주는 것이다.

1. 우선 이미지 리스트 제작에 관련된 변수를 생성한다.
    CImageList * m_SmallImage;     // SMALL 이미지 리스트
    CImageList * m_LargeImage;     // LARGE 이미지 리스트
    HIMAGELIST hSystemSmall;     // SMALL 시스템 이미지 리스트
    HIMAGELIST hSystemLarge;     // LARGE 시스템 이미지 리스트
    SHFILEINFO shFileInfo;            // 선택된 파일 및 시스템 아이콘 정보

2. 다음으로는 CImageList 변수를 동적 할당 및 해제를 해준다...
    (물론 해제는 프로그램이 종료될 때 사용...)
    // 동적 할당 (초기화 관련 함수에서 코딩)
    m_SmallImage = new CImageList;
    m_LargeImage = new CImageList;

    // 메모리 해제 (OnClose() 함수 등에서 코딩)
    if(m_SmallImage != NULL)
         delete m_SmallImage;
    if(m_LargeImage != NULL)
         delete m_LargeImage;

3. 다음으로는 실제로 시스템 이미지를 얻어오는 과정이다...
  간략히 설명하면 일단 시스템이미지를 얻어온 후 그 정보를 이미지리스트에 등록하고 다시그 정보를 리스트 컨트롤에 등록하는 과정을 거친다.

    // 선택한 폴더내 "파일 & 폴더" 시스템 이미지 리스트 얻기
       (예제 소스는 단순히 'C:\'를 대상으로 했다...

    // 시스템 이미지 얻기
    ZeroMemory(&shFileInfo, sizeof(SHFILEINFO));
    hSystemSmall = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)"C:\\", 0, &shFileInfo,
                     sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
    hSystemLarge = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)"C:\\", 0, &shFileInfo,
                     sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON );

    // 시스템 이미지 이미지리스트에 등록
    m_SmallImage->Attach( hSystemSmall );
    m_LargeImage->Attach( hSystemLarge );

    // 이미지리스트 리스트컨트롤에 등록
    m_listCtrl.SetImageList(m_SmallImage, LVSIL_SMALL);
    m_listCtrl.SetImageList(m_LargeImage, LVSIL_NORMAL);

여기서 Small 이미지랑 Large 이미지가 있는데 리스트컨트롤 속성에 따라서 작은아이콘이랑 큰아이콘 두가지 경우가 존재하므로 두가지 모두 얻어오는것이다...
한가지만 필요하면 해당되는것 하나만 얻어오면 된다...
4. 위의 과정을 거치면 시스템의 이미지 리스트가 확보된다...
  이제 이것을 사용하려면 리스트컨트롤에 데이터를 삽입할 때 얻어온 이미지 리스트의 인덱스만을 넣어주면 된다...
   아래와 같이 사용을 한다...

    "LV_ITEM" 구조체를 이용해서 데이터를 삽입할 때 이미지 관련 부분에서 아래와 같이 사용
    ZeroMemory(&shFileInfo, sizeof(SHFILEINFO));
    SHGetFileInfo( (char*)(LPCTSTR)m_fileFinder.GetFilePath(), NULL,
                        &shFileInfo, sizeof(shFileInfo),
                        SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON);    
    lvItem.iImage = shFileInfo.iIcon;

(char*)(LPCTSTR)m_fileFinder.GetFilePath() -> 이 부분은 데모소스상에서 CFileFind 클래스를 이용한 부분으로서 얻어오고 싶은 파일이나 폴더의 경로가 된다....
반복문 등에서 지속적으로 호출해서 사용을 하면 된다...

5. 마지막으로 이미지 리스트를 해지해준다..
    m_SmallImage->Detach();
    m_LargeImage->Detach();

이 작업은 동적할당된 메모리 해지와 달리 시스템 이미지를 얻을때마다 해지를 시켜줘야 한다...
얻어온 이미지리스트를 해지하지 않은 상태로 다시 얻어오려고 하면 에러가 발생한다.

(사용언어 및 제작툴 : MFC / VS2003)

Posted by Gungume
,

CFileFind 클래스는 매개변수로 넘겨준 경로의 파일 및 폴더 등의 목록을 얻고 각각의 기본적인 정보를 얻어올 수 있는 클래스이다.

일단 CFileFind 클래스의 객체랑 결과값을 받을 변수를 선언한다.
CFileFind m_fileFinder;
BOOL bWorking;

파일과 폴더의 목록을 얻어올 때 매개변수로 넘겨준 경로부터 시작해서 FindNextFile() 멤버함수를 이용해서 계속 다음 파일로 접근하는 방식으로 코딩을 하면 되는데 보통 while()을 이용해서 무한루프를 사용한다.
이때 탈출조건이 필요하므로 BOOL형 변수가 필요하다.(자세한 것은 아래 소스를 통해서...)

가장 기본적인 사용법은 아래와 같다.
bWorking = m_fileFinder.FindFile("경로");
while (bWorking)
{
    bWorking = m_fileFinder.FindNextFile();
    // 얻어온 파일에 대해서 처리...
}
m_fileFinder.Close();

위의 소스를 설명하면 일단 매개변수로 경로가 들어간다...
예를 들면 "C:\\*.*" 이런식이다...
일단 경로를 표시하기 위해서 '\'가 아닌 '\\'임을 주의해야 되고, 와일드카드를 사용할 수 있으므로 보통 해당 경로내의 모든 목록을 얻고 싶으면 예제와 같이 원하는 경로 끝에 '*.*'를 써주면 된다...
당연히 특정 확장자만 얻고 싶으면 '*.bmp' 이런식으로 경로를 지정해주면 된다....

위의 예처럼 경로를 "C:\\*.*" 이렇게 설정해주면 'C:\' 의 모든 파일과 폴더 목록을 얻어온다....
이때 주의점은 기본 기능만으로는 일단 해당 경로만 접근이 되고 하위경로는 들어가지 않는다는 점(하위경로를 들어가려면 재귀함수 등 필요...)과 파일과 폴더를 따로 구분해서 불러오지는 않는다...(그냥 이름순으로 얻어온다...)

어쨌든 위와 같이 쓰면 FindNextFile() 멤버함수에 의해 지정된 경로의 모든 파일과 폴더의 정보를 얻어올 수 있다...
정보를 얻어오면 CFileFind 객체인 m_fileFinder을 이용해서 원하는 작업을 바로 바로 처리해 줄수 있다...
파일명, 액세스 타임 얻기 등의 작업이 가능한데....CRecordSet 클래스를 이용해서 DB를 처리하는것과 비슷하다...

모든 작업이 끝나고 해당 경로의 마지막 파일까지 접근했다면 FindNextFile() 멤버함수의 리턴값에 의해 while() 반복문을 종료한다...

이 클래스로 처리할 수 있는 대략적인 정보는 해당 파일이나 폴더의 이름, 전체경로, 크기, 최근 수정일 등의 기본적인 정보를 얻을 수 있다.

또한 현재 얻어온 정보가 폴더인지, 시스템파일인지, 읽기전용, 숨김파일 등등의 속성을 알수도 있다....

이런 정보를 얻어올 수 있는 멤버함수를 적절히 사용해서 얻어온 파일 목록에 대한 처리가 가능하다.

Posted by Gungume
,