[MFC]타이틀바가 없을 경우 윈도우의 이동

윈도우에 타이틀바가 없을 경우에는 윈도우의 임의 영역을 캡션바처럼 사용하여 윈도우를 이동시키도록 할 수 있다. 마우스 버튼이 눌리면 윈도우의 캡션바가 눌렸는지, 경계선이 눌렸는지, 클라이언트 영역이 눌렸는지, 시스템 메뉴가 눌렸는지 등을 판단하기 위해 OnNcHitTest 함수가 호출된다. ( WM_NCHITTEST 메시지 ) 이 함수를 오버라이딩하여 일정 영역이 눌렸을 때 HTCAPTION을 리턴하면 그 부분이 눌렸을 때 마치 캡션바가 눌린 것처럼 동작하게 된다.

UINT CTestDlg::OnNcHitTest( CPoint point )
{
UINT hit = CDialog::OnNcHitTest( point );
if( hit == HTCLIENT ) // 클라이언트 영역이 눌렸을 때
return HTCAPTION; // 타이틀바가 눌린 것처럼 동작을 시킨다.
else
return hit;
}

by 이루마 | 2010/01/21 11:08 | MFC | 트랙백 | 덧글(0)

IME 메시지

시스템은 IME 윈도우의 변화나 조립 문자열의 변화 등 IME의 모든 상태 변화에 대해 WM_IME_로 시작되는 IME 메시지를 가진 윈도우에게 보낸다. 이 메시지들을 무시하고 DefWindowProc으로 보낼 경우 결국 응용 프로그램은 완성된 문자에 대해서만 WM_CHAR 메시지를 받게 될 것이다.

다음은 한글조립과 관련된 메시지이다.

WM_IME_STARTCOMPOSITION
 IME가 조립 문자열을 만들기 직전에 보낸다. 조립을 시작한다는 단순한 통지일 뿐 wParam, lParam으로 전달되는 인수는 없으며 리턴값도 아무 의미가 없다. 디폴트 IME 윈도우를 사용한다면 이 메시지에 관심을 가질 이유가 없지만 커스텀 IME 윈도우를 작성할 경우 이 메시지를 커스텀 IME 윈도우에게 전달해야 한다. 디폴트 IME 윈도우는 이 메시지를 받았을 때 조립 윈도우를 보여주는데 이 메시지를 DefWindowProc으로 보내지 않으면 조립 윈도우는 나타나지 않는다.

WM_IME_ENDCOMPOSITION
 조립이 끝났다는 통지 메시지이며 역시 인수와 리턴값이 없다. 커스텀 IME 윈도우를 작성하지 않는다면 역시 이 메시지도 무시하면 된다.

WM_IME_COMPOSITION
 가장 중요하고 핵심적인 IME 메시지이며 조립 상태가 변경될 때마다 보내진다. 한글의 경우 한 음소가 입력될 때마다 이 메시지가 발생하는데 조립중인 문자를 보여주고 싶으면 이 메시지를 처리해야 한다. wParam에는 조립중인 문자의 코드가 전달되는데 이 코드는 2바이트의 DBCS 문자로 조립중인 중간 문자 코드이다. lParam은 조립 상태가 어떻게 변경되었는지, 이 문자를 어떻게 처리해야 하는지를 나타내는 플래그의 집합이다. 많은 수의 플래그들이 있지만 한글의 경우 다음 두 플래그가 특히 중요하다.

GCS_COMPSTR : 아직 문자를 조립중이라는 뜻이다. 즉 아직 한 음절이 완성되지는 않았다.
GCS_RESULTSTR : 한 음절이 완전히 조립했다는 뜻이다.

lParam 에 이 플래그들이 있는지를 살펴 보면 문자가 완성된 것인지 아니면 아직도 조립하고 있는 중인지를 알 수 있다.

WM_IME_CHAR
 문자 하나가 완성되었을 때 보내진다. wParam으로 완성된 문자의 코드가 전달되는데 1바이트 문자만 전달하는 WM_CHAR 메시지와는 달리 이 코드는 DBCS일 수도 있다. 단 모든 문자를 2바이트로 취급하는 유니코드 윈도우에서는 WM_CHAR와 WM_IME_CHAR는 완전히 동일해진다. 완성된 문자를 직접 처리하려면 이 메시지를 처리하고 아니면 DefWindowProc으로 보낸다. 이 메시지를 무시하면 한글 한 문자에 대해 WM_CHAR 메시지를 두 번 받게 될 것이다.

WM_IME_SETCONTEXT
 응용 프로그램이 활성/비활성화될 때 보내진다. wParam이 TRUE이면 활성화되었다는 뜻이고 FALSE 이면 비활성화 되었다는 뜻이다. 한글 윈도우즈의 경우 DefWindowProc으로 이 메시지를 보내기만 하면 된다. 커스텀 IME 윈도우를 생성할 경우 이 메시지를 받았을 때 ImmIsUIMessage 함수를 호출하여 조립 윈도우와 후보 윈도우를 보이도록 해야 한다.

WM_IME_NOTIFY
 IME 윈도우가 변경되었다는 통지 메시지이다. wParam으로 어떤 변경인지가 전달되는데 예를 들어 후보 윈도우가 열렸다거나 후보 목록이 변경되었다는 사실이 통지된다. 한글 입력, 영문 입력모드를 변경할 때도 이 메시지가 전달된다. 특정 IME 이벤트에 반응하고자 할 때 이 메세지를 처리한다.


출처 : http://www.winapi.co.kr

by 이루마 | 2010/01/12 10:44 | WinAPI | 트랙백 | 덧글(0)

IME 세 가지 윈도우

1. 상태 윈도우( Status Window )
 : 현재 IME가 동작중임을 표시하고 변환 모드를 변경.




2. 조립 윈도우( Composition Window )
 : 텍스트를 입력할 때만 나타나며 현재 조립중인 문자를 보여준다.
   영문이나 숫자, 기호와 같이 조립이 필요없는 문자를 입력할 때는
   나타나지 않으며 한글을 입력할 때만 보인다.



3. 후보 윈도우( Candidate Window )
 : 조립중인 문자나 또는 선택된 문자에 대한 후보 문자를 보여주고 선택하도록 한다.
   한글 윈도우에서는 한자를 입력할 때만 후보 윈도우를 볼 수 있다.





출처 : http://www.winapi.co.kr

by 이루마 | 2010/01/12 10:22 | WinAPI | 트랙백 | 덧글(0)

.exe 파일이 위치한 곳 알아내기

.exe 파일이 위치한 곳 알아내기

CString sPath;
GetModuleFileName( AfxGetApp()->m_hInstance, sPath.GetBuffer( MAX_PATH ), MAX_PATH );
( GetModuleFileName( NULL, sPath.GetBuffer( MAX_PATH ), MAX_PATH ); )
sPath.ReleaseBuffer();

sPath.ReverseFind( '\\' );
  -> sPath의 뒤에서부터 '\'이 있는 위치를 찾아 반환한다.

by 이루마 | 2010/01/11 17:05 | MFC | 트랙백 | 덧글(0)

백버퍼 표면의 Width, Height 얻기

백버퍼 표면의 Width, Height 얻기


LPDIRECT3DSURFACE9  pBackBuffer = NULL;
D3DSURFACE_DESC     d3dsd;
m_lpD3DDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
pBackBuffer->GetDesc( &d3dsd );
pBackBuffer->Release();

m_nBackBufferWidth  = d3dsd.Width;
m_nBackBufferHeight  = d3dsd.Height;

by 이루마 | 2010/01/09 11:13 | DirectX | 트랙백 | 덧글(0)

윈도우 모서리 둥글게 만들기

윈도우 모서리 둥글게 만들기

- 사용되는 함수

1. HRGN CreateRoundRectRgn(
int nLeftRect, // 윈도우의 시작 X 좌표( Left )
int nTopRect, // 윈도우의 시작 Y 좌표( Top )
int nRightRect, // 윈도우의 끝 X 좌표( Right )
int nBottomRect, // 윈도우의 끝 Y 좌표( Bottom )
int nWidthEllipse, // 가로축으로 어느정도 둥글게 할 것인지( 0 ~ width )
int nHeightEllipse // 세로축으로 어느정도 둥글게 할 것인지( 0 ~ height )
  )

  참고로 nWidthEllipse, nHeightEllipse 값은 윈도우의 Width와 Height에 가까울수록 원형에 가까운 모양이 된다.

2. int SetWindowRgn( HWND hWnd, // 윈도우 핸들
       HRGN hRgn, // 영역 핸들
       BOOL bRedraw // 윈도우를 다시 그릴것인지
  )

  MFC에서는 hWnd 인자는 빠지고 HRGN hRgn, BOOL bRedraw 두 개의 인자만 사용한다.

- 사용 방법

API

  case WM_CREATE:

CRect rect;

GetClientRect( &rect );

HRGN hRgn;

hRgn = CreateWindow( rect.left, 
 rect.top, 
 rect.right, 
 rect.bottom, 
 rect.Width(), 
 rect.Height() );

