Vykreslení Bitmapy do lišty – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vykreslení Bitmapy do lišty – .NET – Fórum – Programujte.comVykreslení Bitmapy do lišty – .NET – Fórum – Programujte.com

 

Mutagen0
Super člen
26. 6. 2012   #1
-
0
-

Zdravím chci se zeptat jak jde vykreslit bitmapa do listy windows okna. Jde o to že jsem na to narazil u jednoho programu a docela by se mi to taky líbilo. Pokud někdo nechápe co myslim tu je obráze.

Nahoře to zeleny + ty miniobrázky ...

Děkuji za odpověd

Nahlásit jako SPAM
IP: 89.190.90.–
liborb
~ Redaktor
+18
Guru
27. 6. 2012   #2
-
0
-

Hledej "non-client area".

Nahlásit jako SPAM
IP: 78.80.52.–
Mutagen
~ Anonymní uživatel
549 příspěvků
27. 6. 2012   #3
-
0
-

Tak jsem něco našel přímo pro tuto hru co potřebuju, ale vůbec se v tom nevyznám a neorientuju. Nebyl by někdo schopný z toho vytáhnout jen to co je hlavní? (třeba vypsání 1 miniobrázku?) A dokonce je to i přímo pro program v kterým to potřebuju napsat, ale jak sem řekl absolutně se v tom neorientuju.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using MulLib;
using Phoenix.Runtime;
using Phoenix.WorldData;
using Phoenix.Communication;
using System.Text;
 
namespace Phoenix.Scripts {
    public class CreateCharacter {
        [ClientMessageHandler(0x00)]
        public CallbackResult OnCreateCharacter( byte[] data, CallbackResult prevResult ) {
            byte[] bytes = Encoding.ASCII.GetBytes( "Kringelbert Fishtybuns" );
 
            Array.Copy( bytes, 0, data, 10, bytes.Length );
 
            return prevResult;
        }
    }
 
    [RuntimeObject]
    public class ResourceCounter : IDisposable {
        private const int GWLP_WNDPROC = -4;
        private const int BoxSpacing = 15;
 
