Thursday, October 30, 2008

코니카 KD-510z 사진들

이전 글(Panasonic dmc-fz28)을 쓰고 나니, 코니카의 고장이 너무 아쉽다. 고장의 원인이 모래가 들어 있는 가방에 넣고 들고다닌 것이었다. 이런 말도 안 되는 일이 실제로 일어나고 버렸다. 그 동안 애지 중지 사용한 것인데, 떨어뜨릴까봐 조심 조심 하고 했었는데...

뭐 전자 제품이 언젠가는 고장날 수가 있지만, 그래도 이것은 나의 과실이 너무 멍청했기 때문에 벌어진 일이기에 이제 와서 탓 해 봐야... 별 소용이 없다. 그래서 아쉬움을 뒤로하고, 고 동안 찍은 사진 중 마음에 드는 것을 몇 장 올립니다.

* Blogger에는 늦게 첨부한 사진이 앞에 나열되네요. 흠.


청성부대 앞에서

대구 팔공산 동화사 단청 부분

Nordian Museum, Stockholm, Sweden


Old Castle, ??, Sweden

파나소닉(Panasonic) DMC-FZ28

그 동안 애지중지 잘 사용했었던 컴팩트 카메라(KD-510z)가 고장나는 바람에 새 카메라를 장만하게 되었다. DSLR(Digital Single Lens Reflex)로 넘어갈까도 고민을 많이 했지만, 금전적으로 뒷받침을 하기 싫어서 넘어가지 않게 결심하였다.

이걸로 고민이 끝날 줄 알았는데, 다시 기종 결정이라는 높은 산을 만나고 말았다.

사실 디지털 카메라의 라인업이 무진장 잘 되어 있기 때문에, 소비자는 즐거운 마음으로 결정을 하면 되지만, 이에 따라 고르기도 더욱더 힘들어 진 것이 현실이다. 가격대, 성능대, 휴대성, 고기능 등을 나열하고 정렬하고 고르고 골라도 몇 가지 종류의 디지털 카메라가 등장한다. 자 이제 무엇을 고를까? 또 고민을 했다.

그래서 마지막 후보로 올린 것은 소니 H-50, 올림푸스 SP-57X 시리즈, 니콘 P-80, Panasonic FZ-18, FZ-28이다.

이제 순서를 무작위로 나열하고 결정을 해야 하는데, 순간 머리속에 지나가는 한 구절(외국 사이트인지 국내 사이트인지 이런 말이 있었다. "디카는 가급적 최신 제품을 사라") 오래된 제품 중에 좋은 것도 있지만, 프로세서, 이미지 처리 능력 등을 비교하면 최신 제품을 사는 것이 가장 유리하다라고...

그래서 결정을 한 것이 Panasonic DMC-FZ28이다. 그리고 바로 지름신이 강림하였다.

몇 일 후 내 손이 들어온 28. (사실 한글로 쓰면 뭣 하다) 이것 저것 만지고 하다 보니 손에는 좀 익는데, 아직 사진이 덜 익어서 나온다. 좀 더 공들여 보면 익겠지...

참고로 첨부 사진을 몇 장 올린다. 참고하시라...









밤에 손떨림 켜고 찍은 것.



이 사진은 최대 광각으로 찍은 사진이고




이 사진은 위 사진 중앙의 빨간 차를 18x로 찍은 사진입니다. 약간의 해상도 조절을 하면 23x도 나옵니다.(메뉴얼상 그렇다는 거고...)


많은 사람들이 동영상 기능이 어떠냐고 물어보는데, 내 기준으로 말하면 "동영상을 고려하면 FZ28 사라!"
HD로 나온다. 용량이 좀 커진다만, 그러면 WVGA나 VGA로 찍던가. 그것도 아니라면 직접 용량을 줄이거나.

그리고 동영상 모드에서 줌인/아웃(Zoom In/Out) 다 된다. 걱정 마시라...

Sunday, October 26, 2008

wxTorus 수정 -- wxWidget 2.8.9에 맞추어서

토러스라는 게임입니다.
굴러 떨어지는 도넛형을 가로 색상을 맞추어 정렬하면 됩니다.

예전에 소스 포지에 넣어두었는데, 요즘 새로 꺼내서 빌드해 보았습니다.

