오늘은 자바스크립트에서 정수부 또는 소수점  반올림 관련 함수에 대해 설명하고자 합니다.


당연히 Math.round 함수를 사용하면 되지만 좀 더 경우의 수가 많은 경우에도 문제없이 사용하려면 좀 다듬어서 함수를 만들어서 사용해야 합니다.



* 소스코드


// n : 수치

// digits : 자를 소수점 자리수

function RoundXL(n, digits) {


var str_n = String(n); //숫자를 스트링으로 변환 

str_n = replaceAll(str_n, ",", "");

var float_n = parseFloat(str_n);


        // 소수부 반올림

if (digits >= 0) return parseFloat(float_n.toFixed(digits)); 


        // 정수부 반올림 ( digit값이 - 이면 정수부 상위 부분이 반올림 )

digits = Math.pow(10, digits); 

var t = Math.round(float_n * digits) / digits;


return parseFloat(t.toFixed(0));

}


* 사용법


var aa = RoundXL(123,456, 2);    // result : 123.46

var aa = RoundXL(123,456, -1);   // result : 120



이 함수만 있으면 소수점이든, 정수든 원하는 위치에서 반올림이 가능합니다.















오늘은 자바스크립트에서 DoModal 을 사용하는 방법에 대해 설명하고자 합니다.


C++ 에서는 DoModal 함수가 있어서 Modal 방식의 창을 띄울 수 있는데


자바스크립트에서도 그와 같은 함수가 있습니다.


showModalDialog 라는 함수입니다. 이 함수를 좀더 쉽게 다룰 수 있도록 함수화 해서 만든게 있어서 알려드립니다. (IE기준)


* 소스코드


// parm_url : 호출할 페이지

// w : 가로크기 (px)

// h : 세로크기 (px)

function DoModal(parm_url, w, h)

{

var pop_layer = null;

var is_style="edge:raised;center:yes; dialogwidth:"+w+"px; dialogheight:"+h+"px; scroll:yes; resizable:no; status:no; select:yes;"; 

        // 창 틀의 두께를 의미하며, sunken이 두텁고, raised가 얇음. 

return showModalDialog(parm_url, window, is_style);

}


* 사용법


var mm = DoModal('modal.asp', 300, 400);


위 함수처럼 사용하시면 쉽게 모달을 구현할 수 있습니다.










오늘은 작업관리자에서 강제로 프로세스를 종료하는 방법이 있는데 이런 방법을 프로그램을 하는 것에 대해 설명하고자 합니다.


보통 메인 프로그램이 서브프로그램을 강제로 종료시킬 때 sendmessage 을 통해서 종료를 시키게 되는데 해당 프로그램이 lock이 걸렸거나 이벤트를 받지를 못하는 상황이 생겼을 때 위 메세지는 의미가 없게 된다.


그렇기에 강제로 프로세스를 종료를 시켜야 하는데 이에 사용한 함수를 소개 하고자 합니다.


** 소스코드


// CString strProcessName : 프로세스 파일명.확장자

BOOL Util::ProcessKill(CString strProcessName)

{

HANDLE hProcessSnap = NULL;

BOOL bRet = FALSE; 

PROCESSENTRY32 pe32 = {0}; 


hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

if (hProcessSnap == (HANDLE)-1) 

return false;

pe32.dwSize = sizeof(PROCESSENTRY32); 


//프로세스가 메모리상에 있으면 첫번째 프로세스를 얻는다

if (Process32First(hProcessSnap, &pe32)) 

BOOL bCurrent = FALSE; 

MODULEENTRY32 me32 = {0}; 


do { 

bCurrent = GetProcessModule(pe32.th32ProcessID,strProcessName);

if(bCurrent) { 

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); 

if(hProcess) {

if(TerminateProcess(hProcess, 0)) {

unsigned long nCode; //프로세스 종료 상태 

GetExitCodeProcess(hProcess, &nCode);

}

CloseHandle(hProcess); 

}

}

}

//다음 프로세스의 정보를 구하여 있으면 루프를 돈다.

while (Process32Next(hProcessSnap, &pe32)); 


CloseHandle (hProcessSnap); 

return true;

}



// 위 함수애서 호출되는 것으로 해당 프로세스아이디, 이름이 존재하는지 찾는다.'

