관리 메뉴

Bull

[Flutter::Window] win32 MessageBox 출력해보기 (Level 1 : 구현) 본문

Software Framework/Flutter

[Flutter::Window] win32 MessageBox 출력해보기 (Level 1 : 구현)

Bull_ 2024. 7. 31. 14:18

Flutter에서는 win32 패키지를 통해서 실제 win32 api 를 호출할 수 있다. win32 패키지에 대해서 자세히 알아보진 않았지만 우선 win32 를 통해 MessageBox 이벤트를 호출하는 프로그램을 만들어보자.

Level 1 : 구현

Level 1 : 구현단계에서는 코드에 대한 자세한 설명과 원리는 거의 없고 A는 B이다 형식의 설명입니다.

CODE

windows_message_box.dart

import 'package:win32/win32.dart';

class WindowsApi {
  static void showMessageBox(String text, String caption) {
    final textPtr = TEXT(text);
    final captionPtr = TEXT(caption);

    MessageBox(0, textPtr, captionPtr, 0);

    free(textPtr);
    free(captionPtr);
  }
}

짧은 예제라서 파일을 구분할 필요는 없지만 Win32가 독립적인 시스템인 만큼 이번에는 OOP적인 코드로 작성했다.

int MessageBox(
  int hWnd,
  Pointer<Utf16> lpText,
  Pointer<Utf16> lpCaption,
  int uType,
)

MessageBox는 win32 의 함수이다. 실제 C++에서 win32의 MessageBox와 거의 똑같다. (정말 같은 건지는 잘 모르겠다.)

  • hWnd
    • 설명: 메시지 박스의 소유자를 지정합니다. 일반적으로 부모 윈도우의 핸들을 전달합니다. 0 또는 NULL을 전달하면 메시지 박스는 소유자가 없는 것으로 간주됩니다.
    • 예시: 0 또는 NULL (소유자가 없는 메시지 박스), 특정 윈도우 핸들.
  • lpText
    • 설명: 메시지 박스에 표시할 텍스트 문자열의 포인터입니다.
    • 예시: 'Hello, World!' (표시할 메시지).
  • lpCaption
    • 설명: 메시지 박스 제목 표시줄에 표시할 캡션 문자열의 포인터입니다.
    • 예시: 'Flutter Windows API' (메시지 박스의 제목).
  • uType
    • 설명: 메시지 박스의 스타일 및 행동을 지정하는 플래그입니다. 여러 값을 조합하여 사용할 수 있습니다. 버튼, 아이콘, 기본 버튼, 모달 모드를 지정할 수 있습니다.
    • 예시:
      • MB_OK (0x00000000): "확인" 버튼만 있는 메시지 박스.
      • MB_OKCANCEL (0x00000001): "확인" 및 "취소" 버튼이 있는 메시지 박스.
      • MB_YESNO (0x00000004): "예" 및 "아니오" 버튼이 있는 메시지 박스.
      • MB_ICONEXCLAMATION (0x00000030): 느낌표 아이콘을 표시합니다.
      • MB_ICONINFORMATION (0x00000040): 정보 아이콘을 표시합니다.
      • MB_DEFBUTTON1 (0x00000000): 첫 번째 버튼을 기본 버튼으로 설정합니다.
      • MB_DEFBUTTON2 (0x00000100): 두 번째 버튼을 기본 버튼으로 설정합니다.

textPtrcaptionPtr은 포인터이기 때문에 반드시 할당을 해제 해주어야 한다.

main.dart

import 'package:flutter/material.dart';
import 'windows_message_box.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Windows API Example'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Center(
              child: Text('Check your Windows message box!'),
            ),
            ElevatedButton(
              child: Text('Show Message Box'),
              onPressed: () {
                WindowsApi.showMessageBox(
                    'Hello, World!', 'Flutter Windows API');
              },
            ),
          ],
        ),
      ),
    );
  }
}

이제 버튼으 눌렀을 때 MessageBox가 나오도록 win32 api를 호출하는 함수를 구현한 showMessageBox 메소드를 호출하면 된다.