نمایش نتایج 1 تا 2 از 2

نام تاپیک: چطوری میشه از طراحی یا فرم دلخواه عکس گرفت قبل از اینکه فرم یا طراحی به کاربر نمایش داده شده باشه ؟

  1. #1

    چطوری میشه از طراحی یا فرم دلخواه عکس گرفت قبل از اینکه فرم یا طراحی به کاربر نمایش داده شده باشه ؟

    سلام من یک طراحی شبیه فرم را با کمک gdi طراحی کردم و به صورت لایه یعنی layered window دارم به کاربر نشون میدم ، واسه رسوندن منظورم به این شکل مثال میزنم :

    یک طراحی شبیه اسکین که با کمک توابع گرافیکی gdi به شکل زیر در اومده و به کاربر نشونش میدم که شده این :
    توضیح : این طراحی داخل یک کلاس به نام mycanvas انجام میشه وخاصیت هایی مثل hdc و saveaspng وgetasstream و متدهایی بیشتری داره که واسش طراحی کردم.

    myskin.png
    تصویر شماره 1

    و یک فرم ترانسپرنت که فقط کنترل ها را نمایش میده و روی طراحی قبلی نشونش میدم که این هست :


    skincontrols.jpg
    تصویر شماره 2


    و خروجی نهایی که کاربر میبینه این هست :

    result.jpg
    تصویر شماره 3

    حالا میخوام از این دو تا فرمی که روی هم قراردارند یک عکس قبل از اینکه کاربر فرم ها را ببینه بگیرم مشکل اینجاست که اکثرا توابع api ی که تست کردم یا زمانی کار میدن که دوتا فرم باید قابل دیدن باشه روی صفحه و یا اگر فرم ها را در مختصاتی خارج از محدوده دسکتاپ نمایش بدم و بخوام عکس گرفته بشه عکس خالی برمیگردونه یا خراب.

    تنها تابعی که پیدا کردم تا الان و باهاش میشه از محدوده مورد نظرم عکس بگیرم در حالیکه هم بتونه خارج از محدوده دیده کاربر بر روی دسکتاپ را پوشش بده و هم فرم لایه ای پشت کنترل ها را در عکس داشته باشه دستور printwindow بود ، با دستور printwindow که امتحان کردم و عکس گرفته شده را در یک picturebox قرار دادم و محدوه مورد نظرم را برش دادم و داخل mypic2 ذخیره کردم ، عکس مشکلی نداره و خروجی برش داده شده این شده :

    croped.jpg
    تصویر برش داده شده - تصویر شماره 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 هست ذخیره کنید تا بهتر ببینیدش)




    من در نهایت یک تصویر ترکیب شده میخوام که هم اسکین و هم کنترل ها داخل تصویر وجود داشته باشند.
    میبینید که 90 درصد مراحل انجام شده و فقط مونده این بخش رندر کردن تصویر شماره 4 داخل تصویر شماره 1.

    اگر کسی دیسکورد یا اسکایپ داره میتونم اجرای برنامه را نشون بدم بهش واسه بهتر متوجه شدنه مشکل.
    آخرین ویرایش به وسیله Black_Strom : چهارشنبه 28 دی 1401 در 08:39 صبح دلیل: اصلاح عنوان

  2. #2

    نقل قول: چطوری میشه از طراحی یا فرم دلخواه عکس گرفت قبل از اینکه فرم یا طراحی به کاربر نمایش داده شد

    حل شد :


    با کمک دستور printwindow و دستوارت wia مجبور شدم عکس ها را باهم ترکیب کنم چیزی شبیه این :

    With Me

    Dim br() As Byte
    LayeredCanvas_Form(Main_Form1.mylayeredformid).Get AsStream br()
    If Dir(App.Path & "\skin.dat") <> "" Then Kill App.Path & "\skin.dat"
    LayeredCanvas_Form(Main_Form1.mylayeredformid).Sav eAsPNG App.Path & "\skin.dat"

    If .myimg.PictureExist Then .myimg.PictureDelete
    .mypic.Left = 20000
    .mypic.Top = 20000
    .mypic2.Left = 20000
    .mypic2.Left = 20000
    .myimg.PictureFromStream br
    Erase br


    .myimg.Visible = True
    .myimg.Width = Main_Form1.bg(0).Width
    .myimg.Height = Main_Form1.bg(0).Height
    .myimg.Refresh
    .myimg.Left = 0
    .myimg.Top = 0
    .mypic.Left = 0
    .mypic.Top = 0
    .mypic.Width = Main_Form1.bg(0).Width
    .mypic.Height = Main_Form1.bg(0).Height

    PrintWindow .hWnd, .mypic.hDC, 1
    If .myimg.PictureExist Then .myimg.PictureDelete
    .myimg.Refresh
    .myimg.Visible = False


    Set .mypic.Picture = .mypic.Image
    .mypic2.Width = Main_Form1.capturearea.Width
    .mypic2.Height = Main_Form1.capturearea.Height
    BitBlt .mypic2.hDC, 0, 0, Main_Form1.capturearea.Width, Main_Form1.capturearea.Height, .mypic.hDC, Main_Form1.capturearea.Left, Main_Form1.capturearea.Top, vbSrcCopy
    Set .mypic2.Picture = .mypic2.Image
    .mypic2.Refresh

    If Dir(App.Path & "\crop.dat") <> "" Then Kill App.Path & "\crop.dat"
    SavePicture .mypic2.Image, App.Path & "\crop.dat"


    .mypic.Picture = LoadPicture(""): .mypic2.Picture = LoadPicture("")
    .mypic.Width = 100: .mypic.Height = 100
    .mypic2.Width = 100: .mypic2.Height = 100
    .myimg.Left = 2000: .myimg.Top = 2000: .myimg.Width = 100: .myimg.Width = 100: .myimg.Visible = False
    .mypic.Left = 20000: .mypic.Top = 20000
    .mypic2.Left = 20000: .mypic2.Left = 20000
    .Refresh

    End With

    Dim mycls As New clscapture

    mycls.CaptureFormAndSaveFile "skin.dat", "crop.dat", "data.dat", Main_Form1.capturearea.Left, Main_Form1.capturearea.Top
    Set mycls = Nothing

    End Sub



برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •