2012-09-24 2 views
2

취소 버튼 만있는 메시지 상자를 사용할 수 있습니까? 그렇다면 어떤 힌트라도? 취소 버튼 만있는 메시지 상자 만 가져 오는 API 메서드가 내장되어 있습니까/취소 버튼이있는 메시지 상자

사용자 정의 모달 대화 상자를 만드는 방법은 무엇입니까? 모든 링크?

답변

6

당신이 원하는 그러나 MessageBox() 대화 상자를 사용자 정의 할 수 .

는 예를 들어, 말을 "취소" "확인"버튼의 텍스트를 변경할 수 있습니다 대신에, 예를 들면 :

HHOOK hHook = NULL; 

LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode < 0) 
     return CallNextHookEx(hHook, nCode, wParam, lParam); 

    if (nCode == HCBT_ACTIVATE) 
    { 
     HWND hWnd = reinterpret_cast<HWND>(wParam); 
     SetWindowText(GetDlgItem(hWnd, IDOK), TEXT("Cancel")); 
     return 0; 
    } 

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

{ 
    ... 
    hHook = SetWindowsHookEx(WH_CBT, reinterpret_cast<HOOKPROC>(&CBTHookProc), NULL, GetCurrentThreadId()); 
    int iResult = MessageBox(..., MB_OK); 
    if (iResult == IDOK) iResult = IDCANCEL; 
    UnhookWindowsHookEx(hHook); 
    ... 
} 

아니면 표준 "OK"버튼을 숨기고 대화 상자가 여전히 사용하도록 할 수 있습니다 네이티브 "취소"버튼 :

HHOOK hHook = NULL; 

LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode < 0) 
     return CallNextHookEx(hHook, nCode, wParam, lParam); 

    if (nCode == HCBT_ACTIVATE) 
    { 
     HWND hWnd = reinterpret_cast<HWND>(wParam); 
     ShowWindow(GetDlgItem(hWnd, IDOK), SW_HIDE); 
     // optionally reposition the IDCANCEL child window as well.... 
     return 0; 
    } 

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

{ 
    ... 
    hHook = SetWindowsHookEx(WH_CBT, reinterpret_cast<HOOKPROC>(&CBTHookProc), NULL, GetCurrentThreadId()); 
    int iResult = MessageBox(..., MB_OKCANCEL); 
    UnhookWindowsHookEx(hHook); 
    ... 
} 

업데이트 : 비스타에 나중에, 당신은 (그리고해야) TaskDialog() 또는 TaskDialogIndirect() 대신 MessageBox()를 사용할 수 있습니다. 작업 대화 상자는 대화 상자에 어떤 단추가 있는지 지정하고 심지어 사용자 지정 단추를 사용할 수있는 기능을 포함하여 훨씬 더 융통성이 있습니다. 그래서 당신은 쉽게 예를 들어, 전혀 후크를 사용하지 않고 취소 전용 대화 상자를 표시 할 수 있습니다

TaskDialog(..., TDCBF_CANCEL_BUTTON, ..., &iResult); 

TASKDIALOGCONFIG TaskConfig = {0}; 
TaskConfig.cbSize = sizeof(TaskConfig); 
TaskConfig.dwCommonButtons = TDCBF_CANCEL_BUTTON; 
... 
TaskDialogIndirect(&TaskConfig, &iResult, ...); 
+0

을 당신은 당신의 CallNextHookEx 라인의 끝 부분에 약간의 세미콜론을 놓치고있어. 그렇게 작은 변화이기 때문에 편집하지 못하게합니다. 결코 적게 : 굉장한 대답! – Xoorath

+1

누락 된 세미콜론을 추가했습니다. –

1

알림 만 표시하는 메시지 상자의 경우 "확인"상자를 사용하는 것이 좋습니다. 취소는 약간 중복 된 것 같습니다.

하지만 원하는 경우 자체 메시지 상자 개체를 정의하고 텍스트 특성으로 "취소"를 사용하여 직접 단추를 지정하면됩니다.

C++이나 다른 언어에는 "확인"이 규칙이므로 "취소"만으로 메시지 상자를 다시 정의 할 수있는 기본 제공 기능이 있습니다.

0

MessabeBox에서는 불가능하다고 생각합니다. 자신 만의 대화 상자를 간단하게 만들고 취소 버튼 하나를 추가 할 수 있습니다.

또한 그것은 당신의 문제를 해결할 수 있습니다

XMessageBox

이 링크를 한 번 봐 가질 수

당신은 SetWindowsHookEx()를 통해 스레드 로컬 CBT 후크를 사용할 수 있습니다