반응형
#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; //메시지를 처리하지 않은 경우 }
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."