        public ResourceCounter() {
            items = new List<IDrawable>() {
                    new ItemInfo( "BM", 0x0F7B, 0x0000, new Rectangle( 6, -4, 30, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "BP", 0x0F7A, 0x0000, new Rectangle( 17, -7, 10, SystemInformation.CaptionHeight - 2 )  ),
                    new ItemInfo( "GC", 0x0F84, 0x0000, new Rectangle( 0, -5, 30, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "GS", 0x0F85, 0x0000, new Rectangle( 15, -3, 20, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "MR", 0x0F86, 0x0000, new Rectangle( 11, -3, 20, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "NS", 0x0F88, 0x0000, new Rectangle( 5, 1, 30, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "SA", 0x0F8C, 0x0000, new Rectangle( 9, -4, 30, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "SS", 0x0F8D, 0x0000, new Rectangle( 8, -3, 20, SystemInformation.CaptionHeight - 2 ) ),
                    new Separator( "|" ),
                    new ItemInfo( "Bloodspawn", 0x0F7C, 0x0000, new Rectangle( 8, -3, 17, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "Brimstone", 0x0F7F, 0x0000, new Rectangle( 17, -4, 15, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "Obsidian", 0x0F89, 0x0000,  new Rectangle( 7, -3, 25, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "Blackmoor", 0x0F79, 0x0000, new Rectangle( 16, -4, 20, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "Batwing", 0x0F78, 0x0000, new Rectangle( 14, -2, 16, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "Eye of Newt", 0x0F87, 0x0000, new Rectangle( 16, -7, 9, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "Vial of Blood", 0x0F7D, 0x0000, new Rectangle( 16, -1, 10, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "Bone", 0x0F7E, 0x0000,  new Rectangle( 16, -3, 23, SystemInformation.CaptionHeight - 2 ) ),
                    new Separator( "|" ),
                    new ItemInfo( "TMR", 0x0F09, 0x0003, new Rectangle( 9, -1, 15, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "GH", 0x0F0C, 0x0000, new Rectangle( 9, -1, 15, SystemInformation.CaptionHeight - 2 ) ),
                    new ItemInfo( "TR", 0x0F0B, 0x0000, new Rectangle( 9, -1, 15, SystemInformation.CaptionHeight - 2 ) ),
                    new Separator( "|" ),
                    new ItemInfo( "Bandage", 0x0E21, 0x0000, new Rectangle( 11, -2, 22, SystemInformation.CaptionHeight - 2) ),
                };
 
            Debug.WriteLine( "Installing wndproc hook", "ResourceCounter" );
 
            originalWndProc = NativeMethods.GetWindowLong( Client.HWND, GWLP_WNDPROC );
            if ( originalWndProc == IntPtr.Zero )
                throw new Win32Exception();
 
            wndProc = new WndProcDelegate( WndProc );
 
            if ( NativeMethods.SetWindowLong( Client.HWND, GWLP_WNDPROC, Marshal.GetFunctionPointerForDelegate( wndProc ) ) == IntPtr.Zero )
                throw new Win32Exception();
 
            RuntimeCore.UnregisteringAssembly += new UnregisteringAssemblyEventHandler( RuntimeCore_UnregisteringAssembly );
 
            Redraw();
        }
        ~ResourceCounter() {
            Dispose();
        }
 
        private List<IDrawable> items;
        private WndProcDelegate wndProc;
        private IntPtr originalWndProc;
 
        public void Redraw() {
            if ( ( from t in items.OfType<ItemInfo>()
                   join i in World.Player.Backpack.AllItems on new {
                       t.Graphic,
                       t.Color
                   } equals new {
                       i.Graphic,
                       i.Color
                   } into x
                   from i in x.DefaultIfEmpty()
                   group i by t into r
                   select new {
                       Type = r.Key,
                       Amount = r.Sum( a => a != null ? a.Amount : 0 )
                   } ).Count( i => i.Type.Update( i.Amount ) ) > 0 ) {
 
                NativeMethods.SendMessage( Client.HWND, 0x85, IntPtr.Zero, IntPtr.Zero );
                if ( Marshal.GetLastWin32Error() != 0 )
                    throw new Win32Exception();
            }
        }
 
        [ServerMessageHandler( 0x33, Priority = CallbackPriority.Lowest )]
        public CallbackResult OnAddItemToContainer( byte[] data, CallbackResult prevResult ) {
            if ( data[ 1 ] == 0 )
                Redraw();
 
            return prevResult;
        }
 
        private IntPtr WndProc( IntPtr hwnd, uint uMsg, IntPtr wParam, IntPtr lParam ) {
            IntPtr result = NativeMethods.CallWindowProc( originalWndProc, hwnd, uMsg, wParam, lParam );
 
            switch ( uMsg ) {
                case 0x86: // WM_NCACTIVATE
                case 0x85: // WM_NCPAINT
                    DrawStuff( hwnd );
                    break;
            }
 
            return result;
        }
 
        private void DrawStuff( IntPtr hwnd ) {
            if ( !World.Player.Exist )
                return;
 
            IntPtr hDC = NativeMethods.GetWindowDC( hwnd );
 
            Rectangle windowRect = new Rectangle();
            if ( !NativeMethods.GetWindowRect( hwnd, ref windowRect ) )
                throw new Win32Exception();
 
            using ( Graphics graphics = Graphics.FromHdc( hDC ) ) {
                float totalWidth = -BoxSpacing;
                foreach ( IDrawable info in items )
                    totalWidth += info.Measure( graphics ) + BoxSpacing;
 
                PointF p = new Point( SystemInformation.FrameBorderSize );
                p.X += ( ( windowRect.Width - SystemInformation.CaptionHeight * 2 ) - totalWidth ) / 2;
                p.Y += 1;
 
                foreach ( IDrawable info in items )
                    p.X += info.Draw( graphics, p ) + BoxSpacing;
            }
 
            NativeMethods.ReleaseDC( hwnd, hDC );
        }
 
        #region Event handlers
 
        private void RuntimeCore_UnregisteringAssembly( object sender, UnregisteringAssemblyEventArgs e ) {
            Dispose();
        }
 
        #endregion
 
        #region IDisposable
 
        public void Dispose() {
            if ( originalWndProc == IntPtr.Zero )
                return;
 
            Debug.WriteLine( "Removing wndproc hook", "ResourceCounter" );
            if ( NativeMethods.SetWindowLong( Client.HWND, GWLP_WNDPROC, originalWndProc ) == IntPtr.Zero )
                throw new Win32Exception();
 
            GC.SuppressFinalize( this );
        }
 
        #endregion
 
        #region Delegates
 
        [UnmanagedFunctionPointer( CallingConvention.Winapi )]
        private delegate IntPtr WndProcDelegate( IntPtr hwnd, uint uMsg, IntPtr wParam, IntPtr lParam );
 
        #endregion
 
        #region Nested type: IDrawable
 
        private interface IDrawable {
            bool Update( int itemCount );
            float Measure( Graphics graphics );
            float Draw( Graphics graphics, PointF point );
        }
 
        #endregion
 
        #region Nested type: Separator
 
        private class Separator : IDrawable {
            public Separator( string text ) {
                Text = text;
            }
 
            private float textWidth;
 
            #region IDrawable
 
            public bool Update( int itemCount ) {
                return false;
            }
 
            public virtual float Measure( Graphics graphics ) {
                textWidth = graphics.MeasureString( Text, SystemFonts.CaptionFont ).Width;
                return textWidth;
            }
 
            public virtual float Draw( Graphics graphics, PointF point ) {
                graphics.DrawString( Text, SystemFonts.CaptionFont, SystemBrushes.ActiveCaptionText, point );
                return textWidth;
            }
 
            #endregion
 
            #region Public properties
 
            public string Text {
                get;
                private set;
            }
 
            #endregion
        }
 
        #endregion
 
        #region Nested type: ItemInfo
 
        private class ItemInfo : IDrawable {
            public ItemInfo( string name, Graphic graphic, UOColor color, Rectangle iconBounds ) {
                Name = name;
                Graphic = graphic;
                Color = color;
                this.iconBounds = iconBounds;
 
                prevAmount = -1;
 
                Bitmap = DataFiles.Art.Items.Get( graphic );
 
                if ( color.IsConstant && color != 0x0000 ) {
                    HueEntry hue = DataFiles.Hues.Get( color );
                    if ( hue != null )
                        Dyes.RecolorFull( hue, Bitmap );
                }
            }
 
            private Rectangle iconBounds;
            private string text;
            private float textWidth;
            private int prevAmount;
 
            #region IDrawable
 
            public bool Update( int amount ) {
                if ( prevAmount == amount )
                    return false;
 
                text = ": " + amount;
                prevAmount = amount;
                return true;
            }
 
            public float Measure( Graphics graphics ) {
                textWidth = graphics.MeasureString( text, SystemFonts.CaptionFont ).Width;
 
                return iconBounds.Width + textWidth;
            }
 
            public float Draw( Graphics graphics, PointF point ) {
#if CONFIG_MODE
                graphics.DrawRectangle( Pens.Azure, point.X, point.Y, iconBounds.Width, iconBounds.Height );
#endif
 
                graphics.DrawImage( Bitmap, point.X, point.Y, iconBounds, GraphicsUnit.Pixel );
                point.X += iconBounds.Width;
 
                point.Y = SystemInformation.FrameBorderSize.Height + ( SystemInformation.CaptionHeight - SystemFonts.CaptionFont.Height ) / 2 - 1;
                graphics.DrawString( text, SystemFonts.CaptionFont, SystemBrushes.ActiveCaptionText, point );
 
                return iconBounds.Width + textWidth;
            }
 
            #endregion
 
            #region Public properties
 
            public string Name {
                get;
                private set;
            }
 
            public Graphic Graphic {
                get;
                private set;
            }
 
            public UOColor Color {
                get;
                private set;
            }
 
            public Bitmap Bitmap {
                get;
                private set;
            }
 
            #endregion
        }
 
        #endregion
 
        #region Native methods
 
        private static class NativeMethods {
 
            [DllImport( "user32.dll" )]
            public static extern IntPtr CallWindowProc( IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam );
 
            [DllImport( "user32.dll", SetLastError = true )]
            public static extern IntPtr SetWindowLong( IntPtr hWnd, int nIndex, IntPtr dwNewLong );
 
            [DllImport( "user32.dll", SetLastError = true )]
            public static extern IntPtr GetWindowLong( IntPtr hWnd, int nIndex );
 
            [DllImport( "user32.dll", SetLastError = true )]
            public static extern IntPtr GetWindowDC( IntPtr hWnd );
 
            [DllImport( "user32.dll" )]
            public static extern int ReleaseDC( IntPtr hWnd, IntPtr hDC );
 
            [DllImport( "user32.dll" )]
            public static extern bool GetWindowRect( IntPtr hWnd, ref Rectangle lpRect );
 
            [DllImport( "user32.dll" )]
            public static extern bool UpdateWindow( IntPtr hWnd );
 
            [DllImport( "user32.dll" )]
            public static extern bool InvalidateRect( IntPtr hWnd, ref Rectangle lpRect, bool bErase );
 
            [DllImport( "user32.dll", SetLastError = true )]
            public static extern IntPtr SendMessage( IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam );
        }
 
        #endregion
    }
}

Výsledek tohoto je toto

Nahlásit jako SPAM
IP: 82.202.104.–
liborb
~ Redaktor
+18
Guru
27. 6. 2012   #4
-
0
-

Vykreslení je ve DrawStuff, které se volá při reakci na WM_NCPAINT (non-client paint) a v něm se enumerují všechny IDrawable položky a přes toto rozhraní se i vykreslí.

Nahlásit jako SPAM
IP: 78.80.52.–
Mutagen
~ Anonymní uživatel
549 příspěvků
27. 6. 2012   #5
-
0
-

#4 liborb
Jj už to tam vidim, ale pořád jsem z toho docela jelen   Je tu toho docela dost jako v tom kodu ale v tom je prej zahrnut i UPDATE tak nevím no... Až budu doma tak něco zkusím, ale nevím nevím, kdyžtak se tu ozvu, ale jen by mě zajímalo odkud to bere tu grafiku co to má vykreslit ... 

Nahlásit jako SPAM
IP: 82.202.104.–
liborb
~ Redaktor
+18
Guru
27. 6. 2012   #6
-
0
-

 Tady bere grafiku:

Bitmap = DataFiles.Art.Items.Get( graphic );

kde graphic je takové to hexa číslo (0x0F7B apod.) v ItemInfo.

Nahlásit jako SPAM
IP: 78.80.52.–
Mutagen
~ Anonymní uživatel
549 příspěvků
27. 6. 2012   #7
-
0
-

#6 liborb
Koukám, že se chci vrhnout na docela zapeklitej oříšek ... Až něco vyzkouším, až budu doma, dám vědět ... 

Nahlásit jako SPAM
IP: 82.202.104.–
Mutagen
~ Anonymní uživatel
549 příspěvků
27. 6. 2012   #8
-
0
-

+ otázka ... šel by vykreslovat nějaký statusbar? Lišta která by se měnila podle toho jak má "postava" životů? Ale asi určitě, když nahoře v obrázku to je ...

Nahlásit jako SPAM
IP: 82.202.104.–
liborb
~ Redaktor
+18
Guru
27. 6. 2012   #9
-
0
-

Jde všechno ;)

Nahlásit jako SPAM
IP: 78.80.52.–
Mutagen
~ Anonymní uživatel
549 příspěvků
27. 6. 2012   #10
-
0
-

#9 liborb
Jo to je dobře :) ... Jen sem tak přemejšlel nebude to nějak náročný na CPU když se mi to bude cca každou sec obnovovat a znova vykreslovat? Nevím, nemám představu jestli to je nějak náročný tak se radši ptám

Nahlásit jako SPAM
IP: 82.202.104.–
liborb
~ Redaktor
+18
Guru
27. 6. 2012   #11
-
0
-

Vzhledem k tomu, že je to okolo 40px x šířka obrazovky, tak to nebude žádný problém. Samozřejmě, pokud to napíšeš hloupě a budeš ve vykreslení dělat i věci, které by tam být nemuseli, tak to problém být může, ale jinak klidně 10x za vteřinu :). Je to prostě stejné jako kreslit do okna. Rozdíl je pouze v tom, že normální kreslení je do klientské části okna a toto je do neklientské části okna. Toť vše, když máš správné HDC, tak je ti to šumák.

Nahlásit jako SPAM
IP: 78.80.52.–
Mutagen
~ Anonymní uživatel
549 příspěvků
27. 6. 2012   #12
-
0
-

#11 liborb
Okey, tak kdyžtak až to budu mit tak sem napisu zda tam nemam neco co by se dalo napsat treba jinak, a pokud necop nepujde napisu sem tez ...

Nahlásit jako SPAM
IP: 82.202.104.–
Mutagen0
Super člen
27. 6. 2012   #13
-
0
-

No tak jsem doma, ale pořad trosku nechápu :D At se to snazim nejak osekat a ulehcit jen na 1 objekt tak proste nevím nejde to :D

Nahlásit jako SPAM
IP: 89.190.90.–
liborb
~ Redaktor
+18
Guru
27. 6. 2012   #14
-
0
-

Podle mě stačí vykomentovat přidávané položky do ResourceCounter. Když tam necháš jenom první položku ...

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.208.–
Mutagen0
Super člen
27. 6. 2012   #15
-
0
-

#14 liborb
Tak jsem něco vyresil, uz mi to krásně vykresluje vsechno, jenom je nějaký problem s vypisovaním HP, Many a Staminy ... Prostě nějakých udajů ...

Neboli jde presne o tohle

float[] StatsNow = new float[3];
StatsNow[0] = (World.Player.MaxHits / 100) * World.Player.Hits;
StatsNow[1] = (World.Player.MaxMana / 100) * World.Player.Mana;
StatsNow[2] = (World.Player.MaxStamina / 100) * World.Player.Stamina;

A potřeboval bych to nějak udělat abych měl svoje aktuální udáje a měl u toho stejně dlouhou lajnu viz obr

A jde o to ze tohle je napevno to bylo ze jsem to jen vykreslil, Ale chci aby s rozdílnýma údajema to mělo stejnou délku

No a pak tu je ten jeden nejzasadnejsi problem a to UPDATE ten absolutně nevím jak udělat ...

Zdorjový kod zde

private WndProcDelegate wndProc;
        private IntPtr originalWndProc;
        private const int GWLP_WNDPROC = -4;
        private const int BoxSpacing = 40;

        public ResourceCounter()
        {
            originalWndProc = NativeMethods.GetWindowLong(Client.HWND, GWLP_WNDPROC);
            if (originalWndProc == IntPtr.Zero)
                throw new Win32Exception();

            wndProc = new WndProcDelegate(WndProc);

            if (NativeMethods.SetWindowLong(Client.HWND, GWLP_WNDPROC, Marshal.GetFunctionPointerForDelegate(wndProc)) == IntPtr.Zero)
                throw new Win32Exception();

            RuntimeCore.UnregisteringAssembly += new UnregisteringAssemblyEventHandler(RuntimeCore_UnregisteringAssembly);
        }

        private IntPtr WndProc(IntPtr hwnd, uint uMsg, IntPtr wParam, IntPtr lParam)
        {
            IntPtr result = NativeMethods.CallWindowProc(originalWndProc, hwnd, uMsg, wParam, lParam);

            switch (uMsg)
            {
                case 0x86: // WM_NCACTIVATE
                case 0x85: // WM_NCPAINT
                    DrawStuff(hwnd);
                    break;
            }

            return result;
        }

        private void DrawStuff(IntPtr hwnd)
        {
            if (!World.Player.Exist)
                return;

            IntPtr hDC = NativeMethods.GetWindowDC(hwnd);

            Rectangle windowRect = new Rectangle();
            if (!NativeMethods.GetWindowRect(hwnd, ref windowRect))
                throw new Win32Exception();

            using (Graphics graphics = Graphics.FromHdc(hDC))
            {
                float totalWidth = 800;

                PointF p = new Point(SystemInformation.FrameBorderSize);
                p.X += ((windowRect.Width - SystemInformation.CaptionHeight * 2) - totalWidth) / 2;
                p.Y += 3;

                int Bitmap_Size_X = 100;
                int Bitmap_Size_Y = 21;

                #region Fields
                Bitmap[] Stats = new Bitmap[3];
                Stats[0] = new Bitmap(Bitmap_Size_X, Bitmap_Size_Y);
                Stats[1] = new Bitmap(Bitmap_Size_X, Bitmap_Size_Y);
                Stats[2] = new Bitmap(Bitmap_Size_X, Bitmap_Size_Y);

                Color[] _Color = new Color[3];
                _Color[0] = Color.Lime;
                _Color[1] = Color.Blue;
                _Color[2] = Color.Red;

                float[] StatsNow = new float[3];
                StatsNow[0] = (World.Player.MaxHits / 100) * World.Player.Hits;
                StatsNow[1] = (World.Player.MaxMana / 100) * World.Player.Mana;
                StatsNow[2] = (World.Player.MaxStamina / 100) * World.Player.Stamina;
                #endregion

                for (int i = 0; i < Stats.Length; i++)
                {
                    using (Graphics My = Graphics.FromImage(Stats[i]))
                    {
                        Brush b = new SolidBrush(_Color[i]);
                        LinearGradientBrush lb = new LinearGradientBrush(new Rectangle(0, 0, Bitmap_Size_X, Bitmap_Size_Y), Color.FromArgb(0, Color.White), Color.FromArgb(0, Color.White), LinearGradientMode.ForwardDiagonal);
                        int Width = (int)((StatsNow[i] / 100) * Bitmap_Size_X);
                        My.FillRectangle(b, 0, 0, Width, Bitmap_Size_Y);
                        My.FillRectangle(lb, 0, 0, Width, Bitmap_Size_Y);
                        b.Dispose(); lb.Dispose();
                        UO.Print(StatsNow[i]);
                    }
                    graphics.DrawImage(Stats[i], p.X, p.Y, new Rectangle(0, 15, Bitmap_Size_X, SystemInformation.CaptionHeight - 2), GraphicsUnit.Pixel);
                    p.Y += 6;
                }
            }

            NativeMethods.ReleaseDC(hwnd, hDC);
        }
Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
28. 6. 2012   #16
-
0
-

No tak je tu proste kosmetickej zádrhel proste bez kterýho pokud nevyresim nemuzu udelat Update

Jde o to ta Bitmapa dostane nastaveno nějakou velikost ale ono ne ze by se to proste do toho vecpalo ono se to proste nastavi podle sebe a osattni se nezajima

Proste jde o to ze ty lajny mají byt stejně dlouhý a do tech stejně dlouhých lajn se musi vecpat treba do první Max hodnota 150 do druhy 100 a do treti 115
 a pak podle nějakyho vypoctu (nejspis procenta) posouvat ty lajny dalsi

Ukazka : Dejme tomu ze mám Nastaveno v Bitmape sírku 500 a maximalní hodnotu 100 a já budu mít 30%

tak chci aby se v tom 500px měl 30% (cca 66px vyskresleno) vykreslesnejch a osatní ne a takhle to chci u vsech, ale když tady se mi to nastaví podle toho kolik to má max hodnotu a dělá si to co chce ... Tak nevím co s tím ...

private void DrawStuff(IntPtr hwnd)
        {
            if (!World.Player.Exist)
                return;

            IntPtr hDC = NativeMethods.GetWindowDC(hwnd);

            Rectangle windowRect = new Rectangle();
            if (!NativeMethods.GetWindowRect(hwnd, ref windowRect))
                throw new Win32Exception();

            using (Graphics graphics = Graphics.FromHdc(hDC))
            {
                float totalWidth = 800;

                PointF p = new Point(SystemInformation.FrameBorderSize);
                p.X += ((windowRect.Width - SystemInformation.CaptionHeight * 2) - totalWidth) / 2;
                p.Y += 3;

                int Bitmap_Size_X = 115;
                int Bitmap_Size_Y = 20;

                #region Fields
                Bitmap[] Stats = new Bitmap[3];
                Stats[0] = new Bitmap(Bitmap_Size_X, Bitmap_Size_Y);
                Stats[1] = new Bitmap(Bitmap_Size_X, Bitmap_Size_Y);
                Stats[2] = new Bitmap(Bitmap_Size_X, Bitmap_Size_Y);

                Color[] _Color = new Color[3];
                _Color[0] = Color.Lime;
                _Color[1] = Color.Lime;
                _Color[2] = Color.Lime;

                int[] StatsNow = new int[3];
                StatsNow[0] = World.Player.Hits;
                StatsNow[1] = World.Player.Mana;
                StatsNow[2] = World.Player.Stamina;

                int[] StatsMax = new int[3];
                StatsMax[0] = World.Player.MaxHits;
                StatsMax[1] = World.Player.MaxMana;
                StatsMax[2] = World.Player.MaxStamina;
                #endregion

                for (int i = 0; i < Stats.Length; i++)
                {
                    using (Graphics My = Graphics.FromImage(Stats[i]))
                    {
                        SolidBrush bh = new SolidBrush(_Color[i]);
                        int percent = Math.Min(100 * StatsNow[i] / StatsMax[i], 100);
                        if (percent <= 100) bh = new SolidBrush(_Color[i]);
                        if (percent < 66) bh = new SolidBrush(Color.Yellow);
                        if (percent < 33) bh = new SolidBrush(Color.Red);

                        SolidBrush bm = new SolidBrush(Color.FromArgb(0x730818 | (0xFF << 24)));

                        //Vytvoř lajnu
                        int MyWidth = (int)(percent * 100) / Bitmap_Size_X;
                        Rectangle hits = new Rectangle(0, 0, MyWidth, Bitmap_Size_Y);
                        My.FillRectangle(bh, hits);

                        //Chybejci HP/Mana/Stam
                        Rectangle missing = new Rectangle(MyWidth, 0, 0, Bitmap_Size_Y);
                        missing.Width = Bitmap_Size_X - missing.X;
                        My.FillRectangle(bm, missing);

                        //Cerny Border okolo
                        Pen My_Pen = new Pen(Color.Black, 1);
                        My.DrawRectangle(My_Pen, 0, 0, Bitmap_Size_X - 1, Bitmap_Size_Y - 1);
                    }
                    graphics.DrawImage(Stats[i], p.X, p.Y, new Rectangle(0, 14, (int)StatsMax[i], SystemInformation.CaptionHeight - 2), GraphicsUnit.Pixel);
                    p.Y += 6;
                }
            }

            NativeMethods.ReleaseDC(hwnd, hDC);
        }

Děkuji za rady.

Pozn. když chci použít výpočet (percent / 100) * Bitmap_Size_X; tak mi to vždy vrátí 0 ... teda pokud nemam percent na 100% pokud je 99% a niz tak uz to vrati 0 ale zvladnout vypocitat by to mělo tak nevím co to děla ...

Nahlásit jako SPAM
IP: 89.190.90.–
liborb
~ Redaktor
+18
Guru
28. 6. 2012   #17
-
0
-

S tím percent ... to je celočíselné dělení, kde 99 / 100 se opravdu = 0 (99/100=0), ale kdyby si napsal třeba percent/100.0, tak už dostaneš to, co si chtěl.

No a pokud má 3 proužky, které mají nějaké maximum (nMax[3]) a nějakou hodnotu (nValue[3]) a mají být všechny stejně dlouhé (nWidth), tak je výpočet přes procenta správně, tj. nějak takto: 

for (int i = 0;i < 3;i++) {
	nBarWidth[i] = (nWidth * nValue[i]) / nMax[i];
}
Nahlásit jako SPAM
IP: 78.80.52.–
Mutagen0
Super člen
28. 6. 2012   #18
-
0
-

#17 liborb
Díky moc už mi to funguje :) Sem si opravdu nevsiml ze tam mam nastavenou int hodnotu ... Tedka už je to Okey, jen udělat ten Update nějak, ale vůbec mě nenapada jak na to ...

A mám tu jeden problem, mám tu script (event) co mi aktualizuje pokaždý Lištu (Textovou) viz obr a tenhle co se vypíše, ale jakmile se sputí ten event (přepsání textu v liště) tak mi tahle zelená zmizí. Co s tímhle problémem? Jasný napadlo mě to udělat do jedný, jako že by to vypisovalo string jako ty barevný lišty ale to by byla zase práce navíc a hodně práce navíc.

A nejvetší problém co asi je, že to vykreslení nefunguje pod aerem :(

Nahlásit jako SPAM
IP: 89.190.90.–
liborb
~ Redaktor
+18
Guru
28. 6. 2012   #19
-
0
-

Jestli jsem to dobře pochopil .... ta horní lišta u okna je jen jedna, tj. pokud při překreslení vypíšeš/vymaluješ jen část, tak je jasné, že ten zbytek nebude vidět. Všechno, co chceš, aby bylo vidět v té liště se musí vykreslovat jako reakce na WM_NCPAINT, tj. v tom zdrojáku se tam volá jenom DrawStuf, takže to uděláš třena nějak takto: 

	switch (uMsg)
            {
                case 0x86: // WM_NCACTIVATE
                case 0x85: // WM_NCPAINT
                    DrawStuff(hwnd);
                    DrawText(hwnd);	
                    break;
            }

            return result;

A jen tak mimochodem, proč to vlastně děláš v okně? Udělej tu hru/aplikaci fullscreen a tu lištu si nahoře vykresluj dle svého, ne?

Nahlásit jako SPAM
IP: 78.80.52.–
Marvin
~ Anonymní uživatel
23 příspěvků
28. 6. 2012   #20
-
0
-

Vypni si tu lištu(form.borderstyle = form.borderstyle.none(nak tak pisu z hlavy))

a udelej si vlastni lištu

Nahlásit jako SPAM
IP: 90.176.13.–
Mutagen0
Super člen
28. 6. 2012   #21
-
0
-

#19 liborb
Jojo je jenom jedna, ale jde o to že mám eventu která mi obnovuje toho Clienta neboli tu listu nahore Jako u Winformu Client.Text = ""; + tedka jsem udělal tohle. Nevím co nebo proč ale jakmile se obnovi ten client.text tak proste to zeleny vykresleny zmizi nebo se překreje nevím přesně ... Tak je jasný ale já chci aby tamto se tam obnovovalo v tom client.Text normalne a to moje nezmizelo, naopak chci aby se to taky vlastne Updatovalo ale nemizelo + to aero ale to snad neni tak žhavý.

+ k tomu fullscreenmodu ... tam je problem pak s rozlišením hry, jak je hra stara tak to pak má hrozný rozlisení a kosticky jsou videt apod a není to vůbec pěkný ... Nikdy jsem tuhle hru nehral ve fullscreenu a neznam nikoho kdo jo ...

Nahlásit jako SPAM
IP: 89.190.90.–
liborb
~ Redaktor
+18
Guru
28. 6. 2012   #22
-
0
-

No nastavení textu to může překrýt, ale mělo by po něm stačit zavolat: 

NativeMethods.SendMessage( Client.HWND, 0x85, IntPtr.Zero, IntPtr.Zero );

a zase se si to vykreslíš.

Nahlásit jako SPAM
IP: 78.80.52.–
Mutagen0
Super člen
28. 6. 2012   #23
-
0
-

#22 liborb
No tak jasný, říkám, že UPDATE sem pro ty zeleny listy jeste nedělal k tomu se musim dostat, a až to bude tak pak dám vědět. I když nevím jak to obnovovat třeba po 1 sec ... Já bych to řešil zase tou eventou, ale to se mi zdá takový moc náročný když ta eventa se vlastne může spustit během 1 sec třeba 8x ...

Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
28. 6. 2012   #24
-
0
-

Jak jsem řekl, když to dám do události, tak mi to problikává, sice to není tak hrozný, ale problikává ... Ale prostě nejvíc na tom je to,že nemůžu vykreslovat Client.Text = string; Jinak se to proste nevykresli nebo vykresli ale prekryje se to ... Takže teď bud udělat vykreslování týhle lišty normalně celou, nebo nevím ale radsi bych chtěl aby se to řešilo v tom Client.Text = string; Protože to bych musel obnovovat tu lištu ještě víc častejc a myslím, že by to problikávání bylo poznat

Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
28. 6. 2012   #25
-
0
-

A nevíte někdo jak to zprovoznit pod Aerem?

Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
6. 7. 2012   #26
-
0
-

Opravdu nevíte jak to zprovoznit pod aerem? :(

Nahlásit jako SPAM
IP: 89.190.90.–
lulz
~ Anonymní uživatel
4 příspěvky
7. 7. 2012   #27
-
0
-

A screen v prvním postu jakože není dělaný v aeru?

Nahlásit jako SPAM
IP: 2001:15c0:65ff:356::2...–
Mutagen0
Super člen
8. 7. 2012   #28
-
0
-

#27 lulz
Je ale to je jen obrazek tak jak sem chtel aby to vypadalo, neni to obrazek odemne ...

Nahlásit jako SPAM
IP: 89.190.90.–
liborb
~ Redaktor
+18
Guru
9. 7. 2012   #29
-
0
-

Když sem hodíš kompletní projekt, na kterém bude vidět, co nejde a půjde to na něm zkusit, tak se jistě najde nějaká dobrá duše, co se na to podívá   

Nahlásit jako SPAM
IP: 78.80.52.–
Mutagen0
Super člen
9. 7. 2012   #30
-
0
-

#29 liborb
No jde o to že absolutně nevím, jak to rozjet, nevím co pouít jak použít apod

Nahlásit jako SPAM
IP: 89.190.90.–
liborb
~ Redaktor
+18
Guru
11. 7. 2012   #31
-
0
-

No mě šlo o to, že ty víš, čeho chceš dosáhnout, máš ten projekt, ve kterém to tvoříš a je v něm možné zkusit, že to nejde. No a kdybych ti chtěl pomoci, tak asi tak vím, co chceš dosáhnout, nemám to ovšem na čem zkusit a absolutně netuším, jak se to chová, takže ti pomoci ani nemůžu. 

Nahlásit jako SPAM
IP: 78.80.52.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 47 hostů

Podobná vlákna

Skrytí listy Start — založil Navara

Skrytí listy s nabídlou Start — založil Anonymus

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý