2011-04-11 3 views
3

글쎄, 나는 C로 대학 프로젝트를 만들고있다. GUI는 아직 배우지 않았지만 프로그램이 더 좋기를 바란다. 그래서 나는 윈도우 API를 배우고있다.Windows API로 C 프로그래밍하기 : 명령 단추를 그리는 방법

여기에서이 자습서를 따르고 있습니다 : http://www.winprog.org/tutorial/start.html 그리고 아주 좋습니다. 많은 것들이 설명되어 있지만 한 가지 (심지어 검색된 Google도 있지만 모든 것은 C++ 또는 C#에 맞춰져 있습니다.)를 찾을 수 없습니다.

어떻게 그려진 창에 명령 단추를 그립니까? 그것을위한 사건을 받아들이는 방법?

Windows API와 C 만 사용하여 명령 단추를 만드는 방법을 설명하는 좋은 페이지를 알려 주거나 대답 할 수 있습니까? 아니요. C++을 사용하지 마십시오.

시간 내 주셔서 감사합니다. :)

+3

정말 필요한 것은 Charles Petzold의 책 Programming Windows입니다. –

+0

@David 글쎄, 고마워요. 나는 API로 뛰어 들었다. 그리고 그것이 나에게 좋다라고 생각하면, 나는 책을 얻을 것이다. –

+0

찾은 자습서를 계속 따르십시오. http://www.winprog.org/tutorial/controls.html.훌륭한 튜토리얼임을 보증 할 수 있습니다. – tenfour

답변

5

This 내가 매우는 Win32 API 사용자 인터페이스 기능에 추천 튜토리얼입니다. 훌륭합니다. 대략 말하기, 콜백 함수 (LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 당신이 몇 가지 옵션이 있습니다 당신은 잡을 수 있습니다 : 내가 저장 한

HWND hWnd_button = CreateWindow(TEXT("button"), TEXT("Quit"),  
       WS_VISIBLE | WS_CHILD , 
       20, 50, 80, 25,   
       hwnd, (HMENU) 1, NULL, NULL); 

이유 :

switch(msg) 
{ 
    case WM_CREATE: 
     break; 

    case WM_COMMAND: 
     break; 
    /* .. */ 
} 

당신이 WM_CREATE에해야 할 것은이 같은 것입니다 해당 버튼의 HWND은 나중에 버튼을 변경하려는 경우 SendMessage()에 대한 핸들로 Handle이 필요합니다. 이제 다음 버튼을 클릭합니다.이 버튼을 클릭하면 WM_COMMAND이 부모 창에 HMENU 캐스팅 된 인수 (1 i 이 경우)를 wParam에 입력하십시오. 이것은 모든 컨트롤 (메뉴, 체크 박스 등 - 그들이 더 복잡한 옵션을 게시 할 경우 lParam에있을 수 있음)에서 작동합니다. 따라서 :

case WM_COMMAND: 
    if (LOWORD(wParam) == 1) { 
     DestroyWindow(); 
     /* or SendMessage(hwnd, WM_CLOSE,0,0); see commments */ 
    } 
    break; 

해당 옵션을 찾습니다. if 내부 버튼 이벤트를 처리합니다.

+0

훌륭한 튜토리얼을 가르쳐 주셔서 감사합니다. 그리고 위대한 대답도! –

+0

@ 이샨 문제 없습니다. Petzold 책은 좋은 책이고, 나는 또한 그것을 추천한다. 그것은 많이 다루고있다. 그러나, 그 튜토리얼을 시작하는 것은 기본적인 것들에 대한 훌륭한 소개입니다. –

+0

PostQuitMessage 정말 창을 닫는 적절한 방법이 아닙니다, 단추를 WM_CLOSE 보내야합니다 또는 WM_CLOSE 처리 (Abort 경우 저장되지 않은 변경 내용 등) 호출 할 수 DestroyWindow, DestroyWindow WM_DESTROY 보내기 끝납니다. 창에 대한 모든 정리를 처리하고 PostQuitMessage를 호출하십시오. – Anders

1

"BUTTON"CreateWindow과 스타일 BS_PUSHBUTTON을 사용하고 기존 창을 부모 창으로 사용하기 만하면됩니다. x 및 y 좌표는 윈도우의 상단 왼쪽 버튼 위치를 선택합니다. 창 이름은 버튼의 텍스트입니다. 또한 반환 된 핸들에서 ShowWindow으로 전화하는 것을 잊지 마십시오.

편집 : 그런 다음 CreateWindow 함수 호출의 메뉴 매개 변수로 되었

#define ID_MYBUTTON 1

: 처음과 같은 ID 값을 정의, 그것을 위해 이벤트를 동의합니다. 메인 창 메시지 PROC에서 당신은 지금 테스트하여 메시지를 찾을 수 있습니다

if(message == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == ID_MYBUTTON) { /* button was clicked */ }

+1

버튼을위한 새로운 창을 만들어야합니까? 음, 그건 새로운 것이 었습니다. 나는 그것을 시도 할 것이다. 빠른 답변 주셔서 감사합니다. –

+1

예, 버튼은 창입니다. –

관련 문제