#include<windows.h>
#include<stdio.h>
#include"resource.h"
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam);
//사용자가 만드는 다이얼로그 메시지 처리 함수
BOOL CALLBACK DlgProc(HWND hDlg , UINT msg, WPARAM wParam, LPARAM lParam);
//dialogBoxParam()을 쓰기 위해서는 구조체가 필요하다.
typedef struct _DLGDATA
{
int x;
int y;
}DLGDATA, *PDLGDATA;
TCHAR lpszClass[] = TEXT("first");
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrev,
LPSTR lpCmdLine,
int nShowCmd)
{
AllocConsole(); // 콘솔창 생성
freopen("CONOUT$", //콘솔을
"wt", //text write모드로
stdout); //stdoutrhk 연결
// EnumFiles("C:\\");
MSG Message;
//1. 위도우 클래스 만들기 (10가지를 다 정확히 입력하지 않으면 화면이 뜨지 않는다.)
WNDCLASS wc; //미리정의된 10개 항목을 채우는 클래스 (WNDCLASSEX 12개 항목 10개 항목에 작은 아이콘, 구조체 크기를 포함한다.)
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH);
wc.hCursor = LoadCursor ( 0, IDC_CROSS);
wc.hIcon = LoadIcon ( 0, IDI_WINLOGO );
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc; //<~ 이부분을 자신이 만드는 함수로 바꿔줘야 한다. 메시지 함수등록
wc.lpszClassName= lpszClass;
wc.lpszMenuName = 0;
wc.style = 0;
//2. 윈도우 클래스 등록하기.
RegisterClass( & wc ); // 등록을 하는 함수도 2가지가 있다. RegisterClass와 RegisterClassEx가 있다.
//WNDCLASS로 만들었으면 RegisterClass로 등록하고 WNDCLASSEX로 만들었으면 RegisterClassEx로 등록
//3. 등록된 클래스를 사용해서 윈도우 만들기.
// typedef long HWND; // 윈도우의 번호를 담을때 사용
HWND hwnd = CreateWindowEx(0 , // 확장 윈도우 스타일
lpszClass, // 윈도우 클래스 이름
TEXT("첫시작"), // 창이름
WS_OVERLAPPEDWINDOW, // 기본 Window Styles : & ~ 연산으로 기존스타일 제거하기
// WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX
20, 20, 839, 660, // X,Y,W,H
0, // 부모 윈도우 핸들( 번호 )
0, // 메뉴 핸들( 번호 )
hInstance, // 인스턴스 핸들
0); // 생성인자.( MDI 만들때 사용 )
//4. 윈도우 보여주기
ShowWindow(hwnd, nShowCmd);
while(GetMessage(&Message,0,0,0)) //메시지 큐에 가서 메시지를 꺼내오고 가져온 메시지를 윈도우 클래스에 등록된 메세지 처리함수로 전달한다.
{
//여기서 메시지를 처리하면 부모뿐 아니라 모든 자식윈도우로 전달되는 메시지도 먼저 처리할 수 있다.
TranslateMessage(&Message);
if (Message.message == WM_SYSKEYDOWN && Message.wParam == 'X')
{
PostQuitMessage(0);
MessageBox(hwnd, "종료","질문",MB_OK);
//SendMessage(hwnd, WM_CLOSE,0,0);
continue;
}
//PreTranslateMessae(&Message);
DispatchMessage(&Message);//가져온 메시지를 윈도우 클래스에 등록된 메시지 처리함수로 전달한다.
}
//MessageBox(0, "이제 알겠죠?","물음",MB_OKCANCEL);//종료되지 않게 하기 위해
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
static HWND hTree;
static int xPos = 0 , yPos = 0 ;
switch(iMessage){
case WM_DESTROY:
PostQuitMessage(0);
return 0 ;
case WM_CREATE:
return 0 ;
case WM_LBUTTONDOWN:
{
//다이얼로그박스를 나타내기 전에 구조체를 생성해서 스태틱 변수값으로 초기화
DLGDATA data;
data.x = xPos;
data.y = yPos;
//다이얼로그 나타내기
UINT ret = DialogBoxParam(GetModuleHandle(0),//hInstance
MAKEINTRESOURCE(IDD_DIALOG1),//리소스 아이디
hwnd, //소유자 핸들
DlgProc, //다이얼로그 프로시저
(LPARAM)&data); // WM_INITDIALOG의 lParam으로 전달.
if(ret == IDOK)
{
//Dialog에 입력한 값은구조체에 있다.
//Static변수에 옮겨 담고 무효화
xPos = data.x;
yPos = data.y;
InvalidateRect(hwnd, 0, TRUE);
}
}
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
char s[256];
wsprintf(s,"%d, %d",xPos, yPos);
TextOut(hdc, 10,10,s,lstrlen(s));
EndPaint(hwnd,&ps);
}
return 0;
}
//꺼내온 메시지를 처리하지 않은경우 -> 바드시 아래 함수를 처리한다.
return(DefWindowProc(hwnd,iMessage,wParam,lParam));
}
BOOL CALLBACK DlgProc(HWND hDlg , UINT msg, WPARAM wParam, LPARAM lParam)
{
static DLGDATA *pData;
switch(msg)
{
case WM_INITDIALOG:
pData = (DLGDATA *)lParam; //DialogBoxPrarm()의 마지막인자.
//구조체의 내용으로 control을 초기화한다.
SetDlgItemInt(hDlg, IDC_EDIT1, pData->x,0);
SetDlgItemInt(hDlg, IDC_EDIT2, pData->y,0);
return TRUE;
case WM_COMMAND:
switch(LOWORD( wParam ) )
{
case IDOK:
{
// char s[256]; // -> 이방법은 전역변수로 빼야한다. 하지만 에디트박스가 10개라면 10개를 다 만들것인가?
// 아니다. DialogBoxParam()을 쓰면 된다.
// char B[256];
//10 - > HWND를 얻는다.
// HWND hEdit = GetDlgItem(hDlg, IDC_EDIT1);
// GetWindowText(hEdit, s, 256);
//위 2줄대신 아래 한줄로도 가능
//GetDlgItemText(hDlg, IDC_EDIT1,s,256);
//GetDlgItemText(hDlg, IDC_EDIT2,B,256);
//MessageBox(0,s,B,MB_OK);
BOOL b;
//cotrol의 값을 구조체로...!!
pData->x = GetDlgItemInt(hDlg, IDC_EDIT1,&b,0);
pData->y = GetDlgItemInt(hDlg, IDC_EDIT2,&b,0);
EndDialog(hDlg, IDOK); break;
}
case IDCANCEL: EndDialog(hDlg, IDCANCEL); break;
}
return TRUE;
}
return FALSE; //메시지를 처리하지 않은 경우
}