// DWORD dwPID : 프로세스아이디

// CString sProcessName : 프로세스파일명.확장자

BOOL Util::GetProcessModule(DWORD dwPID, CString sProcessName)

{

HANDLE hModuleSnap = NULL;

MODULEENTRY32 me32 = {0};


hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID); 

if(hModuleSnap == (HANDLE)-1) 

return (FALSE); 

me32.dwSize = sizeof(MODULEENTRY32); 


//해당 프로세스의 모듈리스트를 루프로 돌려서 프로세스이름과 동일하면 

//true를 리턴한다.

if(Module32First(hModuleSnap, &me32)) { 

do { 

if(me32.szModule == sProcessName)

CloseHandle (hModuleSnap); 

return true;


while(Module32Next(hModuleSnap, &me32)); 


CloseHandle (hModuleSnap); 

return false;

}


* 사용법


BOOL ret = m_util.ProcessKill("aaa.exe");


작업관리자에서 보이는 파일명.확장을 인자로 넘기면 됩니다. 대소문자 구분도 하니 보이는 그대로 인자를 넘겨야 합니다.











오늘은 해당 프로그램이 실행중인지 확인하는 함수를 소개하고자 합니다.

보통 FindWindow 을 사용하면 되지만.. 부팅 시 자동실행이나 PC의 부하가 많은 상태에서는 FindWindow 로는 해당 window을 찾지 못하는 경우가 있습니다.

그래서 직접 작업관리자에서 해당 파일이 실행중인지 확인해서 해당 핸들을 얻는 방법이 가장 정확한 방법이기에 소개합니다.


보통 FindWindow 로 먼저 처리하고, 프로그램을 운영을 하면서 FindWindow 가 통과하는 경우가 발생하면 CreateToolhelp32Snapshot 울 이용을 하개 됩니다..




* 소스코드


// CString parm_exe : exe 파일명

// DWORD parm_id : 프로세스 아이디 (모르는 경우 -1 사용)

int Util::FindDoubleProcess(CString parm_exe, DWORD parm_id)

{

int ret_val = 0;

BOOL bGet = FALSE;

CString read_name;

CString parm_exe_lower = parm_exe;

HANDLE hSnapshot;

PROCESSENTRY32 ppe; //구성된 자료구조를 저장하기 위한 엔트리.



hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//system 프로세서(pid=0)의 상태를 읽어 온다

ppe.dwSize = sizeof(PROCESSENTRY32);    //엔트리 구조체 사이즈를 정해준다.

bGet = Process32First(hSnapshot, &ppe); //엔트리 중 자료를 가져온다.

parm_exe_lower.MakeLower();

while (bGet){

read_name = ppe.szExeFile;

read_name.MakeLower();

if( read_name == parm_exe && parm_id != ppe.th32ProcessID ){

int dd = ppe.th32ProcessID;

ret_val = 1; break;

}

bGet = Process32Next(hSnapshot, &ppe);

}


CloseHandle(hSnapshot);


return ret_val;

}


* 사용법

int ret = FindDoubleProcess("aaa.exe", -1);

위처럼 해당파일명이 존재하는지 찾게 됩니다. 
대소문자를 구분하게 되어서 호출 시 소문자로 전달해야 정확히 찾게 됩니다.

참 쉽죠~~










오늘은 윈도우 시스템의 바탕화면, quickLaunch, 시작메뉴  에 원하는 실행파일을 위한 단축아이콘 생성에 대한 통합 함수를 설명하고자 합니다.


아래 함수 하나면 원하는 위치에 생성할 수 있습니다. (win10 에서는 안해봐서 될지는 잘.. 해봐야 알 것 같네요..)


이 단축아이콘을 변경되는 경우는 PC을 재부팅해야 설정이 되더라구여..

원래는 아래 함수 후에 시스템에 notify 을 줘야 하는데 그 부분은 검색해 보시면 됩니다. 


* 소스코드


// LPTSTR pszFilePath : 실행파일경로  및 파일명.확장자

// LPTSTR pszTitle :  \\파일명.lnk

// LPTSTR pszDescription : 표시할 툴팁

// BOOL bDesktop : 바탕화면 생성 유무 TRUE., FALSE

// BOOL bQuickLanch : quicklaunch 생성 유무 TRUE., FALSE

// BOOL bStartMenu : 시작메뉴 생성 유무 TRUE., FALSE

// BOOL bOverWrite :  기존 구성 덮어쓰기 유무 TRUE., FALSE


BOOL Util::CreateShortcut( LPTSTR pszFilePath, LPTSTR pszTitle, LPTSTR pszDescription, BOOL bDesktop, BOOL bQuickLanch, BOOL bStartMenu, BOOL bOverWrite)

{

// D1 ("CShorCutDlg::CreateShortcut() : pszFilePath=%s", pszFilePath);

SHGETFOLDERPATH fnShGetFolderPath;


if( !bDesktop && !bQuickLanch && !bStartMenu )  return TRUE;


HMODULE hModule = LoadLibrary("SHFOLDER.DLL");

if (hModule != NULL){

fnShGetFolderPath = (SHGETFOLDERPATH)GetProcAddress(hModule, "SHGetFolderPathA");


if (fnShGetFolderPath == NULL){

FreeLibrary(hModule);

//MessageBox("아이콘 등록에 실패하였습니다. Shell Version이 낮습니다.", "에러", MB_ICONSTOP);

return FALSE;

}

}


//  실제 대상파일이 존재하는지 체크하는 루틴추가.

//if( !IsFileExist( pszFilePath ))  return TRUE;

 

CString strTempPath;

// 아이콘의 이름 설정이 안되었을 경우 기본 이름으로 설정 : *.exe의 바로가기

if( pszTitle == NULL ) {

TCHAR szFileName[MAX_PATH];

memset( szFileName, 0x00, sizeof(szFileName) );


TCHAR szFilePath[MAX_PATH];

memset( szFilePath, 0x00, sizeof(szFilePath) );


lstrcpy( szFilePath, pszFilePath );


TCHAR *pszToken;

pszToken = strtok( szFilePath, _T("\\"));


while( pszToken != NULL ){

lstrcpy(szFileName, pszToken);

pszToken = strtok(NULL, _T("\\"));

}

  

strTempPath.Format(_T("\\%s%s"), szFileName, _T("의 바로가기.lnk") );

pszTitle = strTempPath.GetBuffer( strTempPath.GetLength() );

}

BOOL bResult = TRUE;


HRESULT hResult;

    IShellLink* pShellLink;

IPersistFile* pPersistFile;


TCHAR szDesktopPath[MAX_PATH];

TCHAR szQuickLanchPath[MAX_PATH];

TCHAR szStartMenuPath[MAX_PATH];


memset( szDesktopPath, 0x00, sizeof(szDesktopPath) );

memset( szQuickLanchPath, 0x00, sizeof(szQuickLanchPath) );

memset( szStartMenuPath, 0x00, sizeof(szStartMenuPath) );


// 바탕화면 아이콘이 저장될 경로 설정

//SHGetSpecialFolderPath(NULL, szDesktopPath, MAX_PATH );

if( FAILED( fnShGetFolderPath(NULL, CSIDL_DESKTOP , NULL, 0, szDesktopPath) ) )  return FALSE;

LPSTR strDesktopPath = lstrcat( szDesktopPath, pszTitle );

 

// 빠른 실행 아이콘이 저장될 경로 설정

if( FAILED( fnShGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szQuickLanchPath) ) )  return FALSE;

LPSTR strQuickLanchPath = lstrcat( szQuickLanchPath, _T("\\Microsoft\\Internet Explorer\\Quick Launch") );

strQuickLanchPath = lstrcat( szQuickLanchPath, pszTitle );


// 시작메뉴

if( FAILED( fnShGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, 0, szStartMenuPath) ) )  return FALSE;

LPSTR strStartMenuPath = lstrcat( szStartMenuPath, pszTitle );


if( !bOverWrite ){

// 바탕화면 아이콘이 있으면 

if( IsFileExist( (LPCTSTR)strDesktopPath ) ) bDesktop = FALSE;

// 빠른실행 아이콘이 있으면 

if( IsFileExist( (LPCTSTR)szQuickLanchPath ) ) bQuickLanch = FALSE;

// 시작메뉴  아이콘이 있으면 

if( IsFileExist( (LPCTSTR)szStartMenuPath ) ) bStartMenu = FALSE;


if( !bDesktop && !bQuickLanch && !bStartMenu ) return TRUE;

}

  

    // COM Object 초기화

    CoInitialize(NULL);


 // IShellLink 객체를 생성하고 포인터를 구함

    hResult = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &pShellLink);


    if( SUCCEEDED(hResult) ){

  // 단축아이콘의 대상체와 설명을 설정한다.

CString exe_dir_str;

TCHAR drive[_MAX_DRIVE] = _T(""), dir[_MAX_DIR] = _T("");

TCHAR fname[_MAX_FNAME] = _T(""), ext[_MAX_EXT] = _T("");

_tsplitpath( pszFilePath, drive, dir, fname, ext );

exe_dir_str.Format("%s%s", drive, dir);


        pShellLink->SetPath( pszFilePath );

        pShellLink->SetDescription( pszDescription );

        pShellLink->SetArguments(_T(""));

pShellLink->SetWorkingDirectory( exe_dir_str );


  // 저장하기 위해 IPersistFile 객체 생성

        hResult = pShellLink->QueryInterface( IID_IPersistFile, (LPVOID *) &pPersistFile );


  // 유니코드로 파일 패스를 변경한 후 저장

if( SUCCEEDED(hResult) ){

            

WORD wszDesktop[MAX_PATH];

memset( wszDesktop, 0x00, sizeof(wszDesktop) );

            MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, strDesktopPath, -1, LPWSTR(wszDesktop), MAX_PATH );


WORD wszQuickLanch[MAX_PATH];

memset( wszQuickLanch, 0x00, sizeof(wszQuickLanch) );

MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, strQuickLanchPath, -1, LPWSTR(wszQuickLanch), MAX_PATH );

