API 関数を使用して DELPHI に「非定型」フォームを実装する
現在の一部のシェアウェア ソフトウェア、特に一部のマルチメディア プレーヤー ソフトウェアは、ユーザーを引き付けるために、プログラム インターフェイスの設計に細心の注意を払っています。実際、API 関数を使用して、これらの美しく代替効果を実現することもできます。
1. 特殊な形状
形状は正方形のみでしょうか?いいえ、他の形状も可能です。これには、2 つの Win32 API 関数を使用する必要があります。まず、CreateRoundRectRgn() 関数を使用して、フォーム内に楕円形の領域を定義します。ここで参照される領域は特別な API オブジェクトであり、領域内で塗りつぶしやクリッピングなどの操作を実行して、フォームの外部特性を定義できます。次に、SetWindowRgn() 関数を呼び出して描画します。さらに、CombineRgn() 関数を使用して、次のコードを Delphi ユニット ファイルに追加できます。
PROcedure TForm1.FormCreate(送信者: TObject);
変数
FRegion1:THandle;
FRegion2:THandle;
始める
FRegion1:=CreateRoundRectRgn(20,20,200,200,300,300);//楕円形の領域を区切る
FRegion2:=CreateRectRgn(170,170,400,400);//長方形の領域を区切る
CombineRgn(FRegion1,FRegion1,FRegion2,RGN_OR);//2 つの領域を接続します
SetwindowRgn(handle,FRegion1,True);//接続領域を描画
終わり;
プログラム セグメントの CreateRoundRectRgn() 関数は、丸みを帯びた長方形の領域を作成するために使用されます。そのプロトタイプは次のとおりです。
HRGN CreateRoundRectRgn(
int nLeftRect,//左上隅のX座標
int nTopRect,//左上隅のY座標
int nRightRect,//右下隅のX座標
int nBottomRect,//右下隅のY座標
int nWidthEllipse,//丸い角が位置する楕円の幅
int nHeightEllipse //丸い角が位置する楕円の高さ
);
多角形、楕円などの他のグラフィックには、対応する API 関数があります。プロトタイプは次のとおりです。
HRGN CreateEllipticRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect)
HRGN CreateEllipticRgnIndirect( CONST RECT *lprc)
HRGN CreatePolygonRgn(CONST POINT *lPPT,int cPoints, int fnPolyFillMode)
HRGN CreatepolypolygonRgn(CONST POINT *lppt,CONST INT *lpPolyCounts,int nCount,int fnPolyFillMode)
HRGN CreateRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect)
HRGN CreateRectRgnIndirect(CONST RECT *lprc)
上記の関数のパラメーターは理解しやすく、グラフィックの組み込み四角形の座標を示すか、四角形をポイントするために使用されます。他の 2 つの関数に注目してみましょう。
関数プロトタイプ: SetWindowRgn(
HWND hWnd, //現在のフォームのハンドル
HRGN hRgn, // 現在の領域のハンドル
BOOL bRedraw, //ロゴを再描画
)
機能: この関数は、作成された領域のハンドルをパラメータとして現在のフォームのハンドルに渡し、領域内にフォームを描画します。
関数プロトタイプ: CombineRgn(
HRGN hrgnDest, // 宛先エリアに接続するためのハンドル
HRGN hrgnSrc1, //ソース領域に接続する最初のハンドル
HRGN hrgnSrc2, // 2番目の接続元領域のハンドル
int fnCombineMode // 接続モード
)
機能: この機能は 2 つのエリアを新しいエリアにマージします。接続モードは次の値を取ることができます。
パラメータ値の効果
RGN_AND は、領域 1 と領域 2 の共通部分の交差から新しい領域を作成します。
RGN_COPY は、リージョン 1 のコピーを新しいリージョンとして作成します
RGN_DIFF は、エリア 1 に属しているがエリア 2 に属していないパーツを新しいエリアに接続します。
RGN_OR はエリア 1 とエリア 2 のすべての部分を接続します。つまり、結合します。
RGN_XOR。 エリア1とエリア2の全てのパーツを接続し、共通部分を削除
2.中空形状
この形の特徴は、両端があり、真ん中に一部が掘り込まれた形であることです。たとえば、次のコードを Delphi ユニット ファイルに追加します。
プロシージャ TForm1.FormCreate(送信者: TObject);
変数
FRegion3:THandle;
始める
Canvas.Font.Name:='中国語 Xingkai';//フォントを設定します
Canvas.Font.Size:=100;//フォントサイズを設定する
BeginPath(Canvas.Handle); //vanvas 上に描画された輪郭を取得します。
TextOut(form1.Canvas.Handle,0,20,'Program Spring and Autumn',8);//「Program Spring and Autumn」という 4 つの単語が占める領域を切り取ります。
EndPath(Canvas.Handle);
FRegion3:=PathToRegion(Canvas.Handle);//上記の領域をフォームに割り当てます
SetwindowRgn(Handle,FRegion3,True);//描画開始
終わり;
ここでは主に 3 つの API 関数が使用されます。
関数プロトタイプ: BOOL BeginPath (HDC hdc //デバイス環境のハンドル)
機能: 現在のデバイス環境のパス軌跡の受信を開始します。
関数プロトタイプ: BOOL EndPath(HDC hdc //デバイス環境のハンドル)
機能: 受信を停止し、受信したパス軌跡を現在のデバイス環境のハンドルに割り当てます。
関数プロトタイプ BOOL TextOut(
HDC hdc,//デバイス コンテキストのハンドル
int nXStart,//開始位置のX座標
int nYStart,//開始位置のY座標
LPCTSTR lpString,//文字列アドレス
int cbString //文字列に含まれる文字数 (1 つの漢字が 2 文字を占めることに注意してください)
)
機能: 指定された文字列を指定された位置に描画します。
概要: プログラミングで API を上手に使用する方法を学ぶことは非常に重要なスキルであり、予期しない結果が得られる場合もあります。上記のテクニックは、他の人にインスピレーションを与えることを目的としており、さまざまなテクニックを駆使し、想像力を駆使して、より魅力的な形をデザインし、独自のプログラムを美しくしていただければ幸いです。