라디오 버튼 선택 메시지 개요
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;
참고자료
728x90
반응형
'프로그래밍 > 델파이' 카테고리의 다른 글
[pascal] in 연산자의 "Constant expression violates subrange bounds" 오류 (0) | 2021.11.07 |
---|---|
CCITT CRC16() 함수 (0) | 2021.09.14 |
[pascal] 16진, 10진 숫자 문자열을 정수형으로 변환하기 (StrToInt) (0) | 2021.09.07 |
Lazarus 크로스 컴파일을 통한 Windows 95용 어플 만들기 실패의 기록 (0) | 2021.08.19 |
[pascal] FindWindow / FindWindowEx (0) | 2021.04.01 |