WORD wszStartMenu[MAX_PATH];

memset( wszStartMenu, 0x00, sizeof(wszStartMenu) );

MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, strStartMenuPath, -1, LPWSTR(wszStartMenu), MAX_PATH );


// shortcut 등록

  if( bDesktop ){

if( !pPersistFile->Save( LPWSTR(wszDesktop), TRUE ) ) bResult = FALSE;

  }


  //Quick Lauch에 등록 

  if( bQuickLanch ){

if( !pPersistFile->Save( LPWSTR(wszQuickLanch), TRUE ) ) bResult = FALSE;

  }

  //bStartMenu에 등록 

  if( bStartMenu ){

if( !pPersistFile->Save( LPWSTR(wszStartMenu), TRUE ) ) bResult = FALSE;

  }

  

  pPersistFile->Release();


  // 아이콘 재설정

::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST | SHCNF_FLUSH, NULL, NULL);

}

pShellLink->Release();


//COM 해제

CoUninitialize();

FreeLibrary(hModule);


return bResult;

    }else{

FreeLibrary(hModule);

    }

    return bResult;

}



* 사용법

BOOL ret = CreateShortcut( "c:\\실행폴더\\aaa.exe", "\\aaa.lnk", "테스트입니다.", TRUE, TRUE, TRUE, TRUE);

c:\\실행폴더\\aaa.exe 파일을 위한 단축아이콘 생성을 위한 것으로 aaa.lnk 는 단축아이콘 생성이름입니다. 보통 실행파일명으로 해주면 됩니다.
바탕화면, quicklaunch, startmenu 에 단축아이콘을 생성하고. 기존것이 있다면 덮어쓴다는 의미 입니다.

저는 위 함수 하나로 사용하고 있습니다.










오늘은 해당 특정폴더 안의 특정 파일이 존재하는지를 체크하는 함수 입니다.


간단하지만 막상 인터넷에서 찾아서 사용하려면 머리 아픕니다.


아래 함수 하나를 넣어놓고 호출해서 사용하시면 편리합니다.


* 소스코드


// LPCSTR lpszFilePath : 폴더 및 파일명

BOOL Util::IsFileExist(LPCSTR lpszFilePath)

{

CFileFind find_file;

if(find_file.FindFile(lpszFilePath)){

return TRUE; // 존재한다.

}


    return FALSE;

}



* 사용법


BOOL present = IsFileExist("c:\\특정폴더\\aaa.exe");


파일이 존재하면 TRUE 이겠죠...













오늘은 exe파일이나 dll, ocx 등의 파일 버젼을 읽을 필요가 있게 됩니다.


