Black_Strom
چهارشنبه 28 دی 1401, 08:26 صبح
سلام من یک طراحی شبیه فرم را با کمک gdi طراحی کردم و به صورت لایه یعنی layered window دارم به کاربر نشون میدم ، واسه رسوندن منظورم به این شکل مثال میزنم :
یک طراحی شبیه اسکین که با کمک توابع گرافیکی gdi به شکل زیر در اومده و به کاربر نشونش میدم که شده این :
توضیح : این طراحی داخل یک کلاس به نام mycanvas انجام میشه وخاصیت هایی مثل hdc و saveaspng وgetasstream و متدهایی بیشتری داره که واسش طراحی کردم.
154458
تصویر شماره 1
و یک فرم ترانسپرنت که فقط کنترل ها را نمایش میده و روی طراحی قبلی نشونش میدم که این هست :
154459
تصویر شماره 2
و خروجی نهایی که کاربر میبینه این هست :
154460
تصویر شماره 3
حالا میخوام از این دو تا فرمی که روی هم قراردارند یک عکس قبل از اینکه کاربر فرم ها را ببینه بگیرم مشکل اینجاست که اکثرا توابع api ی که تست کردم یا زمانی کار میدن که دوتا فرم باید قابل دیدن باشه روی صفحه و یا اگر فرم ها را در مختصاتی خارج از محدوده دسکتاپ نمایش بدم و بخوام عکس گرفته بشه عکس خالی برمیگردونه یا خراب.
تنها تابعی که پیدا کردم تا الان و باهاش میشه از محدوده مورد نظرم عکس بگیرم در حالیکه هم بتونه خارج از محدوده دیده کاربر بر روی دسکتاپ را پوشش بده و هم فرم لایه ای پشت کنترل ها را در عکس داشته باشه دستور printwindow بود ، با دستور printwindow که امتحان کردم و عکس گرفته شده را در یک picturebox قرار دادم و محدوه مورد نظرم را برش دادم و داخل mypic2 ذخیره کردم ، عکس مشکلی نداره و خروجی برش داده شده این شده :
154461
تصویر برش داده شده - تصویر شماره 4
حالا اینجا دو سوال :
1- چرا عکسی که printwindow برگردونه داخل خاصیت image کنترل pictuebox ذخیره شده و داخل خاصیت picture ذخیره نشده که البته بعدش من اومدم با دستور زیر این خاصیت را هم ست کردم و نمیدونم درست هست یا نه :
with me
PrintWindow .hWnd, .mypic.hDC, 0
.
.
.
Set .mypic.Picture = .mypic.Image
end with
سپس با کمک دستور رندر خواستم اون را در یک کانواس رندر کنم که در نهایت به صورت یک فایل png ذخیرش کنم یا استریم شده داشته باشمش شبیه دستور زیر:
mypic2.Image.Render mycanvasclass.hDC, xLeft, xtop, xwidth, xHeight, .mypic2.Picture.Width, -.mypic2.Picture.Height, ByVal 0&
2- مشکل اینه که نمیدونم چرا رندری که انجام میدم داخل dc میاد عکس تصویر شماره 4 را به شکل عجیبی داخل کانواس که اسکینم هست (تصویر شماره 1) ترکیب میکنه ، عکس شماره 4 که درسته و هم محدوده و هم کنترل ها داخل عکس هستن اما چرا زمانی که میخواد با عکس شماره 1 ترکیبش کنه جای کنترل ها خالی می افته ؟ چطوری میشه این مشکل را حل کرد؟،خروجی نهایی کانواسم که به صورت png ذخیره کردم و یا میتونم اون را به صورت استریم هم داشته باشمش این شده : (میتونید عکس زیر را که png هست ذخیره کنید تا بهتر ببینیدش)
154462
من در نهایت یک تصویر ترکیب شده میخوام که هم اسکین و هم کنترل ها داخل تصویر وجود داشته باشند.
میبینید که 90 درصد مراحل انجام شده و فقط مونده این بخش رندر کردن تصویر شماره 4 داخل تصویر شماره 1.
اگر کسی دیسکورد یا اسکایپ داره میتونم اجرای برنامه را نشون بدم بهش واسه بهتر متوجه شدنه مشکل.
یک طراحی شبیه اسکین که با کمک توابع گرافیکی gdi به شکل زیر در اومده و به کاربر نشونش میدم که شده این :
توضیح : این طراحی داخل یک کلاس به نام mycanvas انجام میشه وخاصیت هایی مثل hdc و saveaspng وgetasstream و متدهایی بیشتری داره که واسش طراحی کردم.
154458
تصویر شماره 1
و یک فرم ترانسپرنت که فقط کنترل ها را نمایش میده و روی طراحی قبلی نشونش میدم که این هست :
154459
تصویر شماره 2
و خروجی نهایی که کاربر میبینه این هست :
154460
تصویر شماره 3
حالا میخوام از این دو تا فرمی که روی هم قراردارند یک عکس قبل از اینکه کاربر فرم ها را ببینه بگیرم مشکل اینجاست که اکثرا توابع api ی که تست کردم یا زمانی کار میدن که دوتا فرم باید قابل دیدن باشه روی صفحه و یا اگر فرم ها را در مختصاتی خارج از محدوده دسکتاپ نمایش بدم و بخوام عکس گرفته بشه عکس خالی برمیگردونه یا خراب.
تنها تابعی که پیدا کردم تا الان و باهاش میشه از محدوده مورد نظرم عکس بگیرم در حالیکه هم بتونه خارج از محدوده دیده کاربر بر روی دسکتاپ را پوشش بده و هم فرم لایه ای پشت کنترل ها را در عکس داشته باشه دستور printwindow بود ، با دستور printwindow که امتحان کردم و عکس گرفته شده را در یک picturebox قرار دادم و محدوه مورد نظرم را برش دادم و داخل mypic2 ذخیره کردم ، عکس مشکلی نداره و خروجی برش داده شده این شده :
154461
تصویر برش داده شده - تصویر شماره 4
حالا اینجا دو سوال :
1- چرا عکسی که printwindow برگردونه داخل خاصیت image کنترل pictuebox ذخیره شده و داخل خاصیت picture ذخیره نشده که البته بعدش من اومدم با دستور زیر این خاصیت را هم ست کردم و نمیدونم درست هست یا نه :
with me
PrintWindow .hWnd, .mypic.hDC, 0
.
.
.
Set .mypic.Picture = .mypic.Image
end with
سپس با کمک دستور رندر خواستم اون را در یک کانواس رندر کنم که در نهایت به صورت یک فایل png ذخیرش کنم یا استریم شده داشته باشمش شبیه دستور زیر:
mypic2.Image.Render mycanvasclass.hDC, xLeft, xtop, xwidth, xHeight, .mypic2.Picture.Width, -.mypic2.Picture.Height, ByVal 0&
2- مشکل اینه که نمیدونم چرا رندری که انجام میدم داخل dc میاد عکس تصویر شماره 4 را به شکل عجیبی داخل کانواس که اسکینم هست (تصویر شماره 1) ترکیب میکنه ، عکس شماره 4 که درسته و هم محدوده و هم کنترل ها داخل عکس هستن اما چرا زمانی که میخواد با عکس شماره 1 ترکیبش کنه جای کنترل ها خالی می افته ؟ چطوری میشه این مشکل را حل کرد؟،خروجی نهایی کانواسم که به صورت png ذخیره کردم و یا میتونم اون را به صورت استریم هم داشته باشمش این شده : (میتونید عکس زیر را که png هست ذخیره کنید تا بهتر ببینیدش)
154462
من در نهایت یک تصویر ترکیب شده میخوام که هم اسکین و هم کنترل ها داخل تصویر وجود داشته باشند.
میبینید که 90 درصد مراحل انجام شده و فقط مونده این بخش رندر کردن تصویر شماره 4 داخل تصویر شماره 1.
اگر کسی دیسکورد یا اسکایپ داره میتونم اجرای برنامه را نشون بدم بهش واسه بهتر متوجه شدنه مشکل.