SetWindowRgn( hWnd, hRgn, FLASE );

 위와 같이 하면 hWnd의 윈도우는 가장 원형에 가까운 채로 변형된다. 
 마지막 2개의 인자를 변형해 가면서 모서리를 어느정도 둥글게 할 지 정하면 된다.

by 이루마 | 2010/01/07 10:51 | WinAPI | 트랙백 | 덧글(0)

Visual Studio .NET 이상의 버전에서 문서화를 위해 유용한 Kings Tools

*아래의 링크에서 Kings Tools의 소스 및 인스톨 버전, Kings Tools의 사용법등을 알 수 있다.
 코드 프로젝트 ( Kings Tools )

*Kings Tools에 있는 Doxygen이 최신 버전이 아닐 경우엔 Doxygen 파일을 받아서 설치 해주자.
 
  1. Kings Tools를 먼저 설치한다. 
  2. Doxygen의 최신 버전을 설치 했다면 Doxygen/Bin 폴더 안에 doxygen.exe 파일을 복사해서,
      Kings Tools 폴더 안에 덮어 쓰자.
  3. Graphviz 도 설치를 했다면 Graphviz/Bin 폴더 안에
     dot.exe 파일을 복사해서 역시나 Kings Tools 폴더 안에 덮어 쓰자.

P.S. 깨지지 않는 한글 버전을 원한다면 Doxygen v1.5를 사용하여야 한다. 
       그 이외의 버전에서는 100% 완전한 한글 사용이 되지 않는다.
       Doxygen 1.5 버전은 첨부파일로 올려 놓는다. 최신 버전을 원한다면
       Doxygen 홈페이지에 가서 다운 받으면 된다.


*사용시 유의점

  - 소스 폴더 경로는 반드시 영문이어야 한다. 한글 경로이면 에러 발생

kingssetup-agebreak_VS2005.zip
doxygen-1.5.0-setup.zip

by 이루마 | 2009/12/08 01:23 | 문서화 | 트랙백 | 덧글(0)

escape sequence의 종류

\a     벨 소리
\b     Backspace
\f      Formfeed
\n     Newline
\r      Carriage return
\t      수평 탭
\v     수직 탭
\\    백슬러쉬
\?     물음표
\'      작은 따옴표
\"      큰 따옴표
\o     8진수
\x     16진수 

by 이루마 | 2009/09/24 22:14 | C | 트랙백 | 덧글(0)

불교, 어떻게 믿을 것인가?

요즘 세상은 믿을 것이 없다고 한다. 남은 말할 것도 없고 친척, 심지어는 자식까지도 믿을 것이 못된다. 뉴스나 광고는 물론이지만, 학설까지도 견해가 엇갈려 어떤 쪽을 따라야 할지 알 수가 없다. 재산과 권리와 명예라는 것은 본래부터 덧없는 것이지만, 심지어 종교와 성직자까지도 불신을 받고 있다.

'불교, 어떻게 믿을 것인가?'라는 주제는 불교 신앙을 어떻게 믿을 것인가라는 믿음의 방법을 묻고 있는 말이지만, 불교를 어떻게 믿을 수 있겠느냐는 불신의 뉘앙스가 먼저 풍기는 것은 아이러니컬하다. 그러나 인간이 믿음을 상실하고 살수가 있을까? 오늘 힘들여 일하는 것은 내일을 믿기 때문이고, 오늘 힘들여 가르치는 것은 다음 세대를 기대하기 때문이다.

내일은 그만두고라도, 지금 이 시점에 우리가 존재하고 있다는 것부터가 무엇인가를 믿고 그것에 의지하고 있음을 뜻한다. 따라서 믿음은 인간 존재를 가능케 하는 정신적 바탕이라고 할 수 있다.

그것이 흔들릴 때 인간은 불안해지고, 그것이 제약될 때 인간은 외로워지고, 그것이 사라질 때 인간은 죽게 된다. 반대로 그것이 일어날 때 인간은 소생하고, 그것이 확장되고 튼튼해질 때 인간은 외로움과 불안을 극복하여 밝고 힘찬 삶을 맞게 되는 것이다.

믿음은 이와 같이 인간 존재의 정신적 바탕이 되기에, 사람들은 믿음의 위험성을 겪으면서도 믿음을 또한 구하지 않을 수가 없다. 한번 속은 친구라면 아예 돌아서야 함에도 불구하고 두번 세번 속는 것은 어리석음 때문이라기보다는 어딘가 믿고 싶은 인간성의 나약함 때문일 것이다. 이러한 인간성의 나약함은 재산의 파탄이나 불치병과 같은 절망적인 상황에서는 더욱 절실하게 믿음을 구하게 된다.

