2008/01/28

덩치를 확 줄인 Nero 8.2.8 Lite & Micro

사용자 삽입 이미지
Nero Burning Rom을 사용한지도 벌써 10년이 다 되어가는 것 같다. 오버버닝의 대명사로 알려져 있는 Nero는 버전업은 하면서 덩치도 많이 커져버렸다. 예전에는 몇 메가정도였던걸로 기억하는데 지금은 100메가를 훌쩍 넘어 버렸다.

하지만 레코딩 기능 이외에 여러 기능들은 거의 사용하지 않는 기능들이 많다. 대부분 멀티미디어 관련된 기능들이 그러한데 그렇게 느끼는 사람이 많아서 인지 살을 쏙 뺀 Nero가 출현 하였다.

얼마전 Nero가 한번 더 크게 업그레이드 되어 버전 8이 출시가 되었는데 시험판이 무려 187 MB에 달한다 그래서 Nero lite 버전을 찾아보니 어김없이 릴리즈 되었다. Lite 버전은 40MB, Micro 버전은 20MB 로 많은 다이어트를 감행하였다.


Nero 8 Homepage
Nero 8 Lite & Micro Homepage
9Down.com Micro
9Down.com Lite
Download : Nero 8.2.8.0 Micro (English)
Download : Nero 8.2.8.0 Micro (Asian)
Download : Nero 8.2.8.0 Lite (English)
Download : Nero 8.2.8.0 Lite (Asian

Original Post : http://neodreamer-dev.tistory.com/53

2008/01/25

굿모닝 팝스 MP3 재생 및 다운로드

출근과 함께 시작하는 것이 굿모닝 팝스이다. 너무 게을러 6시에 하는 방송을 들을 수 없지만 다행이 인터넷으로 MP3 를 다운 받을 수가 있다.

지난번에 도 올렸었는데 단팥의 굿모닝 팝스 RSS 에 접속을 하면 쉽게 다운로드 할 수 있다.
인터넷 익스플로러를 사용하면 페이지에서 바로 다운 받을 수 있지만 Firefox를 사용하면 소스를 확인해서 직접 다운 받아야한다.
그래서 구글의 RSS 리더를 사용해서 지금까지 들어 왔는데 그 또한 매번 로그인을 하게 만들어 약간 불편해서 재생과 다운로드를 할 수 있는 프로그램을 만들어 보았다.

사용자 삽입 이미지


굿모닝 팝스의 RSS 사이트 XML을 해석해서 해야하지만 XML쪽엔 아직 모르는게 많아 그냥 무식하게 페이지 소스의 MP3 파일만 다 찾아서 리스트에 올리고 선택적으로 재생및 다운로드를 하게 만들었다.
Tracking은 필요 없을 것 같았지만 그냥 재미삼아 프로그래스 바를 클릭하여 특정 위치로 이동할 수 있도록 해 놓았다.

아주 기본적인 기능(재생/다운로드)만 구현해 놓았는데... 업그레이드 계획은 아직 모르겠다.





최신버전 다운로드
Original Post :
http://neodreamer-dev.tistory.com/52

URL 주소를 파일로 다운로드하기

TWeBrowser 나 Indy HTTP 등 다운로드하는 방법은 여러가지가 있을 수 있겠지만 가장 간단한 방법은 URLDownloadToFile 함수를 이용하는 방법인 것 같다.


#include <UrlMon.hpp>
#pragma comment(lib,"urlmon.lib")

URLDownloadToFile(NULL, strURL.c_str(), strFile.c_str(), 0, NULL);


Original Post : http://neodreamer-dev.tistory.com/51

2008/01/24

VCL C++ ASCII 텍스트 파일을 UNICODE 텍스트 파일로 변환

UNICODE 의 종류가 여러가지 인데 이 코드는 윈도우에서 주소 사용하는 방식인 16bit Little Edian 방식으로 변환한다.
옵션으로 소스가 UNICODE 일때는 그냥 복사 한다.
UNICODE 종류별 변환은 나중에 구현해 봐야겠다.

int __fastcall TfrmMain::Asc2Uni(String strSrc, String strDst,
bool bCopyIfUniSrc /*= true*/)
{
int ErrorCode = 0;

TFileStream* pSrcStream = new TFileStream(strSrc, fmOpenRead);
TFileStream* pDstStream = new TFileStream(strDst, fmCreate);

TStringList* pSlstSrc = new TStringList();
pSlstSrc->LoadFromStream(pSrcStream);

if (pSrcStream != NULL && pDstStream != NULL)
{
WideString wString;

// Check BOM
unsigned char BOM[4];
memcpy(BOM, pSlstSrc->Strings[0].c_str(), 4);

bool b32BE = (BOM[0] == 0x00 && BOM[1] == 0x00 &&
BOM[2] == 0xFE && BOM[3] == 0xFF);
bool b32LE = (BOM[0] == 0xFF && BOM[1] == 0xFE &&
BOM[2] == 0x00 && BOM[3] == 0x00);
bool b16BE = (BOM[0] == 0xFE && BOM[1] == 0xFF);
bool b16LE = (BOM[0] == 0xFF && BOM[1] == 0xFE);
bool bU8 = (BOM[0] == 0xEF && BOM[1] == 0xBB &&
BOM[2] == 0xBF);

if (b32BE) ErrorCode = -1;
if (b32LE) ErrorCode = -2;
if (b16BE) ErrorCode = -3;
if (b16LE) ErrorCode = -4;
if (bU8) ErrorCode = -5;

if (ErrorCode == 0)
{
// Write Unicode BOM
BOM[0] = 0xFF;
BOM[1] = 0xFE;
pDstStream->Write((void*)BOM, 2);

for (int row = 0; row < pSlstSrc->Count; ++row)
{
wString = WideString(pSlstSrc->Strings[row] + "
\n");

pDstStream->Write((void*)wString.c_bstr(),
wString.Length() * sizeof(wchar_t));
}
}
}

delete pSrcStream;
delete pDstStream;
delete pSlstSrc;

if (ErrorCode != 0 && bCopyIfUniSrc)
{
//ShowMessage("DirectCopy");
CopyFile(strSrc.c_str(), strDst.c_str(), false);
}

return ErrorCode;
}

Original Post : http://neodreamer-dev.tistory.com/50

무료로 사용하는 SVN 서버

회사 프로젝트 서버를 개인 적으로 이용해 보려 했지만 외부로 노출되어 있지 않은 관계로 활용 범위가 좁아서 무료로 사용할 수 있는 SVN 서버를 찾아 보았다.

Google 에서도 무료로 SVN 서버를 지원해 주고 있지만 이는 소스를 공개한다는 조건에서 사용할 수 있는것이라 썩 맘이 들지 않았다. 대단한 프로젝트도 아니고 지극히 개인적인 것이라 공개하기가 부끄럽다는 표현이 맞을 듯하다.

그래서 마침내 찾아낸 곳이 http://www.assembla.com/ 이다.

무료로 얼마까지 사용하 수 있는지는 잘 모르겠지만 작은 프로젝트 올려놓고 사용하기에는 불편함이 없어보인다.

Original Post : http://neodreamer-dev.tistory.com/49

UNICODE 의 BOM (Byte Order Mark)

유니코드 문서는 문서의 헤더 부분에 이 문서가 유니코드 문서라는 의미의 헤더 코드를 갖고 있다.

이코드는 유니코드의 각 종류마다 각각에 맞는 형식에 맞는 바이트 순서를 의미한다.

BOM                Unicode Type
00 00 FE FF  UTF-32, big-endian
FF FE 00 00   UTF-32, little-endian
FE FF         UTF-16, big-endian
FF FE         UTF-16, little-endian
EF BB BF     UTF-8

Original Post : http://neodreamer-dev.tistory.com/48

Clipboard로 이미지 복사하기

if (OpenClipboard())
{
EmptyClipboard();
CDC *pDC = GetDC();

CDC MemDC;
CBitmap Bitmap;
MemDC.CreateCompatibleDC(pDC);
Bitmap.CreateCompatibleBitmap(pDC, m_szBuf.cx, m_szBuf.cy);
MemDC.SelectObject(Bitmap);

:
// Draw something
:

SetClipboardData(CF_BITMAP, Bitmap.m_hObject);

ReleaseDC(pDC);

CloseClipboard();
}

Original Post : http://neodreamer-dev.tistory.com/47

2008/01/22

프로그램을 최상위로 만드는 프로그램 Tray Topper

작업하면서 인터넷 방송을 시청하기 위해 만들었던 프로그램이다.

초기에는 창모드로 실행되는 프로그램이였는데 수정하면서 트레이로 올라가 동작하도록 수정하였다.

기능만 갖추려고 아이콘이나 UI 는 신경을 쓰지 않았다. 오로지 동작만 되도록... ^^*

프로그램을 실행하게 되면 트레이에 아이콘이 생성되고 그 아이콘을 오른쪽 버튼으로 클릭하면 아래와 같은 팝업 메뉴가 뜬다. 위 아래 메뉴는 무시하고 중간에 현재 실행되고 있는 프로그램 목록이 메뉴로 출력되는데 원하는 프로그램을 선택하면 해당 프로그램을 최상위 프로그램으로 만든다. 체크 되어 있는 프로그램은 이미 최상위 윈도우 속성을 갖고있는 프로그램이고 이를 다시 선택하면 최상위 속성을 해제한다.

사용자 삽입 이미지



Original Post : http://neodreamer-dev.tistory.com/45

작고 빠른 무료 PDF 뷰어 - Foxit Reader

PDF는 Adobe에서 만든 Portable Document Format 인데 이제는 거의 인터넷 표준 문서 포맷으로 자리 잡고 있다.

이 문서를 보기 위해서는 Adobe사의 Adobe Reader 를 설치하면 되는데 이 프로그램은 처음에는 아주 작고 빠른 프로그램이였는데 이제는 많은 기능을 지원하고 있어서 인지 많이 무거워(22MB) 졌다.
작은 PDF 문서를 보기위해 배보다 큰 배꼽같은 프로그램을 실행해야하는 꼴이다.

Foxit Reader는 아주 작고(2~3MB) 빠른 PDF 뷰어 이다.

사용자 삽입 이미지


Foxit Reader 홈페이지
Foxit Reader 2.2 다운로드

Original Post : http://neodreamer-dev.tistory.com/44

Programmer를 위한 굴림체 글꼴

집착이란 참으로 무서운 듯 하다. 얼마전 폰트 때문에 고민을 하다가 요 몇일 직접 폰트를 만들어 봐야 겠다고 맘을 먹고 자료 찾아 보았다.

처음부터 폰트를 만든다는건 정말 많은 작업을 필요로 한다는 결론을 내리고 기존의 글꼴을 변형하는 방법을 선택 하였다.

프로그래머를 위한 폰트라 하면 모양 보다는 가독성이 우선시 되는 폰트를 말한다. 여기에는 공론화된 몇 가지 조건이 있고  개인마다 선호하는 기준이 있다.
공론화된 몇가지 조건을 보면
    - 고정폭 글자 이어야 함.
    - 숫자 0과 알파벳 대문자 O 의 구분
    - 숫자 1과  알파벳 소문자 l 그리고 대문자 I
등이다.

개인적으로 한글 글꼴은 굴림체를 선호하는데 굴림체의 영문 폰트는 프로그래밍에 사용하기에는 부족한 점이 있다. 위에서 언급한 것 말고도 대문자 V과 Y 도 구분이 쉽지 않다.(9pt)

그래서 기존에는 Andale Mono 라는 폰트를 사용하고 있었다.
사용자 삽입 이미지

Andale Mono 폰트는 다 좋은데 영문의 가로 세로 비율이 굴림체와 어울리지 않아 한글 폰트가 다소 부자연스럽다. 위의 갈무리 영상은 MS 계열을 개발 툴에서 얻어온 건데 MS의 경우 한글 폰트를 가로 세로 비율을 같이 늘려주어 글자가 제대로 나오지만 글자 크기가 다소 다르다. 그나마 양호한 편인데 Code Gear의 IDE 에서는  아래와 같이 한글의 가로방향으로만 늘려서 가독성 마져 떨어 졌다. 물론 폰트가 다른 것도 있지만 같은 폰트로 바꾼다 해도 크게 변화는 없다.
사용자 삽입 이미지

그래서 가장 선호하는 폰트인 굴림체 9포인트 폰트를 비트맵 폰트로 만들어 약간 수정을 하면 어디에서나 잘 어울릴 거란 생각에 작업을 해 보았다.

수정이 된 글자는   * 1 Y D 0 L  l I : ; . , 이다.

결과는 아래과 같다.
사용자 삽입 이미지

위쪽이 MS 툴이고 아래쪽이 CodeGear 툴이다. 일단은 맘에 든다. 당분간은 이 폰트를 사용하기로 했다.
그동안의 작업은 일차적으로 이쯤에서 마무리를 하고 차후 이용하면서 불편사항이나 개선점이 있으면 수정을 하기로 하였다. 한글 폰트까지 포함한 폰트를 한번 만들어 보고 싶지만 시간과 능력이 되지 않아 어려울 것으로 생각된다.

참고)
영문 비트맵 글꼴을 만들때는 FontPamily 설정과 시스템 설정에 따라 한글 폰트가 정해 진다.
레지스트리의 다음 위치에 각 FontPamily 의 한글 폰트 매핑 데이터가 있다
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\FontAssoc\Associated DefaultFonts
사용자 삽입 이미지
처음에 무턱대고 만들다가 제대로 되지 않아 고생을 좀 했다.

나와 같은 생각을 하는 사람이 얼마나 될지 모르지만 공유하기 위해 결과 물을 첨부한다.

굴림체 9pt 비트맵 글꼴

2008/01/21

중국 찐쌀이 침공한다.

느즈막히 퇴근을 하고 TV를 켰다.

거의 매일 늦게 퇴근을 하며 정시에 하는 프로그램을 거의 못 본다. 그래서 케이블 방송을 즐겨보는데 오늘은 RealTV 에서 불만제로를 하고 있었다. 언젠가 한번 본 것 같기는 한데 중국 찐쌀에 대한 내용이였다.

수입 업체에서 전국 방방곡곡으로 배송을 하는데 이름있는 김밥 체인점도 있고 식당도 있고 안쓰고 있는 곳이 없었다. 찐쌀이라고 그냥 찌기만 했으면 괜찮았을텐데 표백제도 들어가고 알루미늄성분도 들어갔단다 많이...

더욱 놀라운 일은 농민들의 피를 빨아 먹으면서 크는 농협도 한목 한다는 건데.. 정말 믿을 수 없는 사회인듯 하다

Original Post : http://neodreamer-dev.tistory.com/42

VCL 의 ExtractStrings 를 이용한 Tokenizing 하기

C++ 에서 문자열을 조건에 맞게 잘라쓰려면(Tokenizing) 표준 함수인 strtok 함수를 이용하면 되고, MFC를 이용할때는 CString의 Tokenize 를 이용하면 된다. VCL에서는 이 Tokenizing을 좀더 쉽고 응용하기 쉽도록 포장해 놓은 함수가 있는데 이것이 ExtractStrings 이다.

strtok나 CString의 Tokenize 를 수행하려면 루프를 돌려야 한다. 물론 예쁘게 포장해 놓은면 그럴 필요는 없겠지만...
VCL 에서는 ExtractStrings라는 함수를 기본 제공하며 이 함수를 한번 호출하면 Tokenizing이 되며 분리된 각 요소를 배열 접근하 듯 할 수 있다.

ExtractStrings 의 함수 원형은 다음과 같다.
//함수 원형
extern PACKAGE int __fastcall ExtractStrings(
const Sysutils::TSysCharSet &Separators,
const Sysutils::TSysCharSet &WhiteSpace,
char * Content,
TStrings* Strings);


이 함수는 4개의 인자를 받도록 되어 있다. 간단하게 설명하자면 아래와 같다.

    TSysCharSet &Separators : 구분 문자 집합
        문자열을 나눌 구분 문자 ( 예.  공백으로 구분 : TSysCharSet() << ' ' )
    TSysCharSet &WhiteSpace : 무시할 문자 집합
        이 문자로 시작된 요소의 문자열에서 무시될 문자를 제거한다.
    char* Content : 조건에 맞게 구분되어질 문자열
    TStrings Strings : 결과가 담겨질 변수

// 사용 예
TStringList* pTokenized = new TStringList();

String strSource = "one,two|three,four| | five,,six seven";

int nSep = ExtractStrings(TSysCharSet() << ',' << '|' << ' ',
TSysCharSet() << ' ', strSource.c_str(), pTokenized);

String strMsg;
strMsg.sprintf("%d(%d) 개로 나뉘어 졌습니다.",
pTokenized->Count, nSep);
ShowMessage(strMsg);

for (int i = 0; i < pTokenized->Count; ++i)
{
// 나뉘어진 각 요소에 대한 접근
ShowMessage(pTokenized->Strings[i]);
}


두번째 인자의 쓰임이 와닿지 않을때는 두번째 인자 값을 TSysCharSet() << ' ' 와 TSysCharSet() << ' ' << 'f' 를 넣어서 했을때의 결과 값을 비교하면 쉽게 이해할 수

Original Post : http://neodreamer-dev.tistory.com/41

2008/01/17

List Control의 배경색 제어하기

밋밋한 배경의 리스트 컨트롤을 배경을 제어하여 좀 더 보기 좋게 만드는 방법이다.


사용자 삽입 이미지

CListCtrol의 NM_CUSTOMDRAW 의 메세지 핸들러를 작성하면 된다
Source Code

void CDlg::OnNMCustomdrawListControl(NMHDR *pNMHDR,
LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD;
pNMCD = reinterpret_cast(pNMHDR);

*pResult = 0;

LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
int iRow = (int)lplvcd->nmcd.dwItemSpec;

switch(lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT :
{
*pResult = CDRF_NOTIFYITEMDRAW;
return;
}

// Modify item text and or background
case CDDS_ITEMPREPAINT:
{
lplvcd->clrText = RGB(0,0,0);
// If you want the sub items the same as the item,
// set *pResult to CDRF_NEWFONT
*pResult = CDRF_NOTIFYSUBITEMDRAW;
return;
}

// Modify sub item text and/or background
case CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:
{
if(iRow % 2){
// 홀수열의 배경색 재설정
lplvcd->clrTextBk = RGB(255, 255, 255);
}
else{
// 짝수열의 배경색 재설정
lplvcd->clrTextBk = RGB(230, 230, 230);
}

if (iRow < m_nHighlightedItems)
{
// 조건에 맞을 경우 폰트 색상 변경
lplvcd->clrText = RGB(0, 0, 255);
}

*pResult = CDRF_DODEFAULT;
return;
}
}
}



Original Post : http://neodreamer-dev.tistory.com/40

속이 훤히 들여다 보이는 윈도우 만들기 SetLayeredWindowAttributes

속이 훤히 들여다 보이는 윈도우 만들기 SetLayeredWindowAttributes

SetLayeredWindowAttributes는 윈도우를 투명하게 해주거나 특정 색상의 영역을 투명하게 하고 마우스 이벤트를 받지 않도록 할 수 있다.

이 함수를 이용하면 윈도우의 투명정도(Alpha Blending)을 설정할 수 있고, SetWindowRgn을 이용하여 특정 부분이 투명한 윈도우를 만드는 일도 쉽게 할 수 있다. 이 함수는 윈도우 2000 이상에서 사용할 수 있다.

이 함수의 원형은 다음과 같다.
BOOL SetLayeredWindowAttributes(      
HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);

함수 정보
Minimum DLL Version user32.dll
Header Declared in Winuser.h, include Windows.h
Import library User32.lib
Minimum operating systems Windows 2000


HWND hwnd
    레이어 속성을 설정할 윈도우 핸들. 이 윈도우는 WS_EX_LAYERED 속성을 갖고 있어야 한다.

COLORREF crKey
    투명 처리를 하여 마우스 이벤트를 받지 않을 색상.

BYTE bAlpha
    윈도우의 투명 정도(Alpha Blend 값). 먼저 정의된 색상인 crKey는 이값에 영향을 받지 않음.

DWORD dwFlags
    적용 옵션
    LWA_COLORKEY 0x00000001
        주어진 Color 영역을 투명 처리하고 마우스 이벤트를 받지 않도록 한다.
    LWA_ALPHA 0x00000002
        지정된 Alpha 값으로 윈도우를 투명하게 만들어 준다.

응용 예
// 윈도우에 WS_EX_LAYERED 속성을 부여한다.
SetWindowLong(m_hWnd, GWL_EXSTYLE,
GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);

// 윈도우를 50% 반투명하게 만들기
SetLayeredWindowAttributes(m_hWnd, 0, 128, LWA_ALPHA);

// 윈도우의 파란색을 투명하게 하게 하고 마우스 이벤트 무시하기
SetLayeredWindowAttributes(m_hWnd, RGB(0,0,255), 0, LWA_COLORKEY);


다음은 윈도우에 특정 색상을 입히고 그 색상을 반 투명하게 만들고 나머지 부분에 50% 반투명 하도록 한 코드이다.
this->Color = RGB(1, 1, 1);
SetWindowLong(this->Handle, GWL_EXSTYLE,
GetWindowLong(this->Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
BOOL res = ::SetLayeredWindowAttributes(this->Handle,
RGB(1, 1, 1), 127, LWA_COLORKEY | LWA_ALPHA);


예제 코드는 CodeGear 완전 무료 개발툴인 Turbo C++ (C++ Builder 2006 기반)로 작성 되었다.
간단한 테스트 같은 경우 Turbo C++을 이용하는 것이 Visual C++을 이용하는 것보다 편리하다. Visual C++은 무조건 프로젝트를 만들어야 하지만 Turbo C++ 은 그냥 코딩하고 실행하면 된다. 게다가 무료이다. 완전 무료라 했는데 엄밀히 말하면 완전 무료는 아니고 설치 후 CodeGear에서 라이센스 파일을 받으면 100년짜리 라이센스를 준다. 그러니 100년 동안만 무료란 말이다. ^^*

본론으로 들어와서 위 코드를 넣고 수행해 보면 아래와 같은 영상이 나온다. 눈으로 봐서 이해하기 힘들면 예제 프로그램을 실행해 보면 쉽게 이해할 것이다.
예제프로그램영상

예제 프로그램

2008/01/16

C++ Builder 에서 SHGetFolderPath API 사용하기

폰트 폴더 경로를 얻기 위해 SHGetFolderPath 함수를 이용하려했는데 자꾸만 에러가 발생했다.

//Code
#include <shfolder.hpp>
#include "shlobj.h"

char szPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_FONTS, NULL, 0, szPath);

// Error
[C++ Error] shobjidl.h(2372): E2238 Multiple declaration for
'FOLDERSETTINGS'
[C++ Error] shobjidl.h(8279): E2238 Multiple declaration for
'DESKBANDINFO'
[C++ Error] shlobj.h(1487): E2238 Multiple declaration for
'FVSHOWINFO'
[C++ Warning] shlobj.h(3487): W8017 Redefinition of
'DI_GETDRAGIMAGE' is not identical
[C++ Error] shlobj.h(4992): E2238 Multiple declaration for
'SHELLFLAGSTATE'


이유는 아직 모르겠고 해결책은 프로젝트 옵션에서 Path and Defines 의 Conditional Defines에 NO_WIN32_LEAN_AND_MEAN을 추가해 주는 것이다. 소스상에 #define 하면 안된다. 전역으로 적용되도록 프로젝트 옵션에 추가해야 한다.

예전에 Shell Controls를 수동으로 설치할 때 봤던 건데 NO_WIN32_LEAN_AND_MEAN이 뭐하는 녀석인지 파악해 봐야겠다. (혹시 이 포스팅을 보시는 분들중 아시는 분 있으시면 댓글 부탁드립니다.)

Original Post : http://neodreamer-dev.tistory.com/38

프로그램에 Drag&Drop 으로 파일 받기

C++ Builder Code
Header

void __fastcall OnWMDropFiles(TWMDropFiles &msg);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, OnWMDropFiles)
END_MESSAGE_MAP(TForm)


Source

Constructor
DragAcceptFiles(Handle,true);


void __fastcall TfrmMain::OnWMDropFiles(TWMDropFiles &msg)
{
char fullPath[MAX_PATH];

// Drop 된 파일 수 가져오기
UINT fileCount;
fileCount = DragQueryFile((HDROP)msg.Drop, 0xffffffff, NULL, 0);

for(UINT i=0; i < fileCount; i++)
{
// 파일이름 가져오기
DragQueryFile((HDROP)msg.Drop,i,fullPath,MAX_PATH);
}

DragFinish((HDROP)msg.Drop);
}


Visual C++ Code
DragAcceptFiles(TRUE);

OnDropFiles(HDROP hDropInfo)
{
UINT uNumFiles;
CHAR szNextFile[MAX_PATH];

// Drop된 파일 수 가져오기
uNumFiles = DragQueryFile ( hDropInfo, -1, NULL, 0 );

for ( UINT uFile = 0; uFile < uNumFiles; uFile++ )
{
// 파일이름 가져오기
if ( DragQueryFile( hDropInfo, uFile, szNextFile, MAX_PATH ) > 0)
{
:
}
}

DragFinish ( hDropInfo );
}

Original Post : http://neodreamer-dev.tistory.com/37

공짜로 MSDN Magazine을 보자!

얼마 전에 안 정보인데 MS에서 MSDN Magazine을 웹사이트에서 무료로 제공하고 있다.

2003년부터 현재(2008년 2월호)까지 모든 Magazine을 무료로 다운 받을 수 있다.

다국어로 번역된 자료는 2006년 11월호부터 지원하고 있으면 한국어도 제공을하고 있다. 번역된 자료인데 내용은 문제가 없으나 인덱스의 한글은 깨져보인다.

MSDN Magazine site
Original Post :
http://neodreamer-dev.tistory.com/36

AVI 동영상 파일의 기본 정보 확인하기

Mu908용으로 mencoder 의 프론트엔드 프로그램을 하나 만들다 찾게된 팁이다.

AVI파일에서 기본 정보(해상도, fps, 재생시간)을 가져오는 코드이다.

#pragma link "avifil32.lib"
#include <vfw.h>

AVIFileInit();
PAVIFILE avi;
int res=AVIFileOpen(&avi, strFile.c_str(), OF_READ, NULL);
if (res!=AVIERR_OK)
{
//An error occures
if (avi!=NULL)
AVIFileRelease(avi);

return;
}

AVIFILEINFO avi_info;
AVIFileInfo(avi, &avi_info, sizeof(AVIFILEINFO));

// Frame per Second
float fps = (float)avi_info.dwRate / (float)avi_info.dwScale;
// Running second
float Running = avi_info.dwLength / fps;

String strAviInfo;
strAviInfo.sprintf("%dx%d (%d frames)",
avi_info.dwWidth,
avi_info.dwHeight,
avi_info.dwLength);

AVIFileExit();

Original Post : http://neodreamer-dev.tistory.com/35

2008/01/14

Command Line 의 집착?

어떠한 명령이나 프로그램을 실행함에 있어 윈도우즈는 GUI 바탕으로 마우스라는 편리한 녀석을 이용하여 원하는 아이콘을 클릭한 하면 된다.
너무나 간단해 뭐가 아쉽다.

영화에 나오는 해커와 같은 전문가들이 마우스 클릭만으로 일을 해결한다면 뭔가 부족한 느낌이 들 것이다.  자판을 열심히 두드리고 이것저것 입력해보고 역시 해커는 이래야지... ^^*

별것도 아닌 이야기를 써 내려가려 했는데 시작이 너무 거창 한가?

PC를 새로 세팅하면 가장 먼저 하는게 시작메뉴의 프로그램을 정리하는 것이다.
사용자 삽입 이미지

그리고 사용이 많은 프로그램의 바로가기를 한 곳으로 모아둔다. 그리고 그 폴더를 시스템 패쓰로 잡아둔다.
그러면 윈도우즈의 실행창에서 명령만 입력하면 바로 실행이 된다. ^^*
사용자 삽입 이미지

난 마우스 컨트롤 보다는 명령행 입력이느 단축키를 지정하여 실행하는 걸 좋아한다.
아마도 도스 시절부터 컴퓨터를 사용하고 리눅스 환경에서 작업을 하다보니 생겨난 버릇 같다.
불편하거나 나쁜 버릇도 아니니 고칠 생각도 없고...

단축키 폴더를 만들지 않아도 할 수 있는 Command Launcher 같은 프로그램이나 하나 만들어 봐야겠다.http://neodreamer-dev.tistory.com/34

2008/01/13

동적 MDB 생성하기

동적으로 MS Access DB를 만드는 코드.


// For Create MDB
#include <odbcinst.h>
#pragma link "Odbccp32.lib"


int __fastcall TDM::CreateMainDB()
{
AnsiString strMainDBPath;
strMainDBPath = m_strPath + "\MainDB.MDB";

if (FileExists(strMainDBPath))
{
ShowMessage("MainDB is Exists already!");
return -1;
}

strMainDBPath = "CREATE_DB=\"" + strMainDBPath

+ "\" General\0";

bool bCreated;
bCreated = SQLConfigDataSource(
NULL,
ODBC_ADD_DSN,
"Microsoft Access Driver (*.mdb)",
strMainDBPath.c_str() );

if (bCreated == true)
{
return 0;
}
else
return -2;
}


Original Post : http://neodreamer-dev.tistory.com/33

2008/01/12

하하가 군대 간다는데... 안혜경이 기다린단다.

말 보기 좋은 모습이구나... 하는 생각과 연예인이라 어쩔 수 없는 입장 아닌가 하는 생각과 더불어 하하가 현역으로 입대 하는가 하는 생각이 들었다. 보기 쉬운 일이 아닌데 한창 전성기에 있는 연예인이 현역으로 간다는게... 군대 다녀온 사람으로서 아쉽기도 하는 생각이 들었다.

군대가 결코 나쁜것만 있는 건 아니지만 3년 가까이 되는 시간이 아까운건 사실 아닌가? 적어도 난 그런 생각이 든다.

그런데 오늘 다른 기사를 봤다.
하하가 군입대로 빠지면 무한도전 팀이 5인 체제로 간다는 기사를 봤다. 그런데 거기에서 눈에 띄는 문구가 있었다.
"2월 11일 강원도 원주의 한 훈련소에 입소, 4주간 기초 군사훈련을 받은 이후 22개월간 공익 근무요원으로 복무하는 하하를 입대 부대 앞까지 배웅할 예정이다."

웃음도 안나온다.
도대체 뭘 기다린다는 것이지? 4주를? 하하의 퇴근 시간을? 어이가 없었다.

공익근무하면서 일을 할 수 없다면 하하는 불쌍(?)하지만 그래도 현역으로 가는 사람과 비교가 될까?
참으로 어의가 없다

Original Post : http://neodreamer-dev.tistory.com/32

Mu908용 바닥 설정 파일

지난 포스팅에서 바닥을 이용한 Mu908 용 동영상 만들기를 설명하였는데 그 작업을 편하게 할수 있는 설정 파일이다.

첨부된 설정파일은 4개로 구성되어 있다.

Mu-908H.ini 고화질    설정 파일. 화질 500, 24fps, 음질 128
Mu-908N.ini 일반화질 설정 파일. 화질 300, 24fps, 음질 128
Mu-908N2.ini 일반화질 설정 파일. 화질 150, 24fps, 음질 128
Mu-908L.ini 저화질    설정 파일. 화질 150, 20fps, 음질 64

여러 설정을 해보았는데 작은 액정이다 보니 화질이 크게 차이가 안난다. 개인적으로는 Mu-908N2.ini 파일을 선호 한다.

Mu908 바닥으로 24fps 영상을 즐기자!!

Mu908을 구매하였다.

Mu908은 스펙상 220x170 의 Xvid 포맷의 24fps 동영상을 지원한다고 한다.

이 제품에서 일반 동영상을 보려면 우선 변환을 해야 한다. 스펙에 맞는 코덱과 사이즈로...

제조사측에서 제공하는 프로그램은 AVIConverter 인데 자신들의 프로그램이 아닌 것으로 보인다. 제조사측의 권장사항은 자막을 입히거나 하는 작업을 바닥이라는 변환툴을 이용하여 변환을 하고 AVIConverter로 변환하는 것을 추천하고 있다.

그런데 난 싫다.
왜냐하면 두번이나 변환을 해야 하니 시간이 소요되고 귀찮은 일이 아닐 수 없기 때문이다. 또한 AVIConverter는 변환 과정을 지극히 단순해 누구나 쉽게 사용할 수 있을지는 모르겠지만 결과물이 좋지 않고 fps도 20으로 고정되어 있다.

AVIConverter 를 통해 만들어진 영상의 코덱정보를 확인해 보았다. 확인을 해보니 AVIConverter도 역시 mencoder의 프론트엔드 프로그램일뿐 별게 없었다. 바닥같은 툴에서 지극히 아주 지극히 단순화 시켜놓은 툴이라 할까? 바닥도 mencoder를 사용하고 AVIConverter도 mencoder를 사용하는데 왜 같은 encoder에 두번 변화를 시켜야 하는지... 아마도 AVIConverter를 직접 만들지 않아 어떻게 변환되는걸 모르고 있는건 아닐까 하는 위험한 상상이 든다.

몇시간 걸쳐 바닥에서 Mu908에서 바로 볼 수 있는 동영상을 만드는 방법을 알아 내었다.
데스크탑과 노트북에서 모두 테스트 해보았으니 아마 잘 되리라 생각된다.

바닥에서 Mu908에서 볼 수 있는 동영상 만들기

바닥 프로그램 다운받기
우선 바닥 프로그램을 실행 시킨다. 변환하고자하는 파일을 추가한다.
사용자 삽입 이미지

변환하고자 하는 파일을 바닥의 파일 목록에 드래그앤 드롭하면 쉽게 리스트에 추가할 수 있다. 이때 확장자가 smi 인 파일이 동영상과 함께 있어야 자막을 입힐 수 있다.

다음으로 인코딩 환경 설정 버튼을 눌러 환경을 선택한다.
사용자 삽입 이미지

중요한 설정이 몇가지 있다.
화질 : 500
빠른 움직임의 동영상의 화질 저하를 줄이기 위해

프레임 : 24.000
20fps 보다는 24fps가 화질이나 모든 면에서 좋겠죠? *^^*

크기 : 224x176
기기스펙은 220x176인데 이상하게 그 해상도는 재생이 안된다. AVIConverter에서 만들어진 동영상을 참고해 224x176으로 바꾸니 정상 재생이 되었다.

잘라내기 : 선택해제
잘라내기는 옆으로 긴 영화를 특정 사이즈로 자르는 기능이다. 이걸 활성화 하면 잘려나가 못 보는 부분이 생길 수도 있다. 작은 화면에서야 조금 잘린다고 크게 눈에 띄는건 아니겠지만...

필요한 경우 영상 확장 : 선택
와이드 영상의 경우 아래위로 래터박스를 만들어 준다.

대상크기에 꽉찬 화면 만들기 : 선택해제
주어진 해상도에 원본영상을 맞추어 준다. 와이드 영상의 경우 많이 찌그러지게 된다.

다음은 영상확장과 꽉찬 화면의 선택에 따른 화면이다.
아무런 선택없이 와이드 영상을 변환했을때 만들어진 해상도는 224x96 이다.
사용자 삽입 이미지







필요한 경우 영상확장을 선택한 경우 와이드 영상 변환시 레터박스가 생기고 자막도 보기 좋아진다.
사용자 삽입 이미지












꽉찬 영상을 선택한 경우 화면에 꽉차도록 큼지막한(?) 영상이 만들어 진다.
사용자 삽입 이미지












자막 파일 영상에 삽입하기 : 선택
자막 파일을 영상에 입혀준다. 위에서 예로 보여준 화면을 보면 자막을 입힌 상태이다.

환경 설정에서 가장 중요한 오늘의 하이라이트 이다.
바로 추가 옵션이다. 이 옵션을 넣어 주어야지만 Mu908에서 재생이 된다.
-xvidencopts max_bframes=0:quant_type=h263
인터넷을 찾아 돌아다니다 알아낸 옵션인데 자세히는 모르겠지만 이 옵션이 없으면 오디오와 영상이 부분부분으로 나뉘에 담기게 되는데 그럴경우 Mu908에서 재생이 되지 않는다. 그게 재생이 된다면 가끔씩 오디오와 비디오가 싱크가 맞지 않는 문제가 발생 할 일이 줄어 들텐데...

그 다음으로 소리 설정이다.
사용자 삽입 이미지
소리 설정은 오디오 코덱과 음질과 샘플 비율만 맞추어 주면 된다.

코덱은 MP2, 음질은 128, 샘플비율은 44100 으로 맞춘다.

마지막으로 자막 설정이다.
사용자 삽입 이미지
자막은 크기만 설정하면 되는데 위의 샘플영상의 폰트가 5이니 취향에 맞게 크기를 조절하면 된다.

이제 환경설정 창을 닫고 작업 시작 버튼을 누르고 기다린다.
프로그램에도 있듯이 남은 시간을 믿지는 말고 작업로그창에 완료 메세지가 나오기를 기다리면 된다.
사용자 삽입 이미지

완료 되면 변환된 영상을 Mu908에 넣고 즐기면 된다

Original Post : http://neodreamer-dev.tistory.com/30

MU-908을 받다.

이틀만에 배송이 되었다.

택배사와 아파트 경비 아저씨들간의 실갱이로 더 늦게 받을 뻔했는데 다행이 오늘 받을 수 있었다.

기본 세트에 충전기와 실리콘 케이스를 구매를 하였다. 포장은 지극히 평범하였고 내용물은 아무 손상이 없었다.

우선 화면이 어떻게 생겼는지 한번 보았는데 약간 실망했다. 광고에서 보던 그런 화면이 아니여서였다. 광고에서는 화려하고 깔끔하게 나왔는데 역시 장시치들 광고는 신용을 해서는 안되는가 보다.

기본적으로 들어있는 mp3를 외부 스피커로 들어 보았는데... 흠 글쎄.. 최악의 경우가 아니면 그냥 이어폰으로 듣는 것이 좋을 듯 해보였다. (아마도 주위에 소음때문에 그런 생각이 든 듯하다.)

우선 홈페이지에 최신 펌웨어를 받았다. 그런데 제작사 측에서는 특별한 문제가 없는 한 펌업을 하지 않는것이 좋다 한다. 왜그럴까? 대부분의 멀티미디어 기기는 최신 펌웨어를 권장하지 않나? 지금 쓰고 있는 PMP만해도 그런데...

어쨌거나 2007년 12월 24일 날짜의 최신 펌웨어를 받아서 업그레이드를 시도하였다. 첫번째 시도는 실패.
홈페이지에서 최신 펌웨어 업데이트 프로그램이라 받아서 설치한건데 안된다. Vista 지원 최신 프로그램인데... 그래서 다른 프로그램이 있는이 찾아 보았다. Vista 지원전의 프로그램을 설치하여 일단 펌업은 성공하였다. 유저 클럽에서 폰트도 바꿔 보려 했지만 일단 보류(시스템 부터 파악하기 위해...)

일단 mp3는 기본이겠거니 생각하고 동영상을 테스트 해보았다.
장비 스펙에는 Xvid 코덱의 220x170을 지원한다 그래서 바닥이란 변환툴을 이용하여 변환을 하고 재생을 시도해 보았지만 실패하였다. 그래서 제작사 측에서 제공하는(사실은 아닌듯) AVIConverter 를 이용하여 변환하니 재생이 잘 되었다. 뭐가 다른가? 하는 의구심이 생겨 코덱을 비교해 보니 화면 크기와 fps 등 몇가지가 달랐다.

AVIConverter 만을 사용해야 하는것인가? 제작사 사이트에서도 바닥으로 자막을 입히고 AVIConverter로 변환을 하라는데...
다른 방법을 찾아 보아야겠다.

Original Post : http://neodreamer-dev.tistory.com/29

2008/01/10

아내에게.. -사랑밭 새벽 편지-

아주 오래전에 “아내에게“라는 편지를 읽은 적이 있다. 길고도 슬픈 내용을 편지 였는데 읽으면 곁에 있는 사람을 다시 생각하게 한다.

감명 깊게 읽고 구글 노트에 스크랩을 해서 가끔 다시 보고는 한다.

오늘도 잠깐의 짬에 다시 읽어보다 “도대체 원본글은 어디에 있을까?“하는 의문이 생겼다. 스크랩 당시에도 출처를 밝히지 않고 그저 퍼다 놓은 글이여서 알지 못했다.

그래서 편지의 마지막의 -새벽편지 가족- 이란 단서를 갖고 찾아 보았다. 제목을 잘 몰랐어서 조금 시간이 걸리긴 했지만 원본글을 찾을 수 있었다.

사랑밭 새벽 편지란 사이트로 이 편지 말고도 감동적인 글들이 많이 있다.

“아내에게..“ 편지 전문 보기



http://neodreamer-dev.tistory.com/28

프린터가 안돼요~~ (먹통 된 프린터 해결 방법)

아주 잘 되던 프린터가 갑자기 먹통이 되어 버렸다. 프린터를 몇번을 재부팅하고 인쇄를 시도해도 인쇄가 되지 않는다.

트레이 아이콘의 프린터 아이콘을 더블클릭해 보니 프린트 할 리스트가 몇개 올라가 있고  맨 위의 항목이 “인쇄중...“  상태였다.

삭제 메뉴로 이를 삭제하려고 시도하니 “삭제중...-인쇄중...“으로 상태가 바뀌어 버리고는 또 다시 아무런 변화가 없다.

삭제중으로 바뀐 녀석이 지워지지 않고 계속 남아서 다른 인쇄도 못하게 만들어 버리는 것이다.

해결책은 프린터 스플링 서비스를 다시 시작 하는 것이다.

서비스를 다시 시작 하는 방법은 여러 가지가 있다. 첫번째는 제어판의 관리도구에 서비스 메뉴를 선택하고 다시 시작 하는 것이다.

두번째는 명령줄은 이용하는 것으로 도스창에서 아래 두 명령을 수행하면 된다.

net stop "Print Spooler"
net start "Print Spooler"

간단한 방법으로 프린터를 원상복귀 시킬 수 있다.

위의 두 방법이 너무나 귀찮다 생각되면 두번째 방법을 배치 파일로 만들어 놓거나 첨부한 실행파일을 실행하면 된다.

첨부한 파일은 pcbangas.com 에서 만들 프린터 목록을 모두 제거하는 프로그램인데 동작방식은 위에서 설명한 방식일거라 추측되다.

http://neodreamer-dev.tistory.com/27

Mouse Enter 와 Leave 함수 구현하기

코드기어(예전 볼랜드) 툴에는 컨트롤 마다 MouseEnter와 MouseLeave 이벤트 핸들러를 기본적으로 지원하기 때문에 별다른 작업 없이 Mouse Enter 와 Leave 이벤트를 사용할 수 있었는데 VC에서는 기본적인 이벤트 핸들러만 제공하기 때문에 개발자가 WM_MOUSEHOVER와 WM_MOUSELEAVE 이벤트가 발생하도록 작성해 주어야 한다.

MouseEnter와 MouseLeave 이벤트 함수를 구현하려면 MouseMove 에서 _TrackMouseEvent 함수를 호출해 주면 된다. 그러면 컨트롤에 WM_MOUSEHOVER 와 WM_MOUSELEAVE 이벤트가 발생한다.

// Header
BEGIN_MESSAGE_MAP(CClass, CBase)
:
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
:
END_MESSAGE_MAP()

LRESULT CClass::OnMouseHover(WPARAM wParam, LPARAM lParam)
LRESULT CClass::OnMouseLeave(WPARAM wParam, LPARAM lParam)


// Source
void CClass::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT trackmouseevent;
trackmouseevent.cbSize = sizeof(trackmouseevent);
// 서비스 플래그 : TME_CANCEL, TME_HOVER,
// TME_LEAVE, TME_NONCLIENT, TME_QUERY
trackmouseevent.dwFlags = TME_HOVER | TME_LEAVE;
trackmouseevent.hwndTrack = GetSafeHwnd();
// Hover Timeout 으로 TME_HOVER 플래그 적용시 반영된다.
// 시간이 작을수록 감도가 좋음.
trackmouseevent.dwHoverTime = 0x00000001;
_TrackMouseEvent(&trackmouseevent);

CBase::OnMouseMove(nFlags, point);
}



MSDN의 _TrackMouseEvent
Original Post :
http://neodreamer-dev.tistory.com/26

오랜 고민 끝에 아이뮤즈 MU-908 을 지르다!

사용자 삽입 이미지
MP3P를 사려고 한동안 고민을 하고 있었다.

선택의 기준이 가격과 동영상 지원여부와 외부 메모리 지원 여부 그리고 휴대성 이였다.

그리고 중요한 것이 또 있다. 펌업 지원 여부와 인터페이스도 있다.

중국에서 제조되어 들어오는 저렴한 MP3P는 인터페이스가 정말이지 맘에 들지 않았다. 특히 폰트가...

여러가지 조건을 고려 하다가 고른 모델이 아이뮤즈의 Mu-908이다.

미니SD가 아닌 일반 SD 지원에 동영상과 기본적인 여러가지 기능에 멀티태스킹까지 지원한다.

하지만 구입 목적이 기존의 덩치큰 MP3P를 대신해서 출퇴근길에 굿모닝 팝스를 듣는 것이 주 목적인데 다른 기능들은 어떻게 활용될지 나도 모르겠다

Original Post : http://neodreamer-dev.tistory.com/25

2008/01/09

Google Chart API 테스트...

Google Chart API 테스트 해 보려고 프로그램을 하나 만들어 보았다.

