1. 에디트
-에디트는 문자열을 직접 입력받을 때 사용하는데 버튼과 마찬가지로 윈도우즈에서 가장 흔하게 볼 수 있는 컨트롤이다.
가로로 길쭉하게 생겼으며, 여기에 문자열 또는 정수를 입력 할 수 있으며, 콘솔창의 gets 나 scanf를 대신한다.
-생성은 CreateWindow 함수의 첫번째 인자에 "edit"를 입력하며, 세번째 인수에 다음과 같은 스타일을 지정 할 수 있다.
그리고 에디트 컨트롤의 변화에 따라 다음과 같은 통지 메시지를 부모 윈도우를 보내며, 부모 윈도우는 이 메세지를 받았을때 적절한 처리를 하면 된다.
<문자열을 부모 윈도우의 타이틀 바에 출력하는 예제>
#include "Simple.h"
#define ID_EDIT 100
HWND hEdit;
HDC hdc;
TCHAR str[128];
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
/************핸들을 저장할 변수, 에디트 클래스, 스타일 ,아이디등을 설정 ***********/
hEdit = CreateWindow(TEXT("edit"),NULL,WS_CHILD | WS_VISIBLE |WS_BORDER |
ES_AUTOHSCROLL,10,10,200,25,hWnd,(HMENU)ID_EDIT,g_hInst,NULL);
return 0;
}
-수평 스타일을 주어 에디트 끝부분에 닿았을 때 자동으로 자신보다 더 긴 문자열도 입력 할 수 있다.
/***********해당 버튼 클릭시 통지서와, 아이디값 핸듬 값을 읽어옴 ********************/
LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(wParam)) // LOWORD에는 아이디가 있다.
{
case ID_EDIT:
switch(HIWORD(wParam)) // HIWORD 에는 통지코드 EN_CHANGE가 들어가있다.
{
case EN_CHANGE: // 부모에게 통지메세지가 전달 될때
// hEdit 의 핸들값을 읽어와 str에 저장을 한다.
GetWindowText(hEdit,str,128);
// 변화된 문자열을 다시 메인 윈도우 핸들에게 보낸다.
SetWindowText(hWnd,str);
}
}
return 0;
}
- 한마디로 에디트 문자열을 칠때마다 문자열 변경이 되었다는 메세지 EN_CHANGE 를 부모에게 죽어라 보내는데 그 핸들값을 받아와가지고
텍스트를 읽고 출력하는 것이다.
LRESULT OnLbuttonClk(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnRButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnWmPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
return 0;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
// 그리고 부모 윈도우 타이틀을 만드는 작업이라서 인지 윈메인소스에 타이틀 이름 "edit"를 하게 되면 화면이 이상하게 나온다.
[결과 봄세]
2. 컨트롤
-컨트롤도 윈도우의 일종이라 할 수 있으며 메인 윈도우의 차일드로 존재하고 있다. 대신에 타이틀 바가 없기에 사용자가 직접 이동 시킬수가 없을 뿐이다.
-컨트롤이 윈도우라는 결정적인 증거는 스스로 메시지를 처리할 수 있는 능력을 가진다는 점이다. 예를 들면 체크박스의 BM_SETCHECK 메시지를 받으면 wParam값에 따라 자신의 체크 상태를 스스로 변경하는 것을 알 수 있다.
<컨트롤이 윈도우라는 예제보기>
#include "Simple.h"
#define ID_EDIT 100
int nTop = 10; // 수직 조절 변수
HWND hEdit;
HDC hdc;
TCHAR *Mes;
BOOL bShow = TRUE; // ShowWindow 기능을 위한 변수
/******************생성하는 방식은 똑같다 *******************/
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
Mes =TEXT("왼쪽 클릭 : 에디트 이동, 오른쪽 클릭 : 보임/숨김"); // 사용법 주석 표시같은 효과를 위한 텍스트 문자
hEdit = CreateWindow(TEXT("edit"),NULL,WS_CHILD | WS_VISIBLE |WS_BORDER |
ES_AUTOHSCROLL,10,nTop,200,25,hWnd,(HMENU)ID_EDIT,g_hInst,NULL);
SetWindowText(hEdit,TEXT("에디트도 윈도우다")); // 캡션변경후 에디트에 문자열을 대입!! 에디트 예제에선 입력 받기로 해놨었음
return 0;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
/***********해당 버튼 클릭시 통지서와, 아이디값 핸듬 값을 읽어옴 ********************/
return 0;
}
LRESULT OnLbuttonClk(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
/**************************** 왼쪽 버튼 클릭시 발생 ****************************/
LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
nTop += 10;
MoveWindow(hEdit,10,nTop,200,25,TRUE); // 왼쪽 버튼메세지가 발생될때 마다 수직으로 10씩 내려간다.
return 0;
}
/***************************오른쪽 버튼 클릭시 메세지 전달*********************/
LRESULT OnRButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
if(bShow)
{
bShow = FALSE; // bShow 값(TRUE) 을 읽어와 FALSE로 변경후
ShowWindow(hEdit,SW_HIDE); // 그 해당 윈도우 핸들을 읽어와 화면에서 숨겨버린다.
}
else
{
bShow = TRUE;
ShowWindow(hEdit,SW_SHOW);
}
return 0;
}
LRESULT OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnWmPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd,&ps);
TextOut(hdc,200,100,Mes,lstrlen(Mes));
EndPaint(hWnd,&ps);
return 0;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
<실행결과1>
<실행결과2>
<실행결과3>
3.리스트 박스
- 리스트 박스는 선택 가능한 여러개의 항목들을 나열해 놓고 그중 하나(또는 여러 개)를 선택하는 컨트롤이며 항목이란 주로 문자열이다.
- 리스트 박스 역시 윈도우의 일종이다.
- 리스트 박스도 고유의 스타일을 지정할 수 있으며 어떤 스타일을 지정하냐에 따라 그 모양과 동작이 달라진다.
- 다음과 같은 스타일이 있다.
- LBS_NOTIFY 스타일은 거의 필수적으로 선택하는 것이 좋다.
- 부모 윈도우가 리스트 박스를 조작하고자 할 때는 리스트 박스 메시지를 이용하는데, 굉장히 많은 메시지들이 정의 되어 있다,
- 다음메시지는 아주 기본적이므로 암기해야 할 정도로 중요하다.
- 이 메시지는 부모가 리스트 박스에게 보내는 메시지이다.
- 부모가 이러한 메세지를 리스트 박스에게 보내고, 반대로 리스트 박스에게 어떠한 변경이 일어났을 때 부모에게 통지 메세지를 보내는데
그 것은 다음과 같다.
- 이 메시지는 리스트 박스가 부모에게 보내는 메시지이다.
- 이중 가장 자주 사용되는 통지 메시지로써는, LBN_SELCHANGE이며, WM_COMMAND의 HIWORD(wParam)로 전달받아 리스트 박스에 무슨 사건이 발생했는지 알 수 있게 된다.
<윈도우 타이틀 캡션을 변경하는 예제보기>
#include "Simple.h"
#define ID_LISTBOX 100
TCHAR *Items[] = {TEXT("Apple"),TEXT("Orange"),TEXT("Melon"),TEXT("Grape"),TEXT("Strawberry")};
HWND hList;
int i;
TCHAR str[128];
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
hList = CreateWindow(TEXT("listbox"),NULL,WS_CHILD | WS_VISIBLE |WS_BORDER |
LBS_NOTIFY,10,10,100,200,hWnd,(HMENU)ID_LISTBOX,g_hInst,NULL); // 스타일로 인해 사용자의 선택 확인
/*****************리스트 박스에 항목을 막 쑤셔 넣는 중 (항목은 위에 선언되어있다) *************/
for(i=0; i<5; i++)
{
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Items[i]);
}
return 0;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
/***********해당 버튼 클릭시 통지서와, 아이디값 핸듬 값을 읽어옴 ********************/
switch(LOWORD(wParam))
{
case ID_LISTBOX: // 리스트 박스 아이디를 읽히면 실행
switch(HIWORD(wParam))
{
case LBN_SELCHANGE: // 리스트 박스가 먼가 변경이 됬다고 부모에게 통지함
//부모가 선택된 인덱스가 먼지 조사하라고 리스트에게 메세지를 보냄
i = SendMessage(hList,LB_GETCURSEL,0,0);
// 요고 역시 조사된 인덱스 번호 i를 읽고, GETTEXT를 한다 문자열 저장
SendMessage(hList,LB_GETTEXT,i,(LPARAM)str);
SetWindowText(hWnd,str); // 내용을 출력한다.
break;
}
}
return 0;
}
LRESULT OnLbuttonClk(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnRButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnWmPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
return 0;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
부모와 컨트롤이 메세지로써 통신하는것을 알 수 있다.
<실행결과>
4. 콤보 박스
- 콤보 박스는 에디트와 리스트 박스를 결합해 놓은 방식이다.
- 목록에 있는 항목을 선택할 수도 있고 원하는 항목이 없을시 에디트에 직접 입력해 넣을 수도 있다.
- 그리고 실행결과를 보면 알겠지만 화면 공간을 적게 차지 한다는 장점도 있다. 반면에 콤보 박스는 적은화면안에 압축되있다? 라고 표현해야 하나 파일을 밑으로 펼쳐야 하기 때문에 리스트 보다 시간이 조금더 걸린다.
- 콤보 박스에는 다음과 같은 스타일이 있다.
- 그리고 부모가 콤보박스를 조작하기 위해 사용될 메시지는 리스트 메시지와 접두어만 조금씩 다르며 비슷하다.
ex) LB_ADDSTRING = CB_ADDSTRING
<그럼 콤보 박스의 예제를 보장>
#include "Simple.h"
#define ID_COMBOBOX 100
TCHAR *Items[] = {TEXT("Apple"),TEXT("Orange"),TEXT("Melon"),TEXT("Grape"),TEXT("Strawberry")};
HWND hCombo;
int i;
TCHAR str[128];
/******************머 리스트랑 다 똑같다 스타일만 빼구 **********************/
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
hCombo = CreateWindow(TEXT("combobox"),NULL,WS_CHILD | WS_VISIBLE |WS_BORDER |
CBS_DROPDOWN,10,10,100,200,hWnd,(HMENU)ID_COMBOBOX,g_hInst,NULL);
for(i=0; i<5; i++)
{
SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)Items[i]);
}
return 0;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
/***********해당 버튼 클릭시 통지서와, 아이디값 핸듬 값을 읽어옴 ********************/
switch(LOWORD(wParam))
{
case ID_COMBOBOX:
switch(HIWORD(wParam)) // 하이워드에 통지서가 들어오면
{
case CBN_SELCHANGE: // 콤보박스의 기능 직접 입력이 가능함 사용자의 의해 변경이 되었으면(통지서)
i = SendMessage(hCombo,CB_GETCURSEL,0,0); // 인덱스를 조사하라고 메세지를 보내자 ~~~
SendMessage(hCombo,CB_GETLBTEXT,i,(LPARAM)str); // 아 그 번호가 저장하자~
SetWindowText(hWnd,str); // 저장 다했으면 보이주자~~~~
break;
case CBN_EDITCHANGE: // 문자열이 변경 처리 되었을 시~
GetWindowText(hCombo,str,128); // 또 그 내용을 읽어오자~~
SetWindowText(hWnd,str); // 또 보이주자~~~
break;
}
}
return 0;
}
LRESULT OnLbuttonClk(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnRButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnWmPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
return 0;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
<실행결과1>
<실행결과2>
암은,,,,,,,,ㅠㅠ
'코스웨어 > 11년 내장형하드웨어' 카테고리의 다른 글
[내장형]김수만_110928 (16) | 2011.09.29 |
---|---|
[내장형]이상만_110927 (14) | 2011.09.28 |
잠깐 내려 놓는 시간.. (7) | 2011.09.27 |
[내장형]윤병도_20110926일일보고서 (18) | 2011.09.26 |
[내장형]이영진_2011년 9월 22일 일일보고서 (11) | 2011.09.22 |
[내장형]백길남_2011년 9월 21일 수요일 보고서 (13) | 2011.09.21 |
[내장형]박춘우_2011년 9월 20일 화요일 Daily Report (26) | 2011.09.21 |
[내장형]한원우_9월19일 보고서 (36) | 2011.09.20 |