'API Reference'에 해당되는 글 75건

  1. 2007.10.17 [TIP] wparam, lparam 2
  2. 2007.10.17 이 카테고리는....
  3. 2007.10.17 DialogBox
  4. 2007.10.17 대화상자
  5. 2007.10.17 Static
  6. 2007.10.17 ScrollBar
  7. 2007.10.17 ComboBox
  8. 2007.10.17 ListBox
  9. 2007.10.17 EDIT
  10. 2007.10.17 CheckRadioButton

[TIP] wparam, lparam

API Reference 2007. 10. 17. 11:05

WM_CHAR


wParam

WM_CHAR 메시지는 입력된 문자의 코드를 wParam 으로 전달하며 wParam 의 값을 읽어 사용자가 어떤 문자키를 눌렀는지 알 수 있다.

메시지의 추가 정보는 받고자하는 타입에 맞게 적당히 캐스팅해야 한다.

( TCHAR )wParam;


lParam

키의 눌림/놓음 상태, 메시지가 보내지기 전 키의 상태, Alt 키, 오른쪽 Alt, Ctrl 키, 반복 카운트 등의 정보




WM_KEYDOWN


wParam

WM_KEYDOWN 메시지는 키보드를 누를 때마다 윈도우로 전달되는데 문자가 아닌 모든 키에 대해서도 발생한다. 단, Alt 키와 윈도우 키, 한영 전환키 등의 특수 키 몇 가지는 제외된다.

이때 wParam 으로는 문자 코드가 아닌 가상 키코드라는 것이 전달된다.

숫자 및 영문자의 가상 키코드는 아스키 코드와 같으며 매크로 상수는 정의되어 있지 않으므로 문자 상수와 wParam 을 바로 비교하면 된다. 단, 영문자의 경우는 대문자 코드와 일치되어 있으므로 반드시 대문자와 비교해야 한다.

if( wParam == 'Z' )


lParam

WM_CHAR 메시지와 동일하나 잘 사용되지 않는다.




Mouse 입력에 관한 메시지


wParam

마우스 버튼의 상태와 키보드 조합 키( shift, Ctrl )의 상태가 전달된다.


lParam

하위 워드에 마우스 버튼이 눌러진 x 좌표, 상위 워드에 y 좌표를 가지며 좌표값을 검출해 내기 위해 LOWORD, HIWORD 등의 매크로 함수를 사용한다.

( LOWORD( lParam ), HIWORD( lParam ) )



wParam, lParam 의 상하위 워드/바이트 를 분리( LOWORD, HIWORD, LOBYTE, HIBYTE )하는 매크로


#define LOWORD( l )     ( ( WORD )( l ) )


#define HIWORD( l )      ( ( WORD )( ( ( DWORD )( l ) >> 16 ) & 0xFFFF ) )


#define LOBYTE( w )    ( ( BYTE )( w ) )


#define HIBYTE( w )     ( ( BYTE )( ( ( WORD )( w ) >> 8 & 0xFF ) )



두 개의 16비트값을 가지고 32비트값을 조립하는 매크로


#define MAKEWORD( a, b )

    ( ( WORD )( ( ( BYTE )( a ) ) | ( ( WORD )( ( BYTE )( b ) ) ) << 8 ) )


#define MAKELONG( a, b )

    ( ( LONG )( ( ( WORD )( a ) ) | ( ( DWORD )( ( WORD )( b ) ) ) << 16 ) )




LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );


강제로 메시지가 발생한 것처럼 만드는 함수


hWnd 윈도우로 Msg 메시지를 보내며 세 번째, 네 번째 인수는 메시지의 추가 정보인 wParam, lParam 이며 보내는 메시지에 따라 의미는 달라진다.




WM_SIZE


wParam

이 메시지가 발생한 이유를 나타내는 플래그가 전달된다.


SIZE_MAXHIDE

다른 윈도우가 최대화되어 이 윈도우가 가려졌다.


SIZE_MAXIMIZED

최대화되었다.


SIZE_MAXSHOW

다른 윈도우가 원래 크기로 복구되어 이 윈도우가 드러났다.


SIZE_MINIMIZED

최소화되었다.


SIZE_RESTORED

크기가 변경되었다.



lParam

윈도우의 크기가 변경될 때 하위 워드에 변경된 후의 윈도우 폭이, 상위 워드에 높이가 전달된다.




WM_MOVE


lParam

윈도우의 위치가 변경될 때마다 보내지며 하위 워드에 윈도우의 새 X 좌표, 상위 워드에 윈도우의 새 Y 좌표가 전달된다.




WM_COMMAND( 가장 중요하므로 암기 필수!! )


프로그램 실행중에 사용자가 메뉴 항목을 선택하거나 액셀러레이터를 누를 때 발생한다. 또한 버튼, 에디트 박스 등의 컨트롤이 부모 윈도우로 통지 메시지를 보낼 때도 발생한다.


wParam

하위 워드로 어떤 메뉴 항목이 선택되었는가가 전달되며 LOWORD( wParam ) 을 읽어 판단할 수 있다.


LOWORD( wParam )

메뉴나 액셀러레이터, 컨트롤의 ID


HIWORD( wParam )

컨트롤이 보내는 통지 메시지( 통지 코드 ), 메뉴가 선택된 경우는 0 이 되며 액셀러레이터가 선택된 경우는 1 이 된다.


lParam

통지 메시지를 발생시킨 컨트롤의 윈도우 핸들,

메시지를 보낸 차일드 윈도우의 윈도우 핸들

Posted by 명혀니
,

가남사의 API 완전정복의 책 내용을 1장부터 7장까지 공부하면서

정리해놨던 자료를 간단히 올려봤습니다 ^^


도움이 되셧음 하네요 ^^

Posted by 명혀니
,

DialogBox

API Reference 2007. 10. 17. 11:02

int DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate,

        HWND hWndParent, DLGPROC lpDialogFunc );


대화상자를 호출할 때는 DialogBox 함수를 사용하며 이 함수는 대화상자의 출력, 운영 및 종료까지 대화상자에 관한 모든 처리를 다 책임진다.



hInstance

대화상자 리소스를 가진 인스턴스의 핸들


lpTemplate

대화상자 템플릿의 리소스 ID


hWndParent

대화상자를 소유할 부모 윈도우


lpDialogFunc

대화상자 프로시저의 이름



DialogBox 함수는 hInstance 의 리소스 중 lpTemplate 가 지정하는 템플릿을 읽어와 대화상자를 만들어 화면에 출력한다. 이때 템플릿에 기록된 차일드 컨트롤의 정보를 참조하여 포함된 컨트롤도 생성하여 배치한다.


그리고 lpDialogFunc 함수로 대화상자 운용에 필요한 메시지를 보내 대화상자가 제대로 실행될 수 있도록 하고 lpDialogFunc 함수에서는 대화상자와 그 차일드들간의 통신을 처리한다.


사용자가 대화상자를 닫으면 DialogBox 함수가 리턴하는데 이때 리턴되는 값은 대화상자의 종료 함수인 EndDialog 함수가 지정하는 값이다.

Posted by 명혀니
,

대화상자

API Reference 2007. 10. 17. 11:02

대화상자는 사용자로부터 복잡한 정보를 효율적으로 입력받기 위해 사용된다.

동작 방식에 따라 크게 모달형과 모델리스형으로 나뉘어진다.


모달( Modal )

대화상자를 닫기 전에 다른 윈도우로 전환할 수 없으며 반드시 확인( 또는 OK ) 버튼이나 취소( 또는 CANCEL ) 버튼을 눌러 대화상자를 닫아야 다른 윈도우로 전환할 수 있다.


모델리스( Modeless )

대화상자를 열어 놓은 채로 다른 윈도우로 전환할 수 있는 대화상자



대화상자를 만들기 위해서는 기본적으로 대화상자 템플릿과 대화상자 프로시저가 있어야 한다.


대화상자 템플릿

대화상자의 모양과 대화상자 내의 컨트롤 배치 상태가 저장되는 이진 정보이며 리소스로 작성된다.


대화상자 프로시저

윈도우 프로시저가 윈도우에서 발생하는 메시지를 처리하는 것과 마찬가지로 대화상자 프로시저는 대화상자에서 발생하는 메시지를 처리한다.

Posted by 명혀니
,

Static

API Reference 2007. 10. 17. 11:01

스태틱( static )은 다른 컨트롤에 비해 비교적 간단한 컨트롤이다. 사용자로부터 입력을 받아들이는 기능은 없고 오로지 문자열을 보여주는 것이 기능의 전부이기 때문이다.


주로 에디트나 다른 컨트롤 옆에 위치하며 컨트롤의 용도를 설명하는 역할을 한다.


스태틱 컨트롤을 만들 때는 윈도우 클래스를 "static" 으로 지정한다.

Posted by 명혀니
,

ScrollBar

API Reference 2007. 10. 17. 11:01

스크롤 바는 "scrollbar" 윈도우 클래스로 생성하며 수평 스크롤 바일 경우 SBS_HORZ 스타일을, 수직 스크롤 바일 경우는 SBS_VERT 스타일을 지정한다.

스크롤 바는 범위와 현재 위치값을 가지는데 다음 두 함수로 이 값들을 지정한다.


BOOL SetScrollRange( HWND hWnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw );


