PDA

View Full Version : طریقه Transparent کردن StaticText در VC



Moharram
یک شنبه 14 مرداد 1386, 22:02 عصر
سلام
من یه دیالوگ دارم که یه Bitmap رو بعنوان Textture روش استفاده کردم، حالا وقتی یه label روش میذارم موقع اجرا Transparent نمیشه.........

با تشکر

Nima_NF
پنج شنبه 15 شهریور 1386, 01:30 صبح
سلام

هنوز به پاسخ سوالتون نیاز دارید یا به جواب رسیدید ؟
اگر نه، بگید گه براتون توضیح بدم.

zoncpp
شنبه 17 شهریور 1386, 13:15 عصر
بگید گه براتون توضیح بدم.

جواب رو برای من توضیح می دید؟ ممنون

Nima_NF
شنبه 17 شهریور 1386, 14:35 عصر
در win32 , از پیام WM_CTLCOLORDLG برای تغییر رنگ دیالوگ ها استفاده می کنیم و برای تغییر رنک هر نوع ابزاری که از نوع static باشند مثل Slider, static text و غیره از پیام WM_CTLCOLORSTATIC استفاده می کنیم که اگر handle یک brush رو در حالی که به یک Bool تغییر داده باشیم (cast) باعث می شه که از این به بعد رنگ control های static ما به رنگ برگشت داده شده تغییر پیدا کنه و اگر هم FALSE برگردانده شود تغییر رنگ صورت نمی گیرد و چون text های ما به طور پیش فرض دارای پشت زمینه می باشد از طریق SetBkMode آن را به حالت شفاف باید تغییر دهیم .
سایر پیغام ها برای تغییر رنگ سایر اجزا که همگی با WM_CTLCOLOR شروع می شوند :
WM_CTLCOLORBTN
WM_CTLCOLOREDIT
WM_CTLCOLORDLG
WM_CTLCOLORLISTBOX
WM_CTLCOLORSCROLLBAR
WM_CTLCOLORSTATICاین procedure به عنوان یک نمونه برای دیالوگی هست که رنگش به خاکستری تغییر پیدا کرده:



INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HBRUSH graybrush;
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_CTLCOLORSTATIC:
SetBkMode ( (HDC)wParam, TRANSPARENT);
graybrush = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
return (BOOL)graybrush;

case WM_CTLCOLORDLG:
graybrush = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
//SelectObject (wParam, GetStockObject(DKGRAY_BRUSH));
return (INT_PTR)graybrush;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;

}
return (INT_PTR)TRUE;

}



برای اطلاعات پیاده سازی در MFC داخل MSDN به بخش WM_CTLCOLOR notification مراجعه کنید که اعمالی مشابه باید انجام شود و شامل یک مثال مفید هست که با قرار دادن یک IF می توانید فقط یک کنترل خواص را تغییر رنگ دهید زیرا این پیغام ها برای تک تک اجزا فرستاده می شوند.


با تشکر

Nima_NF
شنبه 17 شهریور 1386, 17:11 عصر
در مورد یک عکس به صورت پشت زمینه کار مشکل می شود و راحت نیست ( اما خوشبختانه برای یک عکس با اندازه کامل دیالوگ وکنترل های static text راحت است یعنی همان چیزی که در اکثر دیالوگ About نرم افزارها می بینید)
در غیر این صورت باید کنترل های شما به صورت custom Draw یا OwnerDraw طراحی شود.

توجه کنید که عکس را نباید با ابزار های طراحی دیالوگ اعمال کنید . یکی از روش ها به شکل زیر است :





static HBITMAP hbm;
; static HBRUSH hbrush, hbrushOld

case WM_INITDIALOG:
hbm = LoadBitmap (hInst ,MAKEINTRESOURCE(IDB_BITMAP1) );
hbrush = CreatePatternBrush(hbm);
return (INT_PTR)TRUE;



case WM_CTLCOLORSTATIC:
SetBkMode ( (HDC)wParam, TRANSPARENT);
return (BOOL)hbrush;

case WM_CTLCOLORDLG:

return (INT_PTR)hbrush;



- ضمنا پاکسازی ها به عهده خودتون مثلا SetBkMode مجدد و یا در موقع بستن دیالوگ



DeleteObject(hbrush);
DeleteObject (hbm);

complexcoding
دوشنبه 13 شهریور 1391, 11:23 صبح
دوستان چرا همش به روش Win32 و GDI یاد می دید؟ مگه MFC در این زمینه کلاس نداره ؟
من خودم دیدم که در این آدرس The Background Picture of a Dialog Box به راحتی یک لیوان آب توضیح داده اما من چون نمی دونم این کدها رو کجا بنویسم هییییچی متوجه نشدم.:لبخند: خنده نداره گریه داره:گریه:
اگر شما متوجه شدید به منم یاد بدید ترجمشم تو این آدرسه
http://barnamenevis.org/showthread.php?358884-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-MFC