WinAPI: CombineRgn - 区域合成

CombineRgn(
  p1: HRGN;     {合成后的区域}
  p2, p3: HRGN; {两个原始区域}
  p4: Integer   {合并选项; 见下表}
): Integer;     {有四种可能的返回值}

//合并选项:
RGN_AND  = 1;
RGN_OR   = 2;
RGN_XOR  = 3;
RGN_DIFF = 4;
RGN_COPY = 5; {复制第一个区域}

//返回值:
ERROR         = 0; {错误}
NULLREGION    = 1; {空区域}
SIMPLEREGION  = 2; {单矩形区域}
COMPLEXREGION = 3; {多矩形区域}

 
 
本例效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  Rgn1,Rgn2,Rgn: HRGN;

//初始化
procedure TForm1.FormCreate(Sender: TObject);
begin
  {建立两个原始区域}
  Rgn1 := CreateEllipticRgn(20, 20, 120, 160);
  Rgn2 := CreateEllipticRgn(70, 20, 170, 160);

  {Rgn 是用来接受运算结果的, 但函数 CombineRgn 要求它必须是已存在的区域, 这里虚拟一个}
  Rgn := CreateRectRgnIndirect(BoundsRect);

  RadioGroup1.Items.CommaText := '两个原始区域,RGN_AND,RGN_OR,RGN_XOR,RGN_DIFF,RGN_COPY';
  RadioGroup1.ItemIndex := 0;
end;

//见到窗体时先绘制一次
procedure TForm1.FormActivate(Sender: TObject);
begin
  RadioGroup1Click(nil);
end;

//主要代码
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  Repaint;
  if RadioGroup1.ItemIndex = 0 then
  begin
    Canvas.Brush.Color := clSilver;
    Canvas.Brush.Style := bsDiagCross;
    FillRgn(Canvas.Handle, Rgn1, Canvas.Brush.Handle);
    FillRgn(Canvas.Handle, Rgn2, Canvas.Brush.Handle);

    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := clRed;
    FrameRgn(Canvas.Handle, Rgn1, Canvas.Brush.Handle, 2, 2);
    FrameRgn(Canvas.Handle, Rgn2, Canvas.Brush.Handle, 2, 2);
  end else begin
    CombineRgn(Rgn, Rgn1, Rgn2, RadioGroup1.ItemIndex);

    Canvas.Brush.Color := clSilver;
    Canvas.Brush.Style := bsDiagCross;
    FillRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle);

    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := clRed;
    FrameRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle, 2, 2);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeleteObject(Rgn1);
  DeleteObject(Rgn2);
  DeleteObject(Rgn);
end;

end.

  
  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 182
  ClientWidth = 300
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnActivate = FormActivate
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object RadioGroup1: TRadioGroup
    Left = 189
    Top = 8
    Width = 106
    Height = 166
    Caption = 'RadioGroup1'
    TabOrder = 0
    OnClick = RadioGroup1Click
  end
end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的实现 Windows 应用程序的代码,可以根据用户输入的成绩计算对应的等级,并给出相应的提示。同时,程序还包含了对无效成绩的处理和退出功能。 ```c++ #include <Windows.h> #include <string> // 定义等级和分数的对应关系 const std::string GRADE_TABLE[] = { "D", "C", "B", "A" }; const int SCORE_TABLE[] = { 0, 60, 80, 90 }; // 窗口标题和控件 ID const char* WINDOW_TITLE = "Grade Calculator"; const int EDIT_CONTROL_ID = 1; const int BUTTON_CONTROL_ID = 2; // 窗口句柄和控件句柄 HWND g_hWnd; HWND g_hEdit; HWND g_hButton; // 处理按钮点击事件 void OnButtonClick() { // 获取用户输入的成绩 char buffer[256]; GetWindowTextA(g_hEdit, buffer, 256); int score = atoi(buffer); // 判断输入的成绩是否有效 if (score < 0 || score > 100) { MessageBoxA(g_hWnd, "Invalid score!", "Error", MB_OK); return; } // 计算对应的等级 int grade = 0; for (int i = 0; i < 4; i++) { if (score >= SCORE_TABLE[i]) { grade = i; } else { break; } } // 显示对应的等级 std::string message = "Grade: " + GRADE_TABLE[grade]; MessageBoxA(g_hWnd, message.c_str(), "Result", MB_OK); } // 处理窗口消息 LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: // 创建编辑框控件 g_hEdit = CreateWindowA("EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 20, 200, 24, hWnd, (HMENU)EDIT_CONTROL_ID, NULL, NULL); // 创建按钮控件 g_hButton = CreateWindowA("BUTTON", "Calculate", WS_CHILD | WS_VISIBLE, 20, 60, 100, 30, hWnd, (HMENU)BUTTON_CONTROL_ID, NULL, NULL); break; case WM_COMMAND: // 处理按钮点击事件 if (LOWORD(wParam) == BUTTON_CONTROL_ID) { OnButtonClick(); } break; case WM_DESTROY: // 退出程序 PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } // 应用程序入口函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASSA wc = { 0 }; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszClassName = "GradeCalculator"; RegisterClassA(&wc); // 创建窗口 g_hWnd = CreateWindowA("GradeCalculator", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 150, NULL, NULL, hInstance, NULL); // 显示窗口 ShowWindow(g_hWnd, nCmdShow); UpdateWindow(g_hWnd); // 消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } ``` 这个程序用到了 Win32 API 来创建窗口和控件,并处理用户输入和按钮点击事件。通过判断用户输入的成绩是否有效,计算对应的等级,并给出提示。如果输入的成绩无效,程序会弹出一个提示框告诉用户。程序还包含了退出功能,用户可以通过关闭窗口或者按下 Alt + F4 来退出程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值