int SetScrollPos( HWND hWnd, int nBar, int nPos, BOOL bRedraw );



SetScrollRange 함수로 최대값( nMaxPos ), 최소값( nMinPos )을 지정하되 첫 번째 인수가 스크롤 바의 윈도우 핸들이다. 두 번째 인수 nBar 는 메인 윈도우에 부착된 표준 스크롤 바 또는 별도의 스크롤 바 컨트롤을 지정하는데 이 값이 SB_CTL 이면 별도의 컨트롤을 지정한다.


SetScrollPos 는 스크롤 바의 현재 위치를 세 번째 인수 nPos 로 지정한다.



다른 컨트롤들은 자신에게 변화가 있을 때 부모 윈도우로 WM_COMMAND 통지 메시지를 보내는데 비해 스크롤 바는 WM_HSCROLL( 수평일 경우 ), WM_VSCROLL( 수직일 경우 ) 이라는 별도의 메시지를 부모 윈도우로 보낸다. 이 메시지들은 단순한 사건의 발생뿐만 아니라 스크롤 상태에 대한 다음과 같은 추가 정보를 같이 보내야 하는데 WM_COMMAND 의 파라미터는 이미 용도가 예약되어 있으므로 이 정보를 보낼 수 없다.


LOWORD( wParam )

스크롤 바 내의 어디를 눌렀는가?


HIWORD( wParam )

현재 위치


lParam

스크롤 바의 윈도우 핸들



LOWORD( wParam ) 으로 전달되는 값은 사용자의 스크롤 요구사항을 나타내며 가능한 값의 종류는 다음과 같다.


SB_LINELEFT, SB_LINEUP

사용자가 왼쪽 화살표 버튼을 눌렀다는 뜻이며 이때는 왼쪽으로 한 단위 스크롤시킨다.


SB_LINERIGHT, SB_LINEDOWN

사용자가 오른쪽 화살표 버튼을 눌렀다는 뜻이며 이때는 오른쪽으로 한 단위 스크롤시킨다.


SB_PAGELEFT, SB_PAGEUP

사용자가 왼쪽 몸통 부분을 눌렀다는 뜻이며 이때는 한 페이지 왼쪽으로 스크롤시킨다.


SB_PAGERIGHT, SB_PAGEDOWN

사용자가 오른쪽 몸통 부분을 눌렀다는 뜻이며 이때는 한 페이지 오른쪽으로 스크롤시킨다.


SB_THUMBPOSITION

스크롤 박스를 드래그한 후 마우스 버튼을 놓았다.


SB_THUMBTRACK

스크롤 박스를 드래그하고 있는 중이다. 이 메시지는 마우스 버튼을 놓을 때까지 계속 전달된다.

Posted by 명혀니
,

ComboBox

API Reference 2007. 10. 17. 11:01

콤보 박스는 에디트 컨트롤과 리스트 박스를 결합해 놓은 컨트롤이다.

"combobox" 윈도우 클래스를 사용하며 세 가지 종류가 있다.


CBS_SIMPLE

에디트와 리스트 박스를 가지되 리스트 박스가 항상 펼쳐져 있다.


CBS_DROPDOWN

에디트와 리스트 박스를 가진다.


CBS_DROPDOWNLIST

리스트 박스만 가지며 에디트에 항목을 입력할 수는 없다.



이 외의 스타일이나 메시지들은 에디트와 리스트에 있는 것들과 거의 동일하며 접두어만 조금씩 다르다.

예를 들어 리스트 박스의 LB_ADDSTRING 메시지가 콤보 박스에는 CB_ADDSTRING 으로 되어 있다.

Posted by 명혀니
,

ListBox

API Reference 2007. 10. 17. 11:00

리스트 박스는 선택 가능한 여러 개의 항목들을 나열해 놓고 그 중 하나( 또는 여러 개 )를 선택하는 컨트롤이며 여기서 항목이란 주로 문자열이다.


리스트 박스도 일종의 윈도우이며 "listbox" 라는 윈도우 클래스로 생성한다.

WS_CHILD | WS_VISIBLE 스타일은 기본적으로 지정해야 하며 이 외에 어떤 스타일을 지정하는가에 따라 리스트 박스의 모양과 동작이 달라진다.


LBS_MULTIPLESEL

여러 개의 항목을 선택할 수 있다. 이 스타일을 적용하지 않으면 디폴트로 하나만 선택할 수 있다.


LBS_NOTIFY

사용자가 목록중 하나를 선택했을 때 부모 윈도우로 통지 메시지를 보낸다.


LBS_SORT

추가된 항목들을 자동 정렬한다.


LBS_OWNERDRAW

문자열이 아닌 비트맵이나 그림을 넣을 수 있다.


LBS_STANDARD

