'정렬'에 해당되는 글 3건

  1. 2008.11.01 [펌]C#을 이용한 정렬 알고리즘... 2
  2. 2008.04.06 윈도우창 이동 프로그램 2
  3. 2007.05.31 리스트컨트롤 정렬... 1
C#을 이용한 정렬 알고리즘을 공부하다가 찾은 해외 사이트이다.

소스코드가 깔끔하게 잘되있고, 정렬외에도 유용한 자료가 많다.










Posted by Gungume
,




모니터를 30인치로 바꾼 후 해상도를 2560*1600으로 사용하고 있다.

프로그래밍을 할때는 전체화면으로 작업을 하면 편하지만, 이 해상도로 인터넷 등을 하면 너무 크기 때문에 가로크기를 보통 가로해상도의 절반 크기인 1280으로 맞춘후에 왼쪽에 붙혀서 사용하곤 한다.

그러다 가끔은 하나의 프로그램을 모니터화면상의 가운데로 놓고 쓰거나(한쪽에 붙혀서 사용하면 나도 모르게 몸이 그쪽으로 치우쳐진다;;;), 웹브라우저+문서프로그램 등 2개의 프로그램을 동일한 크기로 좌우로 나눠서 사용해야하는 경우가 생긴다.

프로그램의 위치를 가운데나 기타 위치로 이동하는 경우는 그냥 마우스로 이동시켜도 되지만 성격상 위치를 딱 맞춰주는걸 좋아하고(예전에 자석윈도우 프로그램을 썼었는데 비스타 64비트에서는 작동을 안한다...), 프로그램 2개를 나란히 띄우는 경우도 '창 세로 정렬 보기'를 이용하면 알아서 크기에 맞춰서 배치는 해주지만 왼쪽에 웹브라우저 오른쪽에 문서창 이렇게 하고 싶은데 위치가 서로 반대로 되는 경우도 있다.(원하는 위치지정이 가능한지는 모르겠지만 내 지식으로는 모르겠다;;;)

그래서 간단한 프로그램을 작성했다. 키보드 후킹을 이용해서 Ctrl+1, 2, 3키를 눌렀을 경우 작업표시줄에서 현재 활성화된 윈도우에 대해서 각각 왼쪽, 가운데, 오른쪽 정렬을 하게 만들었다.

내 편의에 맞게 만들어서 고해상도 모니터외에는 별로 쓸모없는 프로그램인것 같긴하다. ㅡㅡ

위에서 설명했듯이 우선 작업표시줄에서 현재 활성화된 윈도우에 대해서 작동을 하고 윈도우의 크기 중 세로길이는 화면상에서 작업표시줄을 제외한 영역중 가장 상단부터 하단까지 꽉 채우도록 지정되어 있다.

그리고 가로 크기는 해상도/2로 정했는데 이것역시 작업표시줄을 제외한 해상도를 사용했다.

즉, 프로그램 2개를 동시에 띄운후에 이 프로그램을 사용해서 위치를 지정해주면 작업표시줄의 크기와 위치에 상관없이 2개의 프로그램을 동일한 크기로 띄울 수 있다.

아래는 DLL에 작성된 키보드 후킹과 관련된 간단한 소스이다. 후킹쪽을 제대로 공부안하고 이전에 가지고 있던 소스 등을 활용해서 만들었기 때문에 조건문 등의 처리가 제대로 된건지 모르겠다...일단 작동은 한다;;;

LRESULT CALLBACK KeyboardHookProc(int code, WPARAM key, LPARAM lParam)
{
	if (code != HC_NOREMOVE) 
	{		
		if (lParam<0)
		{
			if(GetKeyState(VK_CONTROL)<0)
			{
				RECT rect;
				HWND Wnd = ::GetForegroundWindow();
				SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);

				switch(key)
				{
					case '1' : 
						rect.left = 0;
						rect.right = rect.right/2;
						::MoveWindow(Wnd, rect.left, rect.top, rect.right, rect.bottom, TRUE);
						break;

					case '2' : 
						rect.left = rect.right/2/2;
						rect.right = rect.right/2;
						::MoveWindow(Wnd, rect.left, rect.top, rect.right, rect.bottom, TRUE);
						break;

					case '3' : 
						rect.left = rect.right/2;
						rect.right = rect.right/2;
						::MoveWindow(Wnd, rect.left, rect.top, rect.right, rect.bottom, TRUE);

					break;
				}
			}
		}
	}
	return CallNextHookEx(NULL, code, key, lParam);
}  

메인 프로그램에서는 단순히 후킹작동과 해제(프로그램 시작과 종료시에 해당기능 호출), 트레이 아이콘 등 자잘한 것만 있다.

프로그램을 실행하면 아무 화면도 안나오고 단순히 트레이쪽에 아이콘 하나만 등록되면서 프로그램이 작동된다. 프로그램을 종료하고 싶으면 트레이아이콘을 더블클릭하거나 마우스 우클릭을 한 후에 '종료'를 누르면 된다.

- 참고 자료 -
트레이 아이콘 : CodeGuru
MFC 모달 다이알로그를 숨김 상태로 시작 : Jiniya.net

(사용언어 및 제작툴 : MFC / VS2008)


최신 버전 받기
2009/07/09 - [Win32 API] - Windows Layout (윈도우창 이동 프로그램 - 3)

Posted by Gungume
,




리스트컨트롤에서 칼럼을 클릭하면 정렬이 되는 예제소스이다...

사용된 구조체와 정렬함수를 예전에 미니탐색기 만들때 데브피아에서 구한것 같은데 정확한 출처는 기억이 안난다;;;

어쨌든 첨부파일은 미니탐색기에서 사용되었던 소스를 가져다가 간단하게 리스트컨트롤의 정렬기능을 만든 예제소스이다...

첨부파일에서 'Sort Class.zip'은 MFC용 클래스로 따로 만든 리스트컨트롤이다.

클래스는 그냥 리스트컨트롤에 컨트롤변수 연결후에 해당클래스로 이름을 바꿔서 사용하면 된다...

정렬은 리스트컨트롤의 SortItems() 함수를 이용하는데 원리를 대략적으로만 이해해서 자세한건 모른다;;;

이해한데로 대충 설명하면 아래 정렬함수 소스가 SortItems() 함수의 첫번째 인자로 들어가는 함수의 구현부로써 여기서 정렬부분을 구현한다.

lParam1, 2에 리스트컨트롤 목록에 있는 항목이 넘어오면 그것을 이용 값을 얻고 두개의 값을 비교해서 리턴 시켜주는것을 반복함으로써 정렬이 이뤄진다...


아래는 프로그램 스샷으로 랜덤으로 생성된 숫자를 리스트컨트롤 목록에 넣은 후 첫번째 칼럼을 정렬했을 때의 결과이다...

데이터 정렬

(사용언어 및 제작툴 : MFC / VS2005)

Posted by Gungume
,