URL을 통한 Chart 작성하다보니 데이터 크기나 설정등이 제약이 많음에도 불구하고 Google Chart 는 상당히 많은 기능을 제공한다.

문서를 봐가면서 하나하나 기능 추가를 하면서 프로그램을 만들어 보았다.

사용자 삽입 이미지

기본적이 Chart 생성 정도만 하고 일단 중지.  해야할게 너무 많다.

일단 URL로 접근을하여 이미지를 가져오니 다른 설치 절차도 필요없고 간단하게 활용할 수 있는 Chart 같다. 트래픽이 많은 곳에서는 제한때문에 사용하기 힘들 수도 있지만...

Google Chart API

http://neodreamer-dev.tistory.com/24

키보드 상태 파악하기

알면 조금 편리한 팁 입니다.

현재 키보드 상태를 확인하는 코드 입니다.
bool bLCtrl    = (GetKeyState(VK_LCONTROL) & 0x8000) != 0;
bool bLShift = (GetKeyState(VK_LSHIFT) & 0x8000) != 0;
bool bLMenu = (GetKeyState(VK_LMENU) & 0x8000) != 0;
bool bCapsLock = GetKeyState(VK_CAPITAL) != 0;

Original Post : http://neodreamer-dev.tistory.com/23

간단한 GDIPlus Wrapper class

Microsoft 사의 GDIPlus를 사용하려면 관련 헤더파일과 라이브러리 파일을 링크해 주어야 하고,

초기화를 해주고 사용한 후 삭제도 해줘야한다.

빈번하게 사용한다면 코드가 어려울 건 없지만 아주 가끔 사용하면 막힐때가 종종 있어서

간단한 Wrapper Class 를 만들어 보았다.
/////////////////////////////////////////////////////////////

// Header

#pragma once

#include <GdiPlus.h>

using namespace Gdiplus;
#pragma comment(lib,"GdiPlus.lib")

class CAGDIPlus
{
private:
BOOL m_bInitailized;
ULONG_PTR m_gdiplusToken;

public:
CAGDIPlus(void);
~CAGDIPlus(void);

void Init(void);
};


/////////////////////////////////////////////////////////////
// Source

#include "StdAfx.h"
#include "AGDIplus.h"

CAGDIPlus::CAGDIPlus(void)
{
m_bInitailized = FALSE;
}

CAGDIPlus::~CAGDIPlus(void)
{
if (m_bInitailized)
/*Gdiplus::*/GdiplusShutdown(m_gdiplusToken);
}

void CAGDIPlus::Init()
{
/*Gdiplus::*/GdiplusStartupInput gdiplusStartupInput;
/*Gdiplus::*/GdiplusStartup(&m_gdiplusToken,
&gdiplusStartupInput, NULL);

m_bInitailized = TRUE;
}