wxWidget의 버전이 무려 2.8.9가 되는 바람에 정상적으로 동작하지는 않습니다. 다만 급하게 빌드해서 소스와 바이너리를 올렸지요. 오류를 차차 고칠 예정임.^^

무엇보다 wxDialog의 동작이 바뀌어서 버튼이 동작하질 않네요.

특히 OnOk, OnCancel이 사라졌습니다. wxWidget의 샘플을 보면 OnButton으로 대체된 것 같은데, 조금 시간이 걸릴 듯 보입니다.

아래 링크를 참고하시오~~
소스포지 링크(Link to sourceforge)

Saturday, October 25, 2008

CrystalDiskMark

You might wonder how your hard disk runs.
Faster harddisk will get you more data in a given time.
Means your operating system will run more smoothly while you're doing some other jobs.

CrystalDisk Mark will show disk speed by reading/writing files sequantially, randomly per each 50M, 512K, 4K data chunks.

go to http://crystalmark.info

Friday, October 24, 2008

CrystalEditView

현재 CrystalEdit을 컨트롤로 사용하고 있는데, 사용하기에 귀찮은 것이 좀 많다.

라인 추가하는 것도 별도로 구현해야 하는 데, 좀 까다롭군. (내가 잘못한 것일 수도 있지만...)

문제는 아니지만, InsertText 함수 하나에 프로그램이 죽어버리는 것이 좀 문제이다.

현재 보이는 CrystalEdit의 단점이라면, 편의 함수가 좀 없다는 것

--
LocateTextBuffer함수를 구현하지 않으면 죽어버린다.
내부적으로 사용하는 버퍼를 직접적으로 연결해야 한다.
뷰를 가질때 사용하는 것으로 보이는데... 만약 뷰를 사용하지 않는다면?

CCrystalTextBuffer *NFCrystalEditControl::LocateTextBuffer()
{
return &((NFLogDlg*)GetParent())->m_textbuffer;
}


단순한 마우스 휠 기능 추가.
BOOL NFCrystalEditControl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
if(zDelta < WHEEL_DELTA)
ScrollDown();
else
ScrollUp();

return CCrystalTextView::OnMouseWheel(nFlags, zDelta, pt);
}


한줄 붙이기, 현재 커서를 마지막으로 옮기고, 한줄 붙인 다음, 그 줄을 보이도록 한다.
EnsureVisible 함수를 찾기가(?) 함들었다.
*** EnsureVisible에서 뷰를 업데이트 할 경우에 죽는 경우가 생긴다. 이는 AttachToBuffer 함수를 부르지 않는 것으로 일단 해결.

void NFCrystalEditControl::AppendLine(LPCTSTR pszChars)
{
CString msg;
msg = pszChars;
msg += "\r\n";

CCrystalTextBuffer *buffer = LocateTextBuffer();
int n = buffer->GetLineCount();

int x, y;
//tb->InsertText(this, ptCursorPos.y, ptCursorPos.x, pszChars, y, x, CE_ACTION_PASTE); // [JRT]
BOOL retcode = buffer->InsertText(this, n-1, 0, msg, y, x, CE_ACTION_PASTE); // [JRT]
if(retcode == TRUE)
{
CPoint ptCursorPos;// = GetCursorPos();
ptCursorPos.x = x;
ptCursorPos.y = y;

//ScrollToLine(y); // 현재 포인터가 보이는 곳으로 화면을 갱신한다.
//EnsureVisible(ptCursorPos); // 현재 포인터가 보이는 곳으로 화면을 갱신한다.
}
}

Saturday, October 18, 2008

Test for posting code


#if !defined(AFX_TABPAGESSL_H__619331B3_7DE7_4DB1_A039_2103E87E8E71__INCLUDED_)
#define AFX_TABPAGESSL_H__619331B3_7DE7_4DB1_A039_2103E87E8E71__INCLUDED_

/////////////////////////////////////////////////////////////////////////////
// CTabPageSSL declaration

class CTabPageSSL : public CDialog
{
public:
// Construction
CTabPageSSL (); // Default Constructor
CTabPageSSL (UINT nIDTemplate, CWnd* pParent = NULL); // Standard Constructor
// Destruction
~CTabPageSSL ();

// Enable/disable command routing to the parent.
void EnableRouteCommand(bool bRoute = true) { m_bRouteCommand = bRoute; };
bool IsRouteCommand() { return m_bRouteCommand; };
// Enable CmdMsg routing to the parent.
void EnableRouteCmdMsg(bool bRoute = true) { m_bRouteCmdMsg = bRoute; };
bool IsRouteCmdMsg() { return m_bRouteCmdMsg; };
// Enable/Disable Notify routing to the parent.
void EnableRouteNotify(bool bRoute = true) { m_bRouteNotify = bRoute; };
bool IsRouteNotify() { return m_bRouteNotify; };

protected:
// Message Handlers
virtual BOOL OnCommand (WPARAM wParam, LPARAM lParam);
virtual BOOL OnNotify (WPARAM wParam, LPARAM lParam, LRESULT* pResult);
virtual void OnOK (void);
virtual void OnCancel (void);
virtual BOOL OnCmdMsg (UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo);

// Routing flags
bool m_bRouteCommand;
bool m_bRouteCmdMsg;
bool m_bRouteNotify;
};

#endif // !defined(AFX_TABPAGE_H__619331B3_7DE7_4DB1_A039_2103E87E8E71__INCLUDED_)

ST_SplitterWnd

Are you tired of using CSplitterWnd?
ST_SplitterWnd can help your code working.

At least to me, ST_SplitterWnd is little better to use.
Left image used 3 SplitterWnd.

Generated with following codes





// Declare in your MainFrm.h
ST_SplitterWnd *m_pSplitterWnd1;
ST_SplitterWnd *m_pSplitterWnd2;
ST_SplitterWnd *m_pSplitterWnd3;
ST_SplitterWnd *m_pSplitterWnd4;



BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
m_pSplitterWnd1 = new ST_SplitterWnd();

// split into five panes :

// +-----+--------+
// | | |
// + +--------+
// | | |
// +--+--+--------+
// | |
// +--------------+

//
// workingh
m_pSplitterWnd1->Create(this,NULL, NULL,pContext,false);

m_pSplitterWnd2 = m_pSplitterWnd1->AddSubDivision(TOP_SIDE, NULL, NULL,pContext,true);
m_pSplitterWnd2->AddView(LEFT_SIDE, RUNTIME_CLASS(NFMainView),pContext);
m_pSplitterWnd2->SetColumnInfo(0, 600, 300);
//m_pSplitterWnd2->SetRowInfo(0, 400, 400);


m_pSplitterWnd3 = m_pSplitterWnd2->AddSubDivision(RIGHT_SIDE, NULL, NULL,pContext,false);
m_pSplitterWnd3->AddView(TOP_SIDE, RUNTIME_CLASS(NFDialerView), pContext);
m_pSplitterWnd3->AddView(BOTTOM_SIDE, RUNTIME_CLASS(NFMiscView), pContext);
m_pSplitterWnd3->SetRowInfo(0, 220, 120);
m_pSplitterWnd3->SetRowInfo(1, 220, 120);

m_pSplitterWnd1->AddView(BOTTOM_SIDE, RUNTIME_CLASS(NFOutputView),pContext);
m_pSplitterWnd1->SetRowInfo(0, 400, 300);
//m_pSplitterWnd1->HideRow(1);

}



SetColumnInfo and SetRowInfo give minimal spaces to keep visible. If pane has small spaces than in cxMin or cyMin, than pane will be hidden.

ST_SplitterWnd gives you Hide/Show pane functionality and SwitchView also.
Search Splitter in codeproject

Each pane uses CPropertyView for tabbed view. CPropertyView is MFC extension by YEAsoft.
Log Tab uses CrystalEdit as it's control.

How to use CSplitterWnd

CSplitterWnd은 화면을 분할할 때 사용한다.

왼쪽과 같은 모습을 만들기 위해서는 아래와 같은 코드를 사용하면 된다.

1. 좌우 분리 (1, 2)
2. 오른쪽 Pane을 상하 분리(2, 1)






BOOL m_bSplitterCreated = m_wndSplitter1.CreateStatic(this, 1, 2);

int m_IDpane = m_wndSplitter1.IdFromRowCol(1, 0);
!m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2, WS_CHILD|WS_VISIBLE, m_IDpane))

Splitter는 뷰를 필요로 하기 때문에 CreateView를 사용하여 뷰를 붙인다. 만약 Control을 붙이고 싶다면 CFormView를 사용한다.

m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CHtmlView), CSize(200, 300), pContext);

위 코드는 CPropertyView를 사용하여 각 Pane당 Page형태를 사용한 것이다.