프로그래밍/델파이

[pascal] 라디오 버튼 선택 동작

채윤아빠 2021. 9. 8. 22:26
728x90
반응형

라디오 버튼 선택 메시지 개요

MFC 등으로 만들어진 외부 프로그램을 간접적으로 제어하거나, Window Control을 직접 생성하여 이용하는 경우, 라디오 버튼을 메시지를 통하여 선택하고, 해제하는 방법을 정리해 둡니다.

라디오 버튼 컨트롤에 BM_SETCHECK 메시지를 이용하면, 라디오 버튼의 선택 여부를 설정할 수 있습니다.

    SendMessage(hwnd, BM_SETCHECK, wParam, 0);

wParam에 다음의 라디오 버튼 상태정보를 전달하여, 선택하거나 해제할 수 있습니다.

Value Meaning
BST_CHECKED Sets the button state to checked.
BST_INDETERMINATE Sets the button state to grayed, indicating an indeterminate state. Use this value only if the button has the BS_3STATE or BS_AUTO3STATE style.
BST_UNCHECKED Sets the button state to cleared.

라디오 버튼의 상태 정보는 BM_GETCHECK 메시지를 이용하여 라디오 버튼의 선택 여부를 알 수 있습니다.

    nRadioState := SendMessage(hwnd, BM_GETCHECK, 0, 0);

nRadioState의 값은 위 BM_SETCHECK 메시지의 wParam에 할당하는 값과 동일한 값이 반환됩니다.

사용 예

다음은 그룹 박스에 2개의 라디오 버튼이 있고, 그 중에서 한 개를 선택하는 예제 코드입니다.

uses Windows;

const
  DIALOG_CLASS_NAME                                    = '#32770';
  CAPTION_PERFORM_BIT                                = 'Perform BIT';

var
    hwndPerformBIT, hwndRadioBIT1, wndRadioBIT3: THandle;
begin
     hwndPerformBIT := FindWindow(DIALOG_CLASS_NAME, CAPTION_PERFORM_BIT);
    if (hwndPerformBIT = 0) then
    begin
        Result := -1;
        Exit;
    end;

     hwndRadioBIT1 := GetDlgItem(hwndPerformBIT, ID_PB_BIT1)
     hwndRadioBIT3 := GetDlgItem(hwndPerformBIT, ID_PB_BIT3);
    if ((hwndRadioBIT1 = 0) or (hwndRadioBIT3 = 0)) then
    begin
        Result := -1;
        Exit;
    end;

    if (nBitMode <> 3) then
    begin
        SendMessage(hwndRadioBIT1, BM_SETCHECK, BST_CHECKED, 0);
        SendMessage(hwndRadioBIT3, BM_SETCHECK, BST_UNCHECKED, 0);
    end
    else
    begin
        SendMessage(hwndRadioBIT1, BM_SETCHECK, BST_UNCHECKED, 0);
        SendMessage(hwndRadioBIT3, BM_SETCHECK, BST_CHECKED, 0);
    end;

    Result := 0;
end;

위 예제 코드에서는 ID_PB_BIT1에 해당하는 라디오 버튼의 윈도우 핸들과 ID_PB_BIT3에 해당하는 라디오 버튼의 윈도우 핸들을 구하고, SendMessage() 함수를 이용하였습니다.
라디오 버튼을 갖고 있는 부모 윈도우가 대화상자라면 SendMessage() 함수 대신에 SendDlgItemMessage() 함수를 이용하면 코드를 더 단순화할 수 있습니다.

uses Windows;

const
  DIALOG_CLASS_NAME                                    = '#32770';
  CAPTION_PERFORM_BIT                                = 'Perform BIT';

var
    hwndPerformBIT: THandle;
begin
     hwndPerformBIT := FindWindow(DIALOG_CLASS_NAME, CAPTION_PERFORM_BIT);
    if (hwndPerformBIT = 0) then
    begin
        Result := -1;
        Exit;
    end;

    if (nBitMode <> 3) then
    begin
        SendDlgItemMessage(hwndPerformBIT, ID_PB_BIT1, BM_SETCHECK, BST_CHECKED, 0);
        SendDlgItemMessage(hwndPerformBIT, ID_PB_BIT3, BM_SETCHECK, BST_UNCHECKED, 0);
    end
    else
    begin
        SendDlgItemMessage(hwndPerformBIT, ID_PB_BIT1, BM_SETCHECK, BST_UNCHECKED, 0);
        SendDlgItemMessage(hwndPerformBIT, ID_PB_BIT3, BM_SETCHECK, BST_CHECKED, 0);
    end;

    Result := 0;
end;

참고자료