반응형



Visual Studio 2017에서 WinAPI(  Windows API )를 사용한 프로그램을 작성하는 방법을 설명합니다.




Visual Studio 2017 설치하는 방법은 다음 포스팅을 참고하세요


C++, Win32 API, MFC 개발을 위해 Visual Studio Community 2017 설치하는 방법

http://webnautes.tistory.com/1131



2018. 7. 9 - 최초작성




1. 메뉴에서 파일 > 새로 만들기 > 프로젝트를 선택합니다.



2. 왼쪽 항목에서 Visual C++ > Windows 데스크톱을 선택하면 중앙에 보이는 항목에서  Windows 데스크톱 마법사를 선택합니다.




3. 응응 프로그램 종류로 Windows 응용 프로그램을 선택하고 빈 프로젝트를 체크합니다.

SDL을 체크하면 보안상 대체해서 사용해야 하는 함수들을 알려줍니다. 예를 들어 scanf() 대신 scanf_s() 를 사용하라는 메시지가 보입니다.




4. 리소스 뷰에 보이는 프로젝트 이름에서 마우스 우클릭하여 보이는 메뉴에서 추가 > 리소스를 선택합니다.

리소스 뷰가 보이지 않으면 Ctrl + Shift + E를 누릅니다.




5. 리소스 추가 창이 보이면 Dialog를 선택하고 새로 만들기 버튼을 클릭합니다.




6. 화면에 다이얼로그가 보입니다. Ctrl + S를 눌러 저장합니다.




리소스 뷰에도  다이얼로그가 추가됩니다.




7. 각 항목을 선택하여 ID를 확인해둡니다.


다이얼로그 IDD_DIALOG1  

확인 버튼 IDOK

최소 버튼 IDCANCEL



8. 솔루션 탐색기에서 소스 파일을 선택하고  마우스 우클릭하면 보이는 메뉴에서 추가 > 새 항목을 선택합니다.




9. C++ 파일(cpp)를 선택하고  추가버튼을 클릭합니다.




10. 앞에서 확인했던 ID를 이용해서 Windows API 코드를 수정한 상태입니다.

코드 출처 - http://www.winprog.org/tutorial/dialogs.html


#include <windows.h>
#include "resource.h"

HBRUSH g_hbrBackground = NULL;

BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
int msgboxID;

switch (Message)
{
case WM_INITDIALOG:
g_hbrBackground = CreateSolidBrush(RGB(128, 128, 128));

SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(NULL,
MAKEINTRESOURCE(IDI_APPLICATION)));
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(NULL,
MAKEINTRESOURCE(IDI_APPLICATION)));
break;
case WM_CLOSE:
EndDialog(hwnd, 0);
break;
case WM_CTLCOLORDLG:
return (LONG)g_hbrBackground;
case WM_CTLCOLORSTATIC:
{
HDC hdcStatic = (HDC)wParam;
SetTextColor(hdcStatic, RGB(255, 255, 255));
SetBkMode(hdcStatic, TRANSPARENT);
return (LONG)g_hbrBackground;
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
msgboxID = MessageBox(hwnd, L"OK 버튼이 눌러졌습니다. 프로그램을 종료할까요?", L"정보", MB_YESNO);

if (msgboxID==6) EndDialog(hwnd, 0);
break;
case IDCANCEL:
msgboxID = MessageBox(hwnd, L"CANCEL 버튼이 눌러졌습니다. 프로그램을 종료할까요?", L"정보", MB_YESNO);

if (msgboxID == 6) EndDialog(hwnd, 0);
break;
}
break;

case WM_DESTROY:
DeleteObject(g_hbrBackground);
break;
default:
return FALSE;
}
return TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
}



11. 실행결과입니다.






반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts