هدف از این آموزش ترسیم اشکال گرافیکی ساده در محیط ویندوز هست.

Rects2.jpg

پیش نیاز این آموزش:
- مطالعه دو لینک آموزشی در پست اول برای آشنایی با مفاهیم ساخت پنجره و پیام ها
- استفاده از کامپایلر visual C++‎ 2005 یا بالاتر


نحوه انجام:
1) ابتدا به منوی new رفته و یک پروژه از نوع win32 project با نام "rect1" و مقادیر پیش فرض بسازید (دقت کنید که console نباشد).
پروژه با چند فایل ساخته می شود، که ما با فایل rect1.cpp کار داریم.

2) برای رسم یک مربع ساده به این شکل عمل کنید:
در قسمت case و پیام WM_PAINT کار های گرافیکی در قسمت client یا همان قسمت سفید انجام می شود، دقت کنید که کد های گرافیکی باید مابین دو دستور BeginPaint و EndPaint نوشته شوند.

برای شروع مربعی بدون رنگ رسم می کنیم، کد را به شکل زیر تغییر دهید:
کد:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...

Rectangle(hdc, 100, 100, 200, 200); // Empty

EndPaint(hWnd, &ps);
break;

3) حال در کنار آن مربعی با یکی از رنگ های پیش فرض سیستم رسم می کنیم:
کد:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...

Rectangle(hdc, 100, 100, 200, 200); // Empty

SelectObject (hdc, GetStockObject (LTGRAY_BRUSH)) ;
Rectangle(hdc, 300, 100, 400, 200);
// Filled by light gray color

EndPaint(hWnd, &ps);
break;
در کد فوق با استفاده از دستور SelectObject یکی از اشیاء را مانند قلم ، مداد ، عکس و غیره را برای رنگ آمیزی و ترسیم می توانید انتخاب کنید. در این مورد ما با استفاده از تابع GetStockObject یکی از قلم های پیش فرض سیستم را انتخاب کردیم که خاکستری روشن هست. (سایر انواع : BLACK_BRUSH، HOLLOW_BRUSH ، WHITE_BRUSH ، BLACK_PEN و ....)


4) برای ساختن یک brush یا قلم دلخواه (با رنگ دلخواه) به این شکل عمل می کنیم:

- ابتدا قلم را در پیام WM_CREATE می سازیم (این پیام را خودتان در بخش case ها اضافه کنید )، هر چیزی که در بخش WM_CREATE نوشته شود در هنگام شروع برنامه قبل از هر چیزی اجرا می شود .

- از تابع CreateSolidBrush و ماکرو RGB برای ساخت قلم و رنگ استفاده می کنیم.

- hbrush از نوع HBRUSH باید قبل از switch تعریف شود و حتما static باشد چون فقط یک مرتبه در شروع برنامه مقدار دهی می شود.

- وقتی خودمان قلمی درست می کنیم باید در انتهای برنامه فضای اختصاص داده شده به آن را آزاد کنیم پس در قسمت WM_DESTROY در هنگام بستن برنامه را فراخوانی DeleteObject می کنیم .

- SelectObject آخر برای این است که همراه پس از انجام رسم ، قلم قبلی که پیش فرض سیستم بود انتخاب و آماده برای سایر موارد رسم بعدی شود.

پس تابع به شکل زیر تغییر داده می شود:
کد:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static HBRUSH hbrush, hbrushOld; // must be static

switch (message)
{
case WM_CREATE:
// Create a red brush
hbrush = CreateSolidBrush(RGB(255, 0, 0));

break;


case WM_COMMAND:
// **... I removed codes ... **
break;

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...

Rectangle(hdc, 100, 100, 200, 200); // Empty

SelectObject (hdc, GetStockObject (LTGRAY_BRUSH)) ;
Rectangle(hdc, 300, 100, 400, 200); // Filled by light gray color

// Select the new brush and draw
hbrushOld = (HBRUSH)SelectObject(hdc, hbrush);
Rectangle(hdc, 500, 100, 600, 200);
// Filled by light gray color
SelectObject(hdc, hbrushOld);
// select old brush

EndPaint(hWnd, &ps);
break;

case WM_DESTROY:
PostQuitMessage(0);
DeleteObject(hbrush);

break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
5) سایر توابعی که می توانید از آن ها برای رسم اشکال استفاده کنید:
Ellipse ، Polygon ، RoundRect ، Pie ، Chord ، Arc ، LineTo ، Polyline و ...

پروژه نیز ضمیمه شد.

در آینده نحوه کار با mouse و keyboard برای رسم اشکال نیز توضیح داده خواهد شد.

موفق باشید

فایل های ضمیمه rect1.zip‏ (18.1 کیلوبایت, 323 دیدار)