LBS_NOTIFY | LBS_SORT | WS_BORDER



부모 윈도우로 통지 메시지를 보내는 것이 일반적이므로 LBS_NOTIFY 스타일은 거의 필수적으로 선택하는 것이 좋다.




부모 윈도우가 리스트 박스를 조작하고자 할 때는 리스트 박스 메시지를 사용한다.


LB_ADDSTRING

리스트 박스에 항목을 추가한다. lParam 으로 추가하고자 하는 문자열의 번지를 넘겨준다.


LB_DELETESTRING

항목을 삭제한다. wParam 으로 항목의 번호를 넘겨주며 남은 항목수를 리턴한다.


LB_GETCURSEL

현재 선택된 항목의 번호( index )를 조사한다.


LB_GETTEXT

지정한 항목의 문자열을 읽는다. wParam 에 항목 번호, lParam 에 문자열 버퍼의 번지를 넘기면 버퍼에 문자열을 채워준다.


LB_GETCOUNT

항목의 개수를 조사한다.


LB_SETCURSEL

wParam 이 지정한 항목을 선택한다.




리스트 박스에서 어떤 사건이 발생했을 때 부모 윈도우로 다음과 같은 통지 메시지를 보낸다.


LBN_DBLCLK

리스트 박스를 더블클릭하였다.


LBN_ERRSPACE

메모리가 부족하다.


LBN_KILLFOCUS

키보드 포커스를 잃었다.


LBN_SELCANCEL

사용자가 선택을 취소하였다.


LBN_SELCHANGE

사용자에 의해 선택이 변경되었다.


LBN_SETFOCUS

키보드 포커스를 얻었다.


이 중 가장 자주 사용되는 통지 메시지는 선택이 변경될 때 보내지는 LBN_SELCHANGE 이다.

부모 윈도우는 WM_COMMAND 의 HIWORD( wParam ) 으로 전달된 통지 코드를 보고 리스트 박스에 무슨 사건이 발생했는지 알게 된다.

Posted by 명혀니
,

EDIT

API Reference 2007. 10. 17. 11:00

에디트는 문자열 또는 정수를 키보드로 입력을 받는 가장 기본적인 입력 도구이며 콘솔 환경의 gets, scanf 등의 함수를 대체하는 컨트롤이다.


"edit" 윈도우 클래스로부터 생성하며 다음과 같은 스타일을 사용할 수 있다.


ES_AUTOHSCROLL

수평 스크롤을 지원한다.


ES_AUTOVSCROLL

여러 줄 편집시 수직 스크롤을 지원한다.


ES_LEFT

왼쪽 정렬한다.


ES_CENTER

중앙 정렬한다.


ES_RIGHT

오른쪽 정렬한다.


ES_LOWERCASE

소문자로 변환하여 표시한다.


ES_UPPERCASE

대문자로 변환하여 표시한다.


ES_MULTILINE

여러 줄을 편집할 수 있도록 한다.


ES_NOHIDESEL

포커스를 잃더라도 선택된 영역을 표시한다.


ES_READONLY

읽기 전용으로 만들어 편집을 금지한다.



자신의 변화에 대해 다음과 같은 통지 메시지를 부모 윈도우로 보낸다.


EN_CHANGE

문자열이 변경되었다.

문자열이 화면으로 출력되고 난 후 보내지는 메시지이다.

에디트는 문자열이 변경된 후 EN_UPDATE 메시지를 보내고 화면에 그린 후 다시 EN_CHANGE 메시지를 보낸다.


EN_ERRSPACE

메모리가 부족하다.


EN_HSCROLL

사용자가 수평 스크롤 바를 클릭하였다.


EN_VSCROLL

사용자가 수직 스크롤 바를 클릭하였다.


EN_KILLFOCUS

포커스를 잃었다.


EN_SETFOCUS

포커스를 얻었다.


EN_MAXTEXT

지정한 문자열 길이를 초과하였다.


EN_UPDATE

문자열이 변경되기 직전이다.

문자열이 변경된 후 화면에 출력하기 직전에 보내는 메시지이며 이 메시지가 발생했을 때 사용자는 문자열 길이에 따라 에디트의 폭을 늘리거나 별도의 조취를 취할 수 있다.

Posted by 명혀니
,

CheckRadioButton

API Reference 2007. 10. 17. 10:59

BOOL CheckRadioButton( HWND hDlg, int nIDFirst, int nIDLast, int nIDCheck );


처음 선택될 라디오 버튼을 지정



hDlg

라디오 버튼을 가지는 부모 윈도우( 또는 대화상자 )의 핸들


nIDFirst, nIDLast

그룹의 시작 버튼과 끝 버튼


nIDCheck

선택될 버튼의 ID

Posted by 명혀니
,