일정 시간 경과 후 사라지는 MessageBox

윈도우즈가 설치되면 수많은 Dll 들이 설치가 되는데 대부분의 함수들은 Windows API 문서에 기술이 되지만 그렇지 않은 함수들도 많이 존재한다.
그런 함수들 중 하나로 일정 시간 지나면 스스로 사라지는 메세지박스가 user32.dll에 포함되어 있다.

MessageBoxTimeout 함수는 다음과 같다.
int MessageBoxTimeoutA(IN HWND hWnd, IN LPCSTR lpText, 
IN LPCSTR lpCaption, IN UINT uType,
IN WORD wLanguageId, IN DWORD dwMilliseconds);
int MessageBoxTimeoutW(IN HWND hWnd, IN LPCWSTR lpText,
IN LPCWSTR lpCaption, IN UINT uType,
IN WORD wLanguageId, IN DWORD dwMilliseconds);


이 함수를 이용하기 위해서는 라이브러리를 읽어와서 함수 포인터를 연결해 주어야한다.
static MSGBOXAAPI MsgBoxTOA = NULL;

HMODULE hUser32 = GetModuleHandle(_T("user32.dll"));
if (hUser32)
{
MsgBoxTOA = (MSGBOXAAPI)GetProcAddress(hUser32,
"MessageBoxTimeoutA");
}


