PDA

View Full Version : سوال: ايجاد يك كلاس مستقل



noshin156
چهارشنبه 20 اردیبهشت 1391, 11:31 صبح
سلام

من از اين كد در برنامه زياد استفاده مي كنم


CClientDC dc(this);
HDC hdc = CreateCompatibleDC(dc);
HBITMAP hbm1, hbm2;
hbm1 = LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_f_from_r));
hbm2 = (HBITMAP)SelectObject(hdc, hbm1);
BitBlt(dc,x+210,y+200,600, 573,hdc,0,0, SRCCOPY);
DeleteObject(hbm1);
DeleteObject(hbm2);
DeleteDC(hdc);



مي خوام اين كد رو به يك تابع در يك كلاس جديد انتقال بدم و مقدار idرو به عنوان ورودي به اون ارسال كنم ولي به خاطر خط دستور زير نمي تونم اين كار رو انجام بدم

CClientDC dc(this);


ميشه منو راهنمايي كنيد؟

ASGGSA
جمعه 22 اردیبهشت 1391, 13:57 عصر
سلام.
نیازی به ارسال ID نیست شما در همان فایل CPP کلاستون که تابع در آن است هدر زیر را استفاده کنید.

#include "resource.h"

حالا نیاز هست این را HDC dc به عنوان ورودی تابع قرار بدهید و در تابع کلاس Dlg با نوشتن CClientDC dc(this); این dc را برای تابع بفرستید تا مشکل حل بشه.

noshin156
جمعه 22 اردیبهشت 1391, 16:28 عصر
خيلي ممنون مشكل من حل شد ولي من 7 تا شكل دارم كه مي خوام اين هفتا شكل رو با استفاده از يك تابع رسم كنم يعني تابع من هر بار براساس شرط خاصي يكي از شكل ها رو رسم كنه

ASGGSA
جمعه 22 اردیبهشت 1391, 21:19 عصر
خیلی راحت، اگه بخواهید از تابع یک کلاس دیگه تابعی در کلاس دیگری را اجرا کنید باید یک پارامتر دیگر به تابع خودتون اضافه کند که شماره هر شکل را بفرستید
بعد در تابع با switch یا if else می توانید هر شکل را جداگانه نمایش بدید. بطور مثال :

void NewClass::DisplayBMP(HDC dc, int num)
{
...
...
...
switch(num)
{
case 1:
hbm1 = LoadBitmap(...);
break;
case 2:
hbm1 = LoadBitmap(...);
break;
case 3:
hbm1 = LoadBitmap(...);
break;
...
...
...
}
hbm2 = (HBITMAP)SelectObject(..., hbm1);
...
...
...
}

mehdi.mousavi
شنبه 23 اردیبهشت 1391, 15:56 عصر
سلام من از اين كد در برنامه زياد استفاده مي كنم مي خوام اين كد رو به يك تابع در يك كلاس جديد انتقال بدم و مقدار idرو به عنوان ورودي به اون ارسال كنم ولي به خاطر خط دستور زير نمي تونم اين كار رو انجام بدمميشه منو راهنمايي كنيد؟

سلام.
کدی که نوشته اید، هووممم، صادقانه بگم، C++ نیست و از توانایی های MFC نیز مطلقا استفاده نمیکنه. یعنی اگر AfxGetInstanceHandle و CClientDC نیز در کد فوق حاضر نبود، دیگه کسی حتی نمیتونست متوجه بشه کد فوق در MFC قراره اجرا بشه... این بد نیست که ما توانایی استفاده از Win32 API ها و کلاس های MFC رو در کنار هم داریم، که بسیار هم خوبه، اما به شرطیکه تا حد امکان، از کلاس های موجود استفاده کنیم. بطور مثال، برای Load کردن یک Bitmap، نیازی نیست تا به LoadBitmap Win32 API متوسل بشید و نگران DeleteObject کردن این GDI Object به هنگام اتمام کار باشید:

CBitmap bmp;
bmp.LoadBitmapW(IDB_f_from_r);

کد فوق، Bitmap مورد نظر شما رو از Resource ID ی مربوطه load میکنه، بدون اینکه نیازی به گرفتن Instance Handle یا استفاده از MAKEINTRESOURCE داشته باشید. ضمنا، هر وقت bmp از Scope خارج بشه، DeleteObject بطور خودکار روی این کلاس (که از CGdiObject درایو شده) فراخوانی میشه، بنابراین نیازی به فراخوانی DeleteObject نیز نخواهد بود.

همینطور در مورد HDC و نحوه استفاده از CreateCompatibleDC... کلاسی داریم به اسم CDC که میتونید بدین شکل ازش استفاده کنید:

CDC memDC;
if(!memDC.CreateCompatibleDC(&dc))
return FALSE;

اینجا نیز، نیازی به فراخوانی DeleteDC نخواهید داشت، چون Destructor این کلاس این وظیفه خطیر رو بر عهده گرفته. در هر حال، مواکدا توصیه می کنم کتابی در مورد MFC و نحوه صحیح استفاده کردن از اون تهیه کرده و مطالعه کنید، تا بتونید از این Framework بخوبی بهره ببرید.

موفق باشید.

noshin156
شنبه 23 اردیبهشت 1391, 17:42 عصر
میشه یک کتاب خوب در این زمینه معرفی کنید؟