그때 읽는 함수를 알려드리겠습니다. 현재 제가 사용하고 있는 소스입니다.



* 소스코드


// CString parm_path : 파일경로

// CString parm_filename : 파일명.확장자

CString Util::GetAppVersion( CString parm_path, CString parm_filename )


        DWORD dwHandle, dwLen; 

        UINT BufLen; 

        LPTSTR lpData; 

        VS_FIXEDFILEINFO *pFileInfo; 

        CString pgm_path, ret_version;


pgm_path.Format("%s\\%s", parm_path, parm_filename);

        dwLen = GetFileVersionInfoSize( (char *)(const char *)pgm_path, &dwHandle ); 

        if (!dwLen)   return ""; 

         

        lpData = (LPTSTR) malloc (dwLen); 

        if (!lpData)   return ""; 

        if( !GetFileVersionInfo( (char *)(const char *)pgm_path, dwHandle, dwLen, lpData ) ) {   

                free (lpData); 

                return ""; 

        } 

         

        if( VerQueryValue( lpData, "\\\\", (LPVOID*) &pFileInfo, (PUINT)&BufLen ) )  {   

ret_version.Format("%d.%d.%d.%d", 

HIWORD(pFileInfo->dwFileVersionMS), LOWORD(pFileInfo->dwFileVersionMS), HIWORD(pFileInfo->dwFileVersionLS), LOWORD(pFileInfo->dwFileVersionLS)

);

                //*MajorVersion = HIWORD(pFileInfo->dwFileVersionMS); 

                //*MinorVersion = LOWORD(pFileInfo->dwFileVersionMS); 

                //*BuildNumber = HIWORD(pFileInfo->dwFileVersionLS); 

                //*RevisionNumber = LOWORD(pFileInfo->dwFileVersionLS); 

                free (lpData); 

                return ret_version; 

        } 

         

        free (lpData); 

m_debug_str.Format("[GetAppVersion] %s %s %s", parm_path, parm_filename, ret_version); AddLog(m_debug_str);


        return ret_version; 


* 사용법

CString ver = GetAppVersion("c:\\폴더", "aaa.exe")'


GetAppVersion 함수는 고정적으로 넣어놓고, 호출만 하면 해당 파일의 버젼이 읽히게 됩니다.

참 쉽죠~~













오늘은 개발할 때 디버깅을 위해 파일로 로그를 남기는 저의 방법을 알려드리려고 합니다.


일반적으로 함수 하나로 해서 로그를 많이 남기게 됩니다.



* 소스코드


// parm_log : 남길 로그

void Util::AddLog(CString parm_log)

{


CTime t = CTime::GetCurrentTime();

CString log_str;

log_str.Format("[%04d/%02d/%02d %02d:%02d:%02d] %s", t.GetYear(), t.GetMonth(), t.GetDay(), t.GetHour(), t.GetMinute(), t.GetSecond(), parm_log);

CString file_str, make_str;

file_str.Format("%s\\log\\%04d%02d%02d_log.txt", "c:\\로그폴더경로", t.GetYear(), t.GetMonth(), t.GetDay() );

FILE *fp = fopen((const char *)file_str, "a+t");

if(!fp) return;

fprintf(fp, "%s\n", (const char *)log_str);

fclose(fp);

}


* 사용법


AddLog("로그입니다.");



위 코드는 말그대로 지정된 c:\\로그폴더경로 란 경로에 로그를 남기게 됩니다.


로그를 남길 때 GetCurrentTime() 함수를 사용하여 현재 시스템시간을 얻어서 a+t 타입, 즉. 텍스트타입의 add 방식으로 파일에 추가하라는 의미있니다.


위 함수를 지정해 놓고 사용하시면 편리합니다.













오늘은 ASP에서 DB연결을 하는 방법에 대해 설명하려 합니다. 


너무나도 잘 알려진 내용이지만 저의 블로그에서 체계적으로 정리하는 의미에서 연재하고자 합니다.


* 소스코드


Dim dbcon


Function DBOpen

Set dbcon = Server.CreateObject("ADODB.Connection")

dbcon.Provider = "Sqloledb"

dbcon.Open("Server=localhost;Database=DB명; UID=DB아이디; PWD=DB암호;")

end function


Function DBClose

dbcon.close

set dbcon=nothing

end function


보통 함수로 만들어놓고 많이 사용하게 됩니다. 

위 함수는 고정적이고, DB명, 아이디, 암호만 넣고 시작하시면 됩니다.

CreateObject 로 오브젝트 생성 후 연결하게 됩니다.


보통 MSSQL 이외 오라클이나 MySQL 의 경우 CreateObject 안의 문자열을 다르게 하기만 하면 해당 db을 사용할 수 있습니다.

아주 쉽죠~



* 사용법


DBOpen

set rs=server.createobject("adodb.recordset")

sql=""


~~~


set rs=nothing
DBClose


저는 위처럼 하게 됩니다. 레코드셋도 각각 만들게 되면 부하양이 많아질 수 있기 때문에 저는 통상 하나의 레코드셋울 사용합니다.

쿼리부분의 레코드셋사용 부분은

sql = "select top 10 * from 테이블명 with(nolock) where 조건절~~ "

rs.open sql,dbcon
do until rs.eof

aaa = rs("search_str") 
rs.movenext
loop
rs.close


위처럼 하게 되며~~, 다음 쿼리에서 레코드셋을 또 사용하기 위해 반드시 rs.close 을 해줘야 재사용이 가능합니다,~~

참 쉽죠~~










유튜브영상을 편하게 보자.. 유튜브서치(YouTubeSearch) 입니다.


현재 베타버젼이고요.. 좀더 기능을 추가예정인데 급한데로 사용하고싶은 분들께 배포합니다. 


기능추가요청을 댓글로 달아 주시면 반영할 수 있다면 반영할 예정입니다.


보통 유튜브 사이트에 들어가서 보게 되면 사이트의 틀과 기타 항목들 때문에 집중있게 영상을 보기 힘들고

원하는 크기로 보기가 힘든 부분이 있어 이 부분을 일반 곰플레이어처럼 비슷하게 만들었습니다. (이미지참조)

 

* 기본정보


프로그램명 : 유서치 (YouSearch)

운영체제 : 제힌없음

라이센스 : 프리웨어 - 절대로 해킹코드 없는 순수 프로그램임을 보증합니다.

다운로드

YouSearch_1_0_0_1.zip



검색어 중에 스포츠 쪽 관련된 내용 중 광고수익이 많이 발생하는 영상은 Youtube API 로는 볼수가 없더라고요. 그런 영상은 유뷰브 사이트에서 직접 보셔야 합니다.

그리고, 재생목록이 있는 채널리스트 같은 것은 배제하였습니다. 하려고 하니 작업이 좀더 필요해서 당장 시간이 없어서..ㅎㅎ

향후에 이 부분도 적용할 예정에 있습니다.



* 설치


압축푸셔서 ypusearch란 폴더를 만들어 안에 넣으시면 됩니다.


* 이미지 및 설명


프로그램 실행 시 화면입니다.^^ 오른쪽에 빨간 검색창 보이시죠? 거기에 검색어를 입력하시면 됩니다. 

재생목록은 검색에서 배제하였습니다.~


검색결과 보이시죠?.. 사이트에서 검색한 것과 대부분 같습니다.~~

스크롤 끝에 가시면 [다음] 버튼이 보이고 다음페이지로 넘어갈 수 있으며 한 리스트에 50 건씩 보입니다.



이미지를 클릭하게 되면 좀 기다리면 왼쪽에서 영상을 보실 수 있습니다.

위 이미지에서 보면...

(2) 클릭하면 오른쪽 리스트창이 사라집니다. ( 플레이어 같겠죠..)

(1) 클릭 하면 사라진 리스트창이 다시 나타납니다.

아래 가운데 보시면 (3) 부분은 리사이즈가 된다는 걸 표시한건데.. 잘 아시다싶이 

마우스를 저 근처에 갖다데면 마우스가 대각선화살표로 바뀌고, 리사이즈할 수 있습니다.


보이시죠..ㅎㅎ 운하는 크기로 작해 만들어 놓고 보시면 편해요..

다만 아쉬운게 하단 컨트롤도 사라지면 좋을 것 같은데 지원을 안하네요..ㅎㅎ



첨부파일을 받으셔서 즐겨보세요..~~





+ Recent posts