MessageBoxTimeout 함수의 반환값 보통 메세지 박스와 같지만 시간이 경과하여 자동으로 사라질 경우에는 OK 버튼일 경우 1을 넘겨주고 YESNO 같은 선택형일 경우 MB_TIMEOUT(=3200) 값을 넘겨준다.

MessageBoxTimeout 함수를 편하게 사용하도록 정리된 헤더파일



소스보기..

Visual Studio 2005 Warnning Deprecated Function

프로젝트를 VS2002 에서 VS2005로 바꾸는데 있어 프로젝트를 마이그레이션 한 후 빌드를 해보니 무수한 경고 메세지가 쏟아져 나왔다. 대부분의 에러는 함수가 안전하지 않다고 다른 함수로 변경하라는 메세지 이다.

이 메세지를 무시하려면 다음을 입력해 주면되지만...

#pragma warning(disable:4996)

아무래도 경고 메세지를 없애는게 좋을듯 싶어 관련 정보를 찾아 보았다.

Visual Studio 2005로 버전업 하면서 몇몇 CRT 함수들이 "_s" 라는 말꼬리를 붙여 추가되었다.

문자열 버퍼를 사용하는 CRT 함수들이 예전에는 char형 포인터만 넘겨주면 되었는데 2005에서는 대상버퍼의 크기를 함께 넘겨주어야 한다. 좀더 안전성을 추구하는 모양이다. 그래서 "_s" 라는 말꼬리가 붙었나보다.

다음은 sprintf 함수의 예이다.
int sprintf(
char *buffer,
const char *format [,
argument] ...
);

int sprintf_s(
char *buffer,
size_t sizeOfBuffer, // Output 버퍼의 크기
const char *format [,
argument] ...
);


