GSI

Google
 

UML을 사용하다 보면 아직까지 익숙하지 않아서 화살표의 의미 자체가 조금 힘들게 받아 들여 진다.
아래의 이미지는 Iterator 패턴을 사용해서 화살표가 의미 하는 것을 적어 보았다.

사용자 삽입 이미지

Posted by gsi
:

Google
 
CView를 사용해서 해당 뷰를 만들고 그 위에 CStatic를 생성해서 처리를 하고 있습니다.
CStatic에는 해당 컬러 정보를 사용해서 드로잉이 되며, 마우스로 이동, 크기변경 등의 이벤트가
발생하게 되는데요.

이때 드로잉 되는 순서가 CView가 먼저 드로잉 되고, CStatic가 드로잉 되게 되면서
강한 Flicker 현상(번쩍임)이 발생을 하네요..

이것저것 처리를 해봐도 언뜻 보면 드로잉 순서로 인해서 어쩔 수 없을거 같다는 생각이 드네요.

그래서 조금 우회를 시켜서 CStatic의 드로잉 부분을 CView에 직접 그리기로 했습니다.
CStatic는 보이지는 않지만 자기 기능을 대신 하고 있는거구요.

이렇게 하니 Flicker는 해결이 되었네요 ^^..

원래 이렇게 하는걸까요?.. 아님 다른 방법이 있는 걸까요?
Posted by gsi
:

세상의 모든 부분이 변화 해왔고 변하고 있다.
어쩌면 다른 부분의 변화 자체가 나에게 직접적인 원인을 제공하지 않았기 때문에 모를 뿐일 것이다.

황사가 지금이야 우리 나라에 피해를 주고 있지만 그것 또한 어느 순간 부터 크지고 있었다는 것을 알지 못했듯이
난 지금 프로그램이라는 부분에서 내가 피부로 느끼고 있는 시기인듯 하다.
OpenGL을 해오다가 DirectX 를 하다가 이제는 MFC를 메인으로 삼고 해왔던 몇년의 시기가
지금 MS에서 밀고 있는 WPF 까지 나아가고 있다.

MFC보다 조금더 발전되어진 형태 같은 WinForm을 하면서 UI 구축이 참 쉽다는게 느껴졌고,
WPF를 하면서 UI의 발전이 한층더 발전했다는 것을 느끼게 된다.
하지만 WPF를 하면서 줄곧 힘들게 느껴지는 부분은 스크립트화 되어 가는 프로그래밍 부분에서
그래픽 적인 화려함이나 다자이너의 성향을 알지 못해서 표현이 서툴고 보기가 좋지 않은 것이 때로는 나를 힘들게 하고
짜증나게 까지 하고 있다. 결국 이 부분까지 디자이너의 몪이 되어 가는걸지도 모른다.

예전에 내가 해왔던 부분도 누군가가 해왔던 부분을 더 쉽게 해놓았기 때문에 내가 지금 자리를 꿰차고 있는것같다는 느낌이 든다.
스크립트화 되고 툴로 쉽게 만들 수 있는 이 부분 조차도 이제 디자이너의 일 부분으로서 자리를 내줘야 할지도 모른다.

요즘 화두가 되어 지는 디자인 패턴이나 아키텍처, 프레임웍, 등 다양한 말들이 나에게 들려 온다.
그리고 그 부분으로 변화되어 갈 프로그램의 길 또한 나에게 있어서 선택의 길이기도 할 것이다.

아주 고차원 적인 코어 부분의 이해를 하면서 다양한 어플리케이션을 짤 것인가 아니면 디자이너의 성향을 가지고 응용 프로그램을 멋지게 표현할 것인가 하는 것과 웹이 점점더 클라이언트의 부분을 잠식해 가는 부분을 하게 될지..

많은 고민을 하게 된다.



하지만 생각한 대로 하다 보면 답은 있을 것이다.
또한 그것이 내가 가야할 방향이고..

현재로서는 WPF와 웹의 방향성을 확실하게 파악하면서 구축을 해보는 것과 프로그램의 내부를 잘 다지기 위해서 디자인 패턴과 포사 등을 보면서 내실을 다져야할 때인거 같다.

