لدي كود يقوم باضافة ظل للفورم ، حاولت ان احولة ل class اقوم باستدعائة عند الحاجة
لكن طهر لي مشاكل.
احتاج لجعل هذا الكود في class لاستدعائة عند الحاجة
الكود :
PHP كود :
/***********************************************************************/ // SHADOW FORM START /***********************************************************************/
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")] private static extern IntPtr CreateRoundRectRgn ( int nLeftRect, // x-coordinate of upper-left corner int nTopRect, // y-coordinate of upper-left corner int nRightRect, // x-coordinate of lower-right corner int nBottomRect, // y-coordinate of lower-right corner int nWidthEllipse, // height of ellipse int nHeightEllipse // width of ellipse );
[DllImport("dwmapi.dll")] public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
[DllImport("dwmapi.dll")] public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
[DllImport("dwmapi.dll")] public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
private bool m_aeroEnabled; // variables for box shadow private const int CS_DROPSHADOW = 0x00020000; private const int WM_NCPAINT = 0x0085; private const int WM_ACTIVATEAPP = 0x001C;
public struct MARGINS // struct for box shadow { public int leftWidth; public int rightWidth; public int topHeight; public int bottomHeight; }
private const int WM_NCHITTEST = 0x84; // variables for dragging the form private const int HTCLIENT = 0x1; private const int HTCAPTION = 0x2;
protected override CreateParams CreateParams { get { m_aeroEnabled = CheckAeroEnabled();
CreateParams cp = base.CreateParams; if (!m_aeroEnabled) cp.ClassStyle |= CS_DROPSHADOW;
protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_NCPAINT: // box shadow if (m_aeroEnabled) { var v = 2; DwmSetWindowAttribute(this.Handle, 2, ref v, 4); MARGINS margins = new MARGINS() { bottomHeight = 1, leftWidth = 1, rightWidth = 1, topHeight = 1 }; DwmExtendFrameIntoClientArea(this.Handle, ref margins);
} break; default: break; } base.WndProc(ref m);
if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT) // drag the form m.Result = (IntPtr)HTCAPTION;
} /***********************************************************************/ // SHADOW FORM END /***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Test
{
[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
class Class1 : Button
{
/***********************************************************************/
// SHADOW FORM START
/***********************************************************************/
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
int nLeftRect, // x-coordinate of upper-left corner
int nTopRect, // y-coordinate of upper-left corner
int nRightRect, // x-coordinate of lower-right corner
int nBottomRect, // y-coordinate of lower-right corner
int nWidthEllipse, // height of ellipse
int nHeightEllipse // width of ellipse
);
[DllImport("dwmapi.dll")]
public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
[DllImport("dwmapi.dll")]
public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
[DllImport("dwmapi.dll")]
public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
private bool m_aeroEnabled; // variables for box shadow
private const int CS_DROPSHADOW = 0x00020000;
private const int WM_NCPAINT = 0x0085;
private const int WM_ACTIVATEAPP = 0x001C;
public struct MARGINS // struct for box shadow
{
public int leftWidth;
public int rightWidth;
public int topHeight;
public int bottomHeight;
}
private const int WM_NCHITTEST = 0x84; // variables for dragging the form
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
protected override CreateParams CreateParams
{
get
{
m_aeroEnabled = CheckAeroEnabled();
CreateParams cp = base.CreateParams;
if (!m_aeroEnabled)
cp.ClassStyle |= CS_DROPSHADOW;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCPAINT: // box shadow
if (m_aeroEnabled)
{
var v = 2;
DwmSetWindowAttribute(this.Handle, 2, ref v, 4);
MARGINS margins = new MARGINS()
{
bottomHeight = 1,
leftWidth = 1,
rightWidth = 1,
topHeight = 1
};
DwmExtendFrameIntoClientArea(this.Handle, ref margins);
}
break;
default:
break;
}
base.WndProc(ref m);
if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT) // drag the form
m.Result = (IntPtr)HTCAPTION;
}
/***********************************************************************/
// SHADOW FORM END
/***********************************************************************/
}
}
تحياتى لك
وتمنياتى لك التوفيق
{وَقُل رَّبِّ زِدْنِي عِلْمًا}
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]
ساهم دائماً فى لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله
يبدو ان هناك سوء فى بداية الموضوع حيث انه يتحدث صاحب الموضوع
كون الكود يقوم بعمل تظليل للشئ المحدد له ولكن الامر ليس هكذا
كل الامر هو تمكين حركة الاداء وكل ما فعلته هو تحويل الكود
للعمل كا كلاس على اداء طبقاً لما يقوم بتحديده من خلال تغيير هذه الجملة
PHP كود :
: Button
قد يكون صاحب الموضوع وضع كود بدلاً من كود اخر عند كتابة الموضوع
او هناك خطاء ماء لم انتبه له لعل عند تواجد صاحب الموضوع وضع صورة لشكل الفورم عند تنفيذ الكود
مع ارفاق سورس للشاشة مع الكود لاتمام تحويله الى كلاس
والله اعلم قد اكون انا سهوت عن شئ لم انتبه اليه الى هذه اللحظة
تحياتى لك
وتمنياتى لك التوفيق
مرحبا اخي الجوكر ..
في الحقية الكود الغرض منة اضافة ظل للفورم لتفرقتة عن الفورم الذي خلفة لاني استخدم الكود بخاصية ال border none
في الكود المرفق ايضا موجود خاصية ال drag للفورم وتحريكه عند الضط بالفارة و ايضا تكبير الفورم عند الضعط المزدوج على الفارة
عندكا اريد استخدام الكود اقوم بوضعة في الفورم المحدد وهو امر مزعج ومكرر كثيرا .....
المطلوب هو تحويل الكود ل class اقوم باستدعائة فقط بدل نسخ الكود في اكثر من فورم