Deprecated CRT Functions  : 보다 자세한 내용과 함수 목

Original Post : http://neodreamer-dev.tistory.com/20

2008/01/08

vector를 이용한 2차원 동적 배열

STL의 컨테이너인 vector를 이용하여 2차원 동적 배열을 구현해 보았다.


vector를 이용하기 위한 포함 파일을 포함하는 방법은 개발툴 마다 조금씩 다르다.

Visual Studio 의 경우
#include <vector>

using namespace std;



C++ Builder 경우
#include <vector.h>



vector를 활용한 2차원 동적 배열은 vector 를 담는 vector 이다.
선언은 아래와 같다.
vector < vector < int > > vcArray;


선언시 주의해야할 사항은 마지막 angle bracket 2개를 붙여쓰면 쉬프트 연산자로 인식해 에러를 발생한다.

배열을 초기화 하기 위해서 원하는 ROW 만큼 반복을 하며 원하는 COL 크기의 vector를 만들어 동적 배열 vector에 넣어주면 된다. 설명보다는 코드를 보는 것이 이해가 빠를 것이다.
for ( int i = 0 ; i < ROW; ++i ) // 주어진 ROW 만큼 반복

{

vector<int> elem; // vector 를 생성하고

elem.resize(COL); // 원하는 COL 크기로 할당

vcArray.push_back(elem); // 배열에 추가

}



vector 를 활용한 배열이기 때문에 위와는 다르게 각 ROW 마다 원소수(COL 의 크기)를 다르게 설정할 수도 있다. 그때 배열에 접근 할때는 인자가 범위를 벗어나지 않도록 주위를 해야한다.


이렇게 할당한 배열을 삭제할 때는 각각의 ROW 에 포함된 COL 데이터를 삭제하고 마지막으로 ROW 데이터를 삭제하면 된다.
for (int row = 0; row < (int)vcArray.size(); ++row)

vcArray[row].clear();

vcArray.clear();



접근 방법은 일반 배열을 접근하듯이 하면 된다.
int temp = vcArray[1][2]; 

vcArray[1][2] = 3;


Original Post : http://neodreamer-dev.tistory.com/19

TEdit Control에서 숫자만 받아들이도록하기

VCL 의 TEdit 컨트롤은 기본적으로 숫자만 받아 들이도록 하는 속성이 없다.

숫자만 받아 들이도록 하려면 컨트롤의 속성을 변경해 주어야 한다.

SetWindowLong(edtAge->Handle, GWL_STYLE,
GetWindowLong(edtAge->Handle, GWL_STYLE)| ES_NUMBER | ES_RIGHT);

Original Post : http://neodreamer-dev.tistory.com/18

Google Chart

Google Chart API 는 웹상에 동적으로 차트를 만들어 줍니다. Chart API 서버로 URL을 보내면 URL은 해석하여 그에 맞는 차트 이미지를 PNG 포맷으로 반환하는데 이를 웹 페이지 상에 삽입을 하려면 <img> 태그를 이용하여 삽입할 수 있습니다.


간단하게 Chart API를 테스트 해보려면 아래 URL을 브라우저의 주소 표시줄에 입력해 보세요.


http://chart.apis.google.com/chart?cht=p3&chd=s:hW&chs=250x100&chl=Hello|World
사용자 삽입 이미지

Reference 첫 페이지에서 항상 볼 수 있는 Hello World 문구의 차트를 볼 수 있습니다.


Google Chart 를 사용함에 있어 제한이 있는데 하루에 유저당 50000번의 질의(URL 호출) 할 수 있고, 그 이상 시도시 Chart API는 일시적으로 동작을 멈춘다고 하네요. 계속 시도시에는 접근을 막아버린 다네요.(무섭군요. ㅡㅡ;)


짬나면 Google Chart를 테스트하는 프로그램을 만들어 봐야 겠습니다. ^^*


Google Chart API website<

Original Post :
http://neodreamer-dev.tistory.com/17

엄청난 중독성 게임!!

사용자 삽입 이미지

일단 한번 10분만 게임해 보세요. 중독성이 아주 짙은 게임입니다.

Level 4를 꼭 깨야 하는데....

2008/01/07

파워포인트에 플래시를 넣어보자!!

Swiff Point Player 는 MS 파워포인트에 쉽게 플래시를 넣을 수 있게해주는 플러그 인 프로그램이다.

이프로그램을 설치하면 삽입 메뉴에 플래시 삽입 메뉴가 추가되어 쉽게 플래시를 삽입할 수 있다.

시스템 사양
    * Windows 98/ME/NT4/2000/XP
    * Microsoft PowerPoint 2000/XP/2003
    * Pentium 400 MHz or higher
    * 128 MB RAM and 4 MB of free disk space
    * Adobe Flash Player installed

홈페이지



Original Post :
http://neodreamer-dev.tistory.com/15

플래시 플레이어 Swiff Player

단독 실행형 플래시 플레이어 이다.

플래시 미디어 파일인 swf 를 재생하는 방법은 여러가지가있고 그중 가장 간단한 방법은 브라우저에 드래그앤 드롭하면 쉽게 재생할 수 있다.

그보다 조금더 쉬운 방법으로 Swiff Player 를 설치하고 swf 파일을 링크해주면 탐색기에서 더블클릭만으로 재생할 수 있다.

사용자 삽입 이미지


홈페이지



Original Post :
http://neodreamer-dev.tistory.com/14

음력 양력 변환 프로그램

지난번 포스팅했던 양력과 음력을 변환하는 DLL 을 이용한 간단한 프로그램이다.

날짜변환 프로그램 스크린 샷

DelphiSpeedUp 2.72 released - Critical Bugfix

TCollection 에 심각한 버그가 있어서 곧바로 패치 되었네요.

    * Improved: Better cache algorithm for LoadResString
    * Improved: .NET 1.1 SetThreadPriotity hook is not necessary for .NET 2.0
    * Improved: Delphi 7 RTM Compiler that has a working optimization is used to compile DelphiSpeedUp for Delphi 7.
    * Added: Some I/O operation optimizations for the Delphi 2007 compiler.
    * Added: LStrAsg, LStrLAsg speed optimization (QC 50564)
    * Added: Faster WideStrUtils.InOpSet (QC 43080)

DelphiSpeedUp



Original Post :
http://neodreamer-dev.tistory.com/12

Firefox3 Beta2 - Tistory 글쓰기 문제

얼마전 부터 Firefox3 beta2가 나와서 이를 사용하고 있었다.

회사에서만 FF3를 사용하고 집에서는 FF2를 사용하는데 주로 포스팅을 집에서 해오다 오늘 모처럼 회사에서 포스팅을 하는데 링크를 걸려면 링크 대상이 사라져 버리는 것이다. 이미지를 업로드하고 글에 삽입하려해도 되지 않고, FF3의 문제인지 티스토리의 문제인지는 모르겠다. 다른 브라우저나 FF2에서 잘 되는걸로 봐서는 FF3의 문제인것으로 생각되는데...

FF3 로 버전업 하면서 체감속도도 빨라지고 주소표시줄의 즐겨찾기 기능도 있어 만족스러웠는데 좀 아쉽다.

정식버전에서는 문제를 말끔이 해결하고 나와주었으면 한다.

Firefox3 Beta2 다운로드
Original Post :
http://neodreamer-dev.tistory.com/11

다기능 부팅 시디 Hiren's BootCD 9.3

Hiren's BootCD는 100여종의 유틸리티를 담고 있는 부팅 시디이다. 이 시디가 포함한 모든 프로그램을 설명하려면 너무나 힘이든다
프로그램이 많아 쓰임이 많지만 그 중 대표적인 활용을 살펴보면 아래와 같다.

    . Partition and Disk 백업 / 복원
    . 파티션 재설정
    . 도스 모드에서 NTFS 접근하기
    . 관리자 암호를 잊었을 경우
    . HDD 로레벨포맷

많은 기능이 있지만 본인은 Partition and Disk 백업 / 복원에 주로 이용한다.
이런저런 프로그램을 설치하여 테스트 하다보면 시스템이 상당히 불안해서 안정적인 상태로 돌리기 위해 사용한다.


다운로드 : Hiren's BootCD 9.3 + KeyBoard Patch

Hiren's BootCD 9.3 구성프로그램 보기



http://neodreamer-dev.tistory.com/10

작고 가벼운 시작 프로그램 관리 프로그램

Startup Control Panel

사용자 삽입 이미지


XP에 내장되어있는 msconfig 툴을 이용하여 시작 프로그램을 관리할 수 도 있지만 편의성에서 보면 조금 부족한 면이 있다.
물론 msconfig 만의 장점도 있지만 지금 소개하는 시작프로그램 관리 프로그램은 아주 작고 쉬운 프로그램으로 일일이 레지스트리를 찾아 헤메지 않고 쉽게 시작프로그램을 관리할 수 있다.