내가 밤마다 잠을 자지 못하고 멍하니 있는 이 시기가 헛되이 지나가지 않기를 바란다.

프로그램을 하면서 고생하는 모든 개발자에게 화이팅 ^^.. 모두 잘되길 바란다.
Posted by gsi
:

C# 레지스트리 정보 읽기

private void ChkClientVersion() { RegistryKey reg = Registry.LocalMachine; reg = reg.CreateSubKey(@"Software\HI-NG\Azitro\AzitroAppLauncher", RegistryKeyPermissionCheck.ReadSubTree); FinalClientVersion[(int)CATEGORY_MODE.CAT_WORLD] = Convert.ToDouble((string)reg.GetValue("WorldVersion")); FinalClientVersion[(int)CATEGORY_MODE.CAT_ROOM] = Convert.ToDouble((string)reg.GetValue("RoomVersion")); FinalClientVersion[(int)CATEGORY_MODE.CAT_CON] = Convert.ToDouble((string)reg.GetValue("ConVersion")); reg.Close(); Console.WriteLine("<<클라이언트 레지스트리 버젼>>"); Console.WriteLine(" WorldVersion={0}", FinalClientVersion[(int)CATEGORY_MODE.CAT_WORLD]); Console.WriteLine(" RoomVersion={0}", FinalClientVersion[(int)CATEGORY_MODE.CAT_ROOM]); Console.WriteLine(" ConVersion={0}", FinalClientVersion[(int)CATEGORY_MODE.CAT_CON]); }

C# 레지스트리 정보 쓰기

private void UpdateVersionRegister() { RegistryKey reg = Registry.LocalMachine; reg = reg.CreateSubKey(@"Software\HI-NG\Azitro\AzitroAppLauncher", RegistryKeyPermissionCheck.ReadWriteSubTree); reg.SetValue("WorldVersion", upaser.FinalSvrVersion[(int)CATEGORY_MODE.CAT_WORLD]); reg.SetValue("RoomVersion", upaser.FinalSvrVersion[(int)CATEGORY_MODE.CAT_ROOM]); reg.SetValue("ConVersion", upaser.FinalSvrVersion[(int)CATEGORY_MODE.CAT_CON]); reg.Close(); }
Posted by gsi
:

Google
 


마우스를 통한 개발툴을 만들다 보면 대부분 스크롤 기능을 포함하는 경우가 많습니다.

CScrollView 화면을 통한 마우스 기반의 툴을 제작 하게 되면 불가피 하게 OnLButtonDown(), OnLButtonUp(), OnMouseMove()를 제어 하게 되어 있습니다.
여기서 부터 작업이 시작 되지요.
스크롤 뷰의 화면을 좀 크게 잡는다 싶으면, 스크롤 바를 움직여 보면 아시겠지만, 제대로 되지 않습니다. 16bit 형태의 값이였나, 아뭍턴 값의 한계로 인해서 스크롤 바의 위치가 제대로 처리 되지 않습니다.
그 경우 아래의 코드를 추가 해야 합니다.

BOOL CScrollTest2View::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
{
// When you drag the scroll box, the nPos value send from WM_HSCROLL/WM_VSCROLL is 16bit value.
// Therefore retrieve the 32bit scroll box position value.
if(SB_THUMBTRACK == LOBYTE(nScrollCode)) // WM_HSCROLL
{
SCROLLINFO info;
if(GetScrollInfo(SB_HORZ, &info, SIF_TRACKPOS))
{
nPos = info.nTrackPos; // 32bit position value.
}
}
else if(SB_THUMBTRACK == HIBYTE(nScrollCode)) // WM_VSCROLL
{
SCROLLINFO info;
if(GetScrollInfo(SB_VERT, &info, SIF_TRACKPOS))
{
nPos = info.nTrackPos; // 32bit position value.
}
}

return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
}

위의 코드를 추가 하고 나면 넓은 영역의 뷰도 스크롤이 제대로 표현되는 것을 확인하실 수 있을겁니다.

