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

نام تاپیک: رسم یک مستطیل رنگی روی صفحه دسکتاپ

  1. #1

    رسم یک مستطیل رنگی روی صفحه دسکتاپ

    میخوام رو صفحه نمایش screen (خارج از هر محدودیت مکانی) یک مستطیل رنگی رسم کنم
    داخل یک فرم میشه اینکارو انجام داد اما در اینصورت محدود به اندازه و محل فرم هست.

  2. #2
    اگه فرمت maximize باشه یا mdiform باشه و بی رنگ مشکلت حل نمی شه

  3. #3

  4. #4

  5. #5
    کاربر دائمی آواتار alireza643
    تاریخ عضویت
    شهریور 1384
    محل زندگی
    روی زمین
    پست
    368
    من قبلا C++‎ استفاده میکرم اونجا یه مفهومی داشتیم به نام DC که برای کار های گرافیکی از اون استفاده میکردم. برای گرفتن DC هم از تابع GetDC استفاده میکردیم برای این که DC از یه فرم بگیریم اسم فرم رو به عنوان ورودی به تابع میدادیم. برای این که از desktop استفاده کنیم عدد صفر رو به عنوان ورودی به تابع میدادیم. تو #C هم حتما باید یه همچین کاری بشه کرد ولی من دقیق نمیدونم. اساتید که حرفه ای هستن شاید بتونن بگن که چطور به این مفهوم میتونید استرسی پیدا کیند.
    اگر راه مناسبی پیدا نشد یه راهش اینه که user32.dll رو import کنی و از توابع اون استفاده کنی. ولی قطعا روش مناسب تری هم هست

  6. #6
    اینجا میتونی از هر شی یک شی گرافیکی بگیری اما چجوری از screen میشه یه شی گرافیکی گرفت؟

  7. #7
    کاربر دائمی آواتار ARA
    تاریخ عضویت
    آبان 1383
    محل زندگی
    Bad Sector
    پست
    448

    Thumbs down

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

    همون طور که دوستمون گفته درسته از api های ویندوز استفاده کن


    [DllImport("user32.dll", EntryPoint="GetDesktopWindow")]
    public static extern IntPtr GetDesktopWindow();

    [DllImport("user32.dll",EntryPoint="GetDC")]
    public static extern IntPtr GetDC(IntPtr hWnd);


    از GetDesktopWindow پوینتر desktop رو بگیر بده به GetDC و

    IntPtr hdc = GetDC(GetDesktopWindow());



    حالا از hdc با createFromHdc یک گرافیک بگیر و رو اون بنویس یا بکش


    Graphics newGraphics = Graphics.FromHdc(hdc);
    newGraphic.Draw...

  8. #8
    ولی این دستور چیزی رسم نکرد!!!
    newGraphics.FillRectangle(System.Drawing.Brushes.B  lack, new Rectangle(20, 20, 200, 200));

  9. #9
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    دستورات جالبی بودند ولی من هم چیزی که رسم کرده بودم رو ندیدم.

  10. #10
    کاربر دائمی آواتار ARA
    تاریخ عضویت
    آبان 1383
    محل زندگی
    Bad Sector
    پست
    448

    Thumbs down

    دقیقش رو چک میکنم براتون میگذارم الان دم دست نیست

  11. #11
    باید از کد زیر بجای GetDC استفاده کرد:
      [DllImport("User32.dll", SetLastError=true)]
    public static extern IntPtr GetWindowDC(
    IntPtr WindowHandle);


    و به این شکل مینویسیم:

    IntPtr desktopHandle = Win32.GetDesktopWindow();
    IntPtr desktopDC = Win32.GetWindowDC(desktopHandle);
    Graphics desktop = Graphics.FromHdc(desktopDC);


    جالب بودند.

  12. #12
    کاربر دائمی آواتار alireza643
    تاریخ عضویت
    شهریور 1384
    محل زندگی
    روی زمین
    پست
    368
    از همون GetDC هم میشه استفاده کرد ولی باید عدد صفر رو به عنوان پارامتر با تابع پاس کنید تا از دسکتاپ بتونید هندل بگیرید.

  13. #13
    <P>دوست منو از این که جسارتا نظرم را میگویم ببخشید</P>
    <P>در ویندوز کلیه پنجره ها دارای handle میباشند که با استفاده از هندل میتوانیم عملیاتهای خاصی بر روی آنها انجام دهیم معمولا برای گرفتن&nbsp;دستگره گرافیک&nbsp;برنامه ها از تابع</P>
    <P>&nbsp;GetDC&nbsp;&nbsp; استفاده می شود که دستگیره دسکتاپ هم صفر است یعنی (0)getdc حالا یک متغییر گرافیکی مثل Tbitmap تعریف کرده و dc&nbsp; دستگیره آن را برابر&nbsp; (0)getdc قرار می دهیم حالا هر چه در Bitmap ترسیم کنید بر روی دسکتاپ ترسیم می شود.</P>
    <P>delphi</P>
    <P>var</P>
    <P>b:tbitmap</P>
    <P>begin</P>
    <P>b:=tbitmap.create;</P>
    <P>b.cavas.handle:=getdc(0);</P>
    <P>b.canvas.rectangle(10,10,100,100)</P>
    <P>end;</P>
    <P>آرزوی موفقیت.</P>

  14. #14
    کاربر دائمی آواتار ARA
    تاریخ عضویت
    آبان 1383
    محل زندگی
    Bad Sector
    پست
    448
    آره یادم رفته بود دیشب نگاه کردم D:
    فقط یک چیزی که من نتونستم پیدا کنم دستور رrefresh اون بود که بتونی پاکش کنی و دوباره بنویسی
    مثل کنترل Invalidate یا Refresh نداره

  15. #15

  16. #16
    تابع RedrawWindows
    این تابع تو چه کلاسیه؟

  17. #17
    کاربر دائمی آواتار ARA
    تاریخ عضویت
    آبان 1383
    محل زندگی
    Bad Sector
    پست
    448
    api هستش

    من هنوز چکش نکردم


    [DllImport("user32.dll")]
    static extern bool RedrawWindow(IntPtr hWnd, [In] ref RECT lprcUpdate,
    IntPtr hrgnUpdate, uint flags);

    [DllImport("user32.dll")]
    static extern bool RedrawWindow(IntPtr hWnd, IntPtr lprcUpdate,
    IntPtr hrgnUpdate, uint flags);


    http://pinvoke.net/default.aspx/user32.RedrawWindow

  18. #18

    ابن کد کار میکنه

    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    using System.Media;
    using System;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Runtime.InteropServices;

    namespace audio
    {
    internal class UnmanagedMethods
    {

    [DllImport("user32")]
    internal static extern IntPtr GetDC(IntPtr hwnd);

    [DllImport("User32.dll")]
    internal static extern void ReleaseDC(IntPtr dc);

    }



    public class DrawToScreen
    {
    public void PaintRectangleToScreen()
    {
    IntPtr deskDC = UnmanagedMethods.GetDC(IntPtr.Zero);

    Graphics g = Graphics.FromHdc(deskDC);

    g.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.CadetBlue)), 0, 0, 300, 300);

    //g.EndContainer(cont);

    g.Dispose();

    UnmanagedMethods.ReleaseDC(deskDC);
    }
    }

    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    DrawToScreen d = new DrawToScreen();
    d.PaintRectangleToScreen();
    }
    }
    }
    اینم نتیجه کار مشکل چیه ؟








  19. #19
    کاربر دائمی آواتار ARA
    تاریخ عضویت
    آبان 1383
    محل زندگی
    Bad Sector
    پست
    448

    Thumbs down


    [DllImport("user32.dll", EntryPoint = "ReleaseDC", SetLastError = true)]
    internalstaticexternint ReleaseDC(IntPtr hWnd, IntPtr hDC);



    یک جمع بندی کلی هم اینجا میگذارم تا برای بعدا روزی به کار آید
    ReleaseDC,RedrawWindow,GetDesktopWindow,GetDC
    فایل های ضمیمه فایل های ضمیمه

  20. #20
    یک جمع بندی کلی هم اینجا میگذارم تا برای بعدا روزی به کار آید
    ReleaseDC,RedrawWindow,GetDesktopWindow,GetDC
    این قسمت redrawwindow هنوز درست نشده که جمع بندی کردی
    اینم حل بشه خودم واسه همه پستهات تشکر میزنم;)

    آقای rasoul_ras این عکس رو بصورت attach اگه قرار میدادی خیلی بهتر بود!

  21. #21
    کاربر دائمی آواتار ARA
    تاریخ عضویت
    آبان 1383
    محل زندگی
    Bad Sector
    پست
    448
    فکر کنم چک نکردی جمع بندی رو (بابا ما که همیشه متشکریم )

    کاملا حل شد با تشکر از همه بچه هایی که بحث رو تکمیل کردند

  22. #22
    فکر کنم چک نکردی جمع بندی رو (بابا ما که همیشه متشکریم )

    کاملا حل شد با تشکر از همه بچه هایی که بحث رو تکمیل کردند
    بابا مگه من ننوشتم تشکر نکنید؟ :((

    احتمالا من اشتباه میکنم! یه نگاه بنداز وقتی روی دسکتاپ مینویسی Hello و با فرم از روش رد میشی پاک میشه! ;)

  23. #23
    کاربر دائمی آواتار ARA
    تاریخ عضویت
    آبان 1383
    محل زندگی
    Bad Sector
    پست
    448

    Thumbs down

    نقل قول نوشته شده توسط ARA مشاهده تاپیک
    فقط یک چیزی که من نتونستم پیدا کنم دستور رrefresh اون بود که بتونی پاکش کنی و دوباره بنویسی
    مثل کنترل Invalidate یا Refresh نداره

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

    حالا فهمیدم منظورتون چیه ولی به نظرم( فکر کنم ) تو این قسمت هر لحظه خودمون باید صفحه رو Refresh کنیم یعنی پاک کنیم و دوباره بنویسیم هر بار منتظر رسیدن message
    wm_paint به صفحه بشیم hook کنیم و وصفحه خودمون رو بکشیم

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

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