C++/MFC プロジェクト [3] - ピクセル描画

1. GDI オブジェクトを使用して描画するときに実行する 3 つの手順

1. 描画を開始する前に、新しい GDI オブジェクトを作成し、元の GDI オブジェクトへのポインタを保持したまま、それを現在のデバイス コンテキストに選択します。

2. 新しい GDI オブジェクト描画を使用します。

3. 描画が終了したら、元の GDI オブジェクトの保存されたポインタを使用して、デバイス コンテキストを元の状態に復元します。

2. GDI が提供する主な描画ツール

1. CGdiObject:さまざまな Windows GDI 描画ツールの基本クラスを提供します。

2. CBitmap:ビットマップ操作インターフェイスを提供します。

3. CBrush:デバイス コンテキストの現在のブラシとして選択できます。

4. CFont:デバイス コンテキストの現在のフォントとして選択できます。

5. CPalette:アプリケーションとディスプレイの間にカラー インターフェイスを提供します。

6. CPen:デバイス コンテキストの現在のペンとして選択できます。

3. ピクセル描画機能

1. SetPixel関数

戻り値: 関数が正常に呼び出された場合は、描画されたピクセルの RGB 値を返し、それ以外の場合は -1 を返します。

2. SetPixelV関数

戻り値: return Boolean - 関数呼び出しが成功した場合は「0 以外」を返し、それ以外の場合は「0」を返します。

注:一般に、SetPixelV 関数はピクセルの描画に使用されます。これは、SetPixel 関数は RGB 値を返す必要があり、実行速度が前者よりも遅いためです。

RGB は色表現方法の 1 つであり、「C++/MFC プロジェクト [1] - 新しいプロジェクトの作成と一般的に使用されるクラスの紹介」に簡単な概要が記載されています。

4. ピクセルカラー取得関数

GetPixel関数

戻り値: 関数が正常に呼び出された場合は、指定されたピクセル ポイントの RGB カラー値を返し、それ以外の場合は「-1」を返します。

五、例

1. P0 ポイント (100,100) を定義し、それを右に 100 ピクセル移動して P1 ポイントを取得します。点 P0 を赤として描画し、この点のピクセル カラーを取得して、その色を点 P1 に割り当てます。

CPoint P0(100, 100);//定义P0点
CPoint P1(P0.x + 100, P0.y);//右移100个像素得到P1点
pDC->SetPixel(P0, RGB(255, 0, 0));//绘制P0点为红色
COLORREF crColor = pDC->GetPixel(P0);//定义COLORREF型变量,获取P0点像素
pDC->SetPixel(P1, crColor);//颜色赋值给P1点

2. 座標系をカスタマイズし、Y 軸の右側に正方形を描画し、ランダムな色で塗りつぶします。GetPixel 関数を呼び出して正方形内の各ピクセルの座標と色を取得し、正方形を再描画 (コピー) します。 X 軸点セットの負の対称位置にあります。

//自定义坐标系
CRect rect;//不是单纯的一个数值
GetClientRect(rect);
pDC->SetMapMode(MM_ANISOTROPIC);//变量是一种映射模式;->:指向成员运算符
pDC->SetWindowExt(rect.Width(), rect.Height());//设置窗口大小(宽度、高度)
pDC->SetViewportExt(rect.Width(), -rect.Height());//设置视区的大小,使Y轴向上
pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);//设置原点位置
rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);//偏移函数,向左偏移
//绘制,左下角(50,-50),右上角(150,50)
srand((unsigned)time(NULL));//随机数发生器,使用time函数(秒数)获得一个随机值
COLORREF crColor;
for (int x = 50; x < 150; x++)//横坐标
	for (int y = -50; y < 50; y++)//纵坐标
		pDC->SetPixelV(x, y, RGB(rand() % 255, rand() % 255, rand() % 255));//绘制像素点
for(int x=50;x<150;x++)
	for (int y = -50; y < 50; y++)
	{
		crColor = pDC->GetPixel(x, y);//获取RGB值
		pDC->SetPixelV(-x, y, crColor);//X轴负向对称位置
	}

ランニング効果は以下の通りです。 

 \ライトアロー  

 プログラムが最初に右側の正方形を描画し、次に、肉眼で見える速度で右から左に対称的にスキャンされて描画される左側の正方形を描画していることがわかります。では、コードを次の状況に変更すると、結果はどうなるでしょうか?

srand((unsigned)time(NULL));//随机数发生器,使用time函数(秒数)获得一个随机值
COLORREF crColor;
for (int x = 50; x < 150; x++)//横坐标
	for (int y = -50; y < 50; y++)//纵坐标
	{
		pDC->SetPixelV(x, y, RGB(rand() % 255, rand() % 255, rand() % 255));//绘制像素点
		crColor = pDC->GetPixel(x, y);//获取RGB值
		pDC->SetPixelV(-x, y, crColor);//X轴负向对称位置
	}

 \ライトアロー 

 この時点で、プログラムが右列と左列を描画している (実際には、ピクセルごとにコピーしている) ことが容易にわかります。これは、コードに反映されている順序と一致しています。

おすすめ

転載: blog.csdn.net/zhou2622/article/details/129801867