PDA

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



once4ever
شنبه 13 مرداد 1386, 20:20 عصر
میخوام رو صفحه نمایش screen (خارج از هر محدودیت مکانی) یک مستطیل رنگی رسم کنم
داخل یک فرم میشه اینکارو انجام داد اما در اینصورت محدود به اندازه و محل فرم هست.

asar_001
شنبه 13 مرداد 1386, 21:19 عصر
اگه فرمت maximize باشه یا mdiform باشه و بی رنگ مشکلت حل نمی شه

once4ever
شنبه 13 مرداد 1386, 23:00 عصر
نچ نمیشه ;)

Amir Oveisi
یک شنبه 14 مرداد 1386, 01:03 صبح
فکر کنم اگه از یه فرم دیگه استفاده کنی درست بشه

alireza643
یک شنبه 14 مرداد 1386, 08:58 صبح
من قبلا c++ استفاده میکرم اونجا یه مفهومی داشتیم به نام DC که برای کار های گرافیکی از اون استفاده میکردم. برای گرفتن DC هم از تابع GetDC استفاده میکردیم برای این که DC از یه فرم بگیریم اسم فرم رو به عنوان ورودی به تابع میدادیم. برای این که از desktop استفاده کنیم عدد صفر رو به عنوان ورودی به تابع میدادیم. تو #C هم حتما باید یه همچین کاری بشه کرد ولی من دقیق نمیدونم. اساتید که حرفه ای هستن شاید بتونن بگن که چطور به این مفهوم میتونید استرسی پیدا کیند.
اگر راه مناسبی پیدا نشد یه راهش اینه که user32.dll رو import کنی و از توابع اون استفاده کنی. ولی قطعا روش مناسب تری هم هست

once4ever
یک شنبه 14 مرداد 1386, 10:53 صبح
اینجا میتونی از هر شی یک شی گرافیکی بگیری اما چجوری از screen میشه یه شی گرافیکی گرفت؟

ARA
یک شنبه 14 مرداد 1386, 12:53 عصر
سلام من قبلا برنامه ای نوشتم که روی دسکتاپ یک متن رو مینوشتم

همون طور که دوستمون گفته درسته از 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...

once4ever
یک شنبه 14 مرداد 1386, 18:24 عصر
ولی این دستور چیزی رسم نکرد!!!

newGraphics.FillRectangle(System.Drawing.Brushes.B lack, new Rectangle(20, 20, 200, 200));

PC2st
یک شنبه 14 مرداد 1386, 18:33 عصر
دستورات جالبی بودند ولی من هم چیزی که رسم کرده بودم رو ندیدم.

ARA
یک شنبه 14 مرداد 1386, 19:29 عصر
دقیقش رو چک میکنم براتون میگذارم الان دم دست نیست

once4ever
یک شنبه 14 مرداد 1386, 19:35 عصر
باید از کد زیر بجای 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);


جالب بودند.

alireza643
دوشنبه 15 مرداد 1386, 07:49 صبح
از همون GetDC هم میشه استفاده کرد ولی باید عدد صفر رو به عنوان پارامتر با تابع پاس کنید تا از دسکتاپ بتونید هندل بگیرید.

ALI_dolat
دوشنبه 15 مرداد 1386, 09:59 صبح
<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>

ARA
دوشنبه 15 مرداد 1386, 10:03 صبح
آره یادم رفته بود دیشب نگاه کردم D:
فقط یک چیزی که من نتونستم پیدا کنم دستور رrefresh اون بود که بتونی پاکش کنی و دوباره بنویسی
مثل کنترل Invalidate یا Refresh نداره

حامد مصافی
دوشنبه 15 مرداد 1386, 10:09 صبح
فقط یک چیزی که من نتونستم پیدا کنم دستور رrefresh اون بود که بتونی پاکش کنی و دوباره بنویسی تابع RedrawWindow

once4ever
سه شنبه 16 مرداد 1386, 10:26 صبح
تابع RedrawWindows

این تابع تو چه کلاسیه؟

ARA
سه شنبه 16 مرداد 1386, 11:06 صبح
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

rasoul_ras
سه شنبه 16 مرداد 1386, 15:42 عصر
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();
}
}
}
اینم نتیجه کار مشکل چیه ؟


http://img.photoamp.com/pa/07/08/07/qhjcw7NqxS.jpg

ARA
سه شنبه 16 مرداد 1386, 18:05 عصر
[DllImport("user32.dll", EntryPoint = "ReleaseDC", SetLastError = true)]
internalstaticexternint ReleaseDC(IntPtr hWnd, IntPtr hDC);



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

once4ever
سه شنبه 16 مرداد 1386, 18:13 عصر
یک جمع بندی کلی هم اینجا میگذارم تا برای بعدا روزی به کار آید
ReleaseDC,RedrawWindow,GetDesktopWindow,GetDC

این قسمت redrawwindow هنوز درست نشده که جمع بندی کردی:متفکر:
اینم حل بشه خودم واسه همه پستهات تشکر میزنم;)

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

ARA
سه شنبه 16 مرداد 1386, 18:27 عصر
فکر کنم چک نکردی جمع بندی رو (بابا ما که همیشه متشکریم )

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

once4ever
سه شنبه 16 مرداد 1386, 21:30 عصر
فکر کنم چک نکردی جمع بندی رو (بابا ما که همیشه متشکریم )

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

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

ARA
چهارشنبه 17 مرداد 1386, 11:12 صبح
فقط یک چیزی که من نتونستم پیدا کنم دستور رrefresh اون بود که بتونی پاکش کنی و دوباره بنویسی
مثل کنترل Invalidate یا Refresh نداره


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

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