프로그램을 실행하면 여러개의 탭페이지로 구성된 다이얼로그창이 뜨는데 각각 탭은 시스템레벨, 사용자레벨 등으로 나뉘어진 시작 프로그램목록을 담고 있으며 각 페이지에서 삭제 및 비활성화를 할 수 있다. 자세한 설명이 필요 없을정도로 누구나 실행을 해보면 바로 알수 있는 직관성 있는 인터페이스를 갖고 있다.

Startup Control Panel

Download Standalone EXE Version

http://neodreamer-dev.tistory.com/9

2008/01/06

DelphiSpeedUp 2.71 released

Delphi/BCB/BDS/CodeGear IDE 용 속도향상 플러그인인 DelphiSpeedUp이 버전업을 했네요.

    * Improved: Better cache algorithm for LoadResString
    * Improved: .NET 1.1 SetThreadPriotity hook is not necessary for .NET 2.0
    * Improved: Delphi 7 RTM Compiler that has a working optimization is used to compile DelphiSpeedUp for Delphi 7.
    * Added: Some I/O operation optimizations for the Delphi 2007 compiler.
    * Added: LStrAsg, LStrLAsg speed optimization (QC 50564)
    * Added: Faster WideStrUtils.InOpSet (QC 43080)

DelphiSpeedUp
Original Post :
http://neodreamer-dev.tistory.com/8

무료 C++ IDE

개발이나 공부를 하다보면 아주 간단하게 테스트를 해야하는데 덩치 큰 개발툴을 사용해야 할 때가 있다. 그럴때마다 다른 방법이 없을까하고 찾아 보았다.

Pspad 같이 컴파일러를 지원하는 Editor를 사용해 보기도 했지만 뭔가가 부족해 보였다.

이미 이름이 잘 알려진 eclipseDev C++도 있지만 이런 툴들도 처음에는 가벼웠다가 개발되면서 많이 무거워졌다.

그래서 쓸만한 IDE 툴이 있나 찾아보았다.

Code::Blocks
Code::Blocks Screenshot

Relo v2.0
Relo v2 Screenshot

위의 두 툴 모두 Open Source 로 진행되는 프로젝트로 Code::Blocks은 Nightly Build 로 2-3일에 한번씩 업데이트 되고 Relo는 버전 2.0이 최신으로 소스와 함께 공개되었으며 다양한 컴파일러를 지원한다.

위의 Code::Blocks 은 테스트용으로 알고리즘이나 C++ STL을 테스트하기 위하여 Borland C++ Compiler와 함께 가끔 사용하고 있는 것이고 아래의 Relo는 나중에 다른 경로로 알게되어 몇번 사용해 보았는데 간단하게 C++ 테스트 용으로는 Relo가 적당한 듯하고 Code::Blocks은 다양한 템플릿 지원으로 다양한 활용이 유용한 듯 하다.

Free C++ Compiler
    MingW/GCC Compiler
    Borland C++ Free Compiler
    Digital Mars Compiler

Original Post : http://neodreamer-dev.tistory.com/7

윈도우 비스타에서 C++빌더가 실행되지 않는 문제

비스타에서 빌더가 실행이 되지 않을경우 빌더를 Administrator 권한으로 실행을 하면 된다.

이 에러는 비스타가 C:\Program Files 아래의 모든 디렉토리에 대해 기본적으로 쓰기 권한을 허용하지 않기 때문이라 한다.

코드기어 문서 : http://support.codegear.com/article/36326
Original Post :
http://neodreamer-dev.tistory.com/6

Bcc32Pch for C++ Builder 2007

Bcc32Pch 는 그 동안 C++ Builder의 취약점인 빌딩 타임을 줄여주는 플러그인이다.

C++ Builder는 Visual C++ 처럼 Precompiled Header를 지원하지 않아 빌드 시간이 오래 걸리는 단점을 안고 있었다.

허나 C++ Builder 2007이 MS Build 시스템을 채택함으로써 Bcc32Pch 도 더이상 지원하지 않을듯 보였는데 얼마전 Bcc32Pch for C++ Builder 2007이 개발되고 있다는 소식을 들었다.

과연 C++ Builder 2007 에서 채택한 MS Build 시스템에 비해 얼마나 더 나은 성능을 보여줄지 궁금하다.


Bcc32Pch 홈페이지

Bcc32Pch Development Snapshots
Original Post :
http://neodreamer-dev.tistory.com/5

2008/01/05

음력은 계산해 보자!! 진짜만세력!

요즘은 음력의 쓰임이 많지 않지만 아직도 생일이나 기념일을 음력으로 챙기는 사람이 많은 것으로 안다. 본인을 포함하여...

본인은 일정관리 프로그램을 선택함에 있어서 가장 중요한 것 중 하나가 음력을 지원하느냐인데 외국 프로그램에서는 거의 찾아 볼 수 없고 국내 프로그램에서만 간간히 볼 수 있는듯하다. 그래서 아웃룩을 벗어나지 못하고 있는듯 하다.

일정관리 프로그램 이외에도 음력을 이용하는 곳이 더러있는데 때문에 양력을 음력으로 변환하는 소스를 찾은 경험이 있는데 이는 모두 특정 테이블을 이용하여 변환을 하고 있고 2040년까지만 지원한다.

인터넷을 검색하던 중 진짜만세력에 대한 정보를 찾았다. 제작자 께서는 소스도 함께 공개를 해 주셨다.

펄과 파스칼 버전으로 공개를 하였는데 이중 파스칼 유닛을 이용해 양력과 음력을 변환하는 DLL을 만들어 보았다.

진짜만세력 홈페이지


자세한 내용 보기

티스토리에 Google Syntaxhighlighter 적용하기

블로그를 개발과 관련한 글이 주로 올리려 하기 때문에 아무래도 소스코드를 올리는 일이 많겠고 보다 이쁘고 보기 좋게 하려면 소스코드에 색상을 입힌 syntax highlighter 가 적용이 되면 보다 더 보기 좋겠다는 생각에 티스토리에 적용을 해보기로 했다.

Syntaxhighlighter 는 구글코드에 있는게 그래도 보기 좋고 기능도 좋아 우선 적용하기로 하고 나와 같은 생각을 하는 사람이 분명 있을거란 생각에 먼저 적용을 시도한 정보를 찾아 보았다.

다행이도 먼저 시도한 분이 있어서 적용하는데 크게 힘들지 않았다.


  
//-----------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <iostream.h>

//-----------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
cout << "Hello World";

return 0;
}
//-----------------------------------------------------------



Google Code Syntaxhighlighter

적용하는 방법 자세히 보기

나름대로 정리 보기

2008/01/03

굿모닝 팝스 MP3 다운받기

간단하게 설명하면

단팥을 다운 받아 설치하면 된다.

그러나...

단팥을 설치를 하게 되면 Fasoo DRM 프로그램이 설치가 되고 이는 서비스로 동작을 하여

단팥 프로그램의 동작과는 상관없이 항상 시스템의 리소스를 야금야금 먹고 있다.

하루에 두어번 굿모닝 팝스 MP3를 다운 받기위해 종일 Fasoo 란 녀석에게 내 귀중한

시스템의 리소스를 차지하고 있는걸 용납할 수 없었다. ^^*

그래서 다른 방법을 찾아 보았다. 단팥을 설치하지 않고도 다운 받을 수 있는 방법을...


굿모닝 팝스 MP3 다운 받는 방법 보기

2008/01/02

인터넷 뱅킹 키입력시 다운 현상 해결...

얼마전 부터인지 인터넷 뱅킹을 하려 할 때마다 로그인 시도하기 직전에 컴퓨터가 다운이 되어버리는 것이다.

파티션을 백업해 두었기에 복원을 해서 다시 시도해 봐도 문제가 해결되지 않아 구글 검색을 통해 알아 보았다.

확실치는 않았지만 게임커뮤니티에서 실마리를 찾았다. 역시나 ActiveX가 문제를...

원인은 nProtect KeyCrypt 가 야기 시킨것으로 보였다. 찾은 정보에 의하면 게임 시스템의 nProtect KeyCrypt 드라이버와 시스템간의 충돌 때문이라 하는데 우선 시스템에 설치되어 있는 nProtect KeyCrypt 구성 파일을 찾아 보았다.

npkcrypt.dll
npkcrypt.sys
npkcusb.sys

windows\system32에 존재하였다.

찾은 정보에 따라 새로 받은 파일을 덮어 씌웠다. 일단 인터넷 뱅킹을 시도하니 정상적이였다

Original Post : http://neodreamer-dev.tistory.com/1