그리하여 물에 빠진 사람이 지푸라기라도 잡듯이 아무 교설이나 닥치는 대로 믿음을 일으킨다. 그리고 간혹 그런 맹목적인 믿음은 강열하고 순수한 만큼 절망적인 상황을 이겨내는 절대적인 힘이 되기도 한다. 그래서 믿음은 그 내용이 진리냐 아니냐에 관계없이 위대한 것이라고 말하고, 그런 믿음이 종교적 믿음의 특징인 것처럼 생각되기도 한다.

그러나 그러한 맹목적인 믿음을 진정한 종교적 믿음이라고 할 수가 있을까?

진정한 믿음이란 끝내 허망하지 않은 영원한 것이어야 할 것이다. 따라서 그 대상은 거짓이 아니라 진실이어야 하고, 일시적인 것이 아니라 영원한 것이어야 하고, 부분적인 것이 아니라 보편적인 것이어야 한다. 이러한 믿음의 대상을 우리 주변에서 찾는다면 그것은 종교라고 해야 할 것이다. 인류가 발생시킨 여러가지 문화현상 중에서 영원한 진리와 진정한 가치를 체계적으로 제시하고 있는 것은 그래도 종교이기 때문이다. 그러나 오늘날 우리 사회의 종교 현황은 어떤가?
불교를 비롯해서 기독교, 유교, 도교, 무속 등과 같은 여러가지 종교관념이 난립해 있다. 공산주의적인 유물론도  고대 사회에서는 일종의 종교 관념이었던 것이다. 뿐만 아니라 각 종교가 내세우고 있는 진리의 내용은 왜  그렇게 서로 다른가? 불교에서는 세계를 인간의 마음이 만들었다고  하고, 기독교에서는 하느님의 창조라고 하고, 유교에서는 음양(陰陽)의 원리에 의한  것이라 한다.  영원하고 궁극적인 진리는 하나여야 할 것인데, 왜 이렇게 각 종교의 주장은 서로 내용이 엇갈리는 것일까? 종교를 믿음의 대상으로 삼고자 할 때,  우리에게는 다시 이런 문제가 대두되는 것이다.

이럴 경우 이에 대해 우리가 취할 수 있는 길은 두가지라고 할 수 있다. 하나는 어느 종교이든 하나를 골라 덮어놓고 믿는 길이고, 다른 하나는 각 종교의 교설에 관심을 갖고 그것이 과연 진리인가 아닌가를 먼저 문제로 삼아 보는 경우이다. 

이런 두 가지 방향에서 어떤 쪽을 택할 것인가는 각자의 자유이겠지만, 전자는 결코 종교적 자세라고 볼 수가 없다. 왜 그러냐면 종교는 항상 영원한  진리와 진정한 가치를  추구하는 것이기 때문이다. 그리고 아무 종교나 하나 골라 덮어놓고 따른다는 그러한 마음은, 그것이 바라는 세속적인 물질적 효과가 나타나지 않을 때는,  언제라도 딴 곳으로 눈을  돌린다.

따라서 진정한 종교적 믿음은 무엇보다도 먼저 종교적 교설의 진리성 여부에 관심을 갖고 그것을 먼저 확인코자 하는데에  있다고 말할 수가 있다.  종교적 믿음의 선행 조건을 이렇게 생각할 때, 우리에게는 이제 판단의 어려움이 따르게 된다. 그것은 아직 믿음의 단계에도 들어가지 못한 사람이 어떻게 그 종교에서 설하는 교설의 내용이 진리인지 아닌지를 헤아릴 수 있겠느냐는 것이다.  기독교에서는  인간은 신을 인식할  수 없다고 하고, 불교에서도 참다운 진리는  오직 부처와 부처만이 주고받을 수 있을 뿐이라고 한다.
따라서 믿어 보기도 전에 교설의 내용이 진리인지 아닌지를 알고자 하는 것부터가 잘못이요, 오만이라고 해야 할지 모른다.
그러나 범속한 인간의 지적 능력이 아무리 불완전한 것이라고 해도, 선.악이나 진위(眞僞)와 같은 것을 전적으로 식별한 수 없을 만큼 그렇게  불완전한 것은 아니다.  기독교와 같은 종교에서도 인간은 신을 완전하게는 알 수 없지만, 신이 스스로 그 자신을 인간에게 계시(啓示)하므로써 인간은 신에 대한 부분적인 지식을 얻을 수가 있다고 한다.
따라서 우리가 결혼 대상을 고를 때 먼저 그 사람이 믿음직한가 아닌가를 살펴보듯이 종교에 대해서도 과연 그것이 믿음직한 진리인가 아닌가를 생각해 볼 필요가 있는 것입니다.

by 이루마 | 2009/01/24 20:58 | 불교 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