이제 확인해야 될 부분이 마우스 이벤트에 들어 오는 CPoint point 부분입니다.
스크롤 뷰에서 제일 맘에 안드는 부분이 이 부분인데요. point가 왜 스크롤 되고 나면 현재 위치를
구해 주지 않는지 모르겠습니다.
사용자 삽입 이미지
위의 화면에서와 같이 마우스 위치의 지점을 클릭해 보겠습니다. 클릭하고 나면 대략 값이 x:188, y:49 가 나오게 됩니다.
하지만 아래의 스크롤 바를 보면 우측으로 많이 가 있는 것을 볼 수 있습니다.
즉, 스크롤이 움직여도 마우스의 위치 값은 화면에 보이는 영역에 대한 상대 값임을 알 수 있습니다.

그렇다면 여기서 스크롤 되는 정보를 얻어 와서 처리 해주어야 한다는 사실을 알게 될겁니다.
스크롤 정보를 알기 위해서 GetScrollPosition() 를 사용합니다.

이제 스크롤 된 후의 현재 마우스 위치 정보를 아래와 같이 구합니다.
CPoint scrollpos = point + GetScrollPosition();

※예로 제가 작업했던 코드 일부 여기에 포스트...
void CScrollTest2View::OnMouseMove(UINT nFlags, CPoint point) { if( m_oldPoint == point ) return; CPoint scrollpos = GetScrollPosition(); TRACE2("현재 스크롤값:%d, %d\n", scrollpos.x, scrollpos.y); int x = scrollpos.x % GridSize.cx; int y = scrollpos.y % GridSize.cy; m_ptGrid = CPoint( ((int)((point.x+x) / GridSize.cx)) * GridSize.cx, ((int)((point.y+y) / GridSize.cy)) * GridSize.cy ); TRACE2("현재 그리드 위치:%d, %d\n", m_ptGrid.x, m_ptGrid.y); m_ptGrid.x -= x; m_ptGrid.y -= y; TRACE2("현재 그리드 위치:%d, %d\n", m_ptGrid.x, m_ptGrid.y); XORPen(); m_oldPoint = point; CScrollView::OnMouseMove(nFlags, point); } void CScrollTest2View::OnLButtonDown(UINT nFlags, CPoint point) { CPoint pos = CPoint(0, 0); GetCursorPos( &pos ); this->ScreenToClient( &pos ); CScrollView::OnLButtonDown(nFlags, point); } void CScrollTest2View::OnLButtonUp(UINT nFlags, CPoint point) { TRACE2("MousePos:%d, %d\n", point.x, point.y); CPoint scrollpos = point + GetScrollPosition(); TRACE2("ScrollPosition:%d, %d\n", scrollpos.x, scrollpos.y); m_ptGrid = CPoint( ((int)(scrollpos.x / GridSize.cx)) * GridSize.cx, ((int)(scrollpos.y / GridSize.cy)) * GridSize.cy ); m_vPos.push_back( m_ptGrid ); OutCursorDCxRop(); Invalidate(); CScrollView::OnLButtonUp(nFlags, point); }

이 값을 사용해서 여러가지 동작들을 추가 하시면 됩니다.
하지만 이것저것 하다 보면 GetScrollPosition()의 값을 보정해서 해줘야 하는 경우가 많이 발생을 하게 됩니다. 그때 마다 너무 많은 작업량이 좀 힘들더라구요.

팁을 드리면 CScrollView에 CView를 추가한 후에 CScrollView의 Create(), OnSize() 부분에 코드를 적당히 넣어서 CView를 내부에 크기 만큼 심어 놓습니다.
그렇게 한후에 마우스 픽킹을 해보시면 마우스 이벤트가 CScrollView로 가지 않고 CView로 가는 것을
확인할 수 있을겁니다.
더욱더 놀라운건 ^^.. 스크롤로 해서 화면을 움직여도 현재 찍힌 화면의 좌표는 스크롤로 이동한 좌표 즉, 화면이 스크롤 만큼 이동한 후에 CView의 이동된 좌표값을 바로 리턴해 준다는 겁니다.

이상.. 가볍게 적었지만 CView 추가 하는 부분은 생략하도록 하겠습니다. (귀찮네요 ^^)
모르거나 필요하시면 제가 바로 답변 드릴테니 뎃글 달아 주세요..
Posted by gsi
: