吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2474|回复: 11
收起左侧

[C&C++ 原创] WPF界面分享,为我的运气修仙游戏写的客户端,仿的鹅厂初稿

[复制链接]
kololi 发表于 2023-1-2 13:22

部份代码来源于网络,我组装

开发环境: win10_x64 vs2022
代码下载
YunQi.rar (1.06 MB, 下载次数: 68)


再上图
2023-01-02_130856.png

不能说一模一样,只是像素级模仿.

主要代码也就是前台页面部分了
前台的关键点就是一个阴影,别的也没啥就是排版

<Window x:Class="YunQi.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:YunQi"
        xmlns:control="clr-namespace:YunQi.library.control" 
        mc:Ignorable="d"
        Title="运气修仙" Height="706" Width="298" 
        MaxHeight="1000" MaxWidth="610"
        MinHeight="600" MinWidth="298"
        WindowStartupLocation="CenterScreen" AllowsTransparency="True" Topmost="True"
        WindowStyle="None"  Background="{x:Null}"  ResizeMode="CanResizeWithGrip">
    <Window.Resources> 
        <Style x:Key="btn_close" TargetType="Button">
            <Setter Property="OverridesDefaultStyle" Value="True" />
            <Setter Property="Cursor" Value="Hand" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="border" BorderThickness="0" BorderBrush="{x:Null}" Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Opacity" Value="1" />
                                <Setter Property="Background" Value="#FF7F00"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style x:Key="btn_mini" TargetType="Button">
            <Setter Property="OverridesDefaultStyle" Value="True" />
            <Setter Property="Cursor" Value="Hand" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="border" BorderThickness="0" BorderBrush="{x:Null}" Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Opacity" Value="0.8" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <GeometryGroup x:Key="clipGeometry" FillRule="Nonzero">
            <EllipseGeometry RadiusX="30" RadiusY="30" Center="35, 35"></EllipseGeometry>
        </GeometryGroup>
    </Window.Resources>

    <Border Margin="5" CornerRadius="10" Panel.ZIndex="1">
        <Border.Effect>
            <DropShadowEffect Color="Gray" ShadowDepth="0" BlurRadius="10" Opacity="0.3" Direction="0"/>
        </Border.Effect>
        <Grid>

            <Grid.RowDefinitions>
                <RowDefinition Height="138"/>
                <RowDefinition Height="100*"/>
                <RowDefinition Height="50"/>
            </Grid.RowDefinitions>

            <Border MouseDown="Border_MouseDown"  CornerRadius="2 2 0 0"   >

                <Border.Background>
                    <LinearGradientBrush EndPoint="1,0" StartPoint="0,0" MappingMode="RelativeToBoundingBox">
                        <GradientStop Color="#FF4891FF"/>
                        <GradientStop Color="#FF35AEFE" Offset="0.227"/>
                        <GradientStop Color="#FF429AFE"/>
                        <GradientStop Color="#FF24C9FE" Offset="0.614"/>
                        <GradientStop Color="#FF20D1FF" Offset="1"/>
                    </LinearGradientBrush>
                </Border.Background>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="32"/>
                        <RowDefinition Height="15*"/>
                        <RowDefinition Height="30"/>
                    </Grid.RowDefinitions>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="5"/>
                            <ColumnDefinition Width="79"/>
                            <ColumnDefinition Width="20*"/>
                            <ColumnDefinition Width="16"/>
                            <ColumnDefinition Width="30"/>
                            <ColumnDefinition Width="30"/>
                        </Grid.ColumnDefinitions>
                        <Image Source="/res/win_ico/yun.png" HorizontalAlignment="Left" Opacity="0.6" Grid.Column="1" />
                        <Grid Grid.Column="2">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="32"/>
                                <ColumnDefinition Width="32"/>
                                <ColumnDefinition Width="32"/>
                                <ColumnDefinition Width="32*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="2" />
                            <Image Grid.Column="2" Source="/res/win_ico/jingli3.png" />
                            <Image Grid.Column="3" Source="/res/win_ico/electric quantity.png" />
                        </Grid>
                        <Button x:Name="btn_more" ToolTip="更多" Content="" Grid.Column="3" Style="{StaticResource btn_mini}" Click="btn_close_Click" BorderBrush="{x:Null}" Foreground="White" FontSize="18" >
                            <Button.Background>
                                <ImageBrush ImageSource="/res/win_ico/more.png" Stretch="Uniform"/>
                            </Button.Background>
                        </Button>
                        <Button x:Name="btn_mini" ToolTip="最小化" Content="—" Grid.Column="4" Style="{StaticResource btn_mini}" Click="btn_mini_Click" BorderBrush="{x:Null}" Foreground="White" FontSize="16" />
                        <Button x:Name="btn_close" ToolTip="关闭" Content="×" Grid.Column="5" Style="{StaticResource btn_close}" Click="btn_close_Click" BorderBrush="{x:Null}" Foreground="White" FontSize="28" />
                    </Grid>
                    <Border   Grid.Row="1">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="10"/>
                                <ColumnDefinition Width="80"/>
                                <ColumnDefinition Width="60*"/>
                                <ColumnDefinition Width="70"/>
                            </Grid.ColumnDefinitions>
                            <Image Source="/res/win_ico/avator.png" Grid.Column="1"  Clip="{StaticResource ResourceKey=clipGeometry}" Height="70" Width="70"/>
                            <Grid Grid.Column="2">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="25*"/>
                                    <RowDefinition Height="20"/>
                                    <RowDefinition Height="20"/>
                                </Grid.RowDefinitions>
                                <TextBlock Text="小飞侠呀小飞侠" HorizontalAlignment="Left" VerticalAlignment="Bottom" Foreground="White" FontSize="16"/>
                                <TextBlock Text="金币:1234567" HorizontalAlignment="Left" VerticalAlignment="Bottom" Foreground="White" FontSize="10" Grid.Row="1"/>
                                <TextBlock Text="灵石:1234567" Foreground="White" FontSize="10" Grid.Row="2"/>

                            </Grid>
                            <Viewbox Grid.Column="3">
                                <Grid>
                                    <!--StrokeDashArray = 路径长度 / StrokeThickness-->
                                    <control:DiscProgress x:Name="conDiscProgress"  CurrentValue1="0.9"/>

                                </Grid>
                            </Viewbox>
                        </Grid>
                    </Border>
                    <Border  Grid.Row="2" Opacity="0.9">
                        <Border.Background>
                            <LinearGradientBrush EndPoint="1,1" StartPoint="0,0">
                                <GradientStop Color="#FF38ABFF"/>
                                <GradientStop Color="#FF29C3FF" Offset="1"/>
                            </LinearGradientBrush>
                        </Border.Background>
                        <TextBlock TextWrapping="Wrap" Text="公告栏" Foreground="White" HorizontalAlignment="Left" VerticalAlignment="Center"/>

                    </Border>
                </Grid>
            </Border>
            <Border Grid.Row="1"   Background="white"  CornerRadius="0 0 2 2">
                <TabControl  Style="{StaticResource TabControlElement}">
                    <TabItem Style="{StaticResource TabItemElement}" Header="公共">
                        <Grid Background="White"/>
                    </TabItem>
                    <TabItem Style="{StaticResource TabItemElement}" Header="门派">
                        <Grid Background="BlueViolet"/>
                    </TabItem>
                    <TabItem Style="{StaticResource TabItemElement}" Header="私聊">
                        <Grid Background="Coral"/>
                    </TabItem>
                    <TabItem Style="{StaticResource TabItemElement}" Header="系统">
                        <Grid Background="DarkGray"/>
                    </TabItem>
                </TabControl>

            </Border>
            <Border Grid.Row="2" MouseDown="Border_MouseDown" Cursor="SizeAll" Background="white"  CornerRadius="0 0 2 2" BorderBrush="#FFDED8D8" BorderThickness="0,1,0,0">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="10"/>
                        <ColumnDefinition Width="35"/>
                        <ColumnDefinition Width="35"/>
                        <ColumnDefinition Width="35"/>
                        <ColumnDefinition Width="35"/>
                        <ColumnDefinition Width="35"/>
                        <ColumnDefinition Width="35"/>
                        <ColumnDefinition Width="35"/>
                        <ColumnDefinition Width="35"/>
                    </Grid.ColumnDefinitions>
                    <Button Grid.Column="1" BorderBrush="{x:Null}" Style="{StaticResource btn_mini}">
                        <Button.Background>
                            <ImageBrush ImageSource="/res/win_ico/warehouse.png" Stretch="Uniform"/>
                        </Button.Background>
                    </Button>
                    <Button Grid.Column="2" BorderBrush="{x:Null}" Style="{StaticResource btn_mini}" >
                        <Button.Background>
                            <ImageBrush ImageSource="/res/win_ico/store.png" Stretch="Uniform"/>
                        </Button.Background>
                    </Button>
                    <Button Grid.Column="3" BorderBrush="{x:Null}" Style="{StaticResource btn_mini}" >
                        <Button.Background>
                            <ImageBrush ImageSource="/res/win_ico/lilian.png" Stretch="Uniform"/>
                        </Button.Background>
                    </Button>  
                    <Button Grid.Column="4" BorderBrush="{x:Null}" Style="{StaticResource btn_mini}" >
                        <Button.Background>
                            <ImageBrush ImageSource="/res/win_ico/pojing.png" Stretch="Uniform"/>
                        </Button.Background>
                    </Button>
                    <Button Grid.Column="5" BorderBrush="{x:Null}" Style="{StaticResource btn_mini}" >
                        <Button.Background>
                            <ImageBrush ImageSource="/res/win_ico/liandan.png" Stretch="Uniform"/>
                        </Button.Background>
                    </Button>
                </Grid>
            </Border>

        </Grid>
    </Border>
</Window>

后台就是一个顶端吸附,别的也没啥了.
目前找到的这个吸附效果不稳定.,有抖动,需要优化.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace YunQi
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        private const int BORDER = 3;
        private const int AUTOHIDETIME = 50;

        private Location _Location = Location.None;
        private bool _IsHidded = false;
        private DispatcherTimer _AutoHideTimer = null;
        public MainWindow()
        {
            InitializeComponent();
            this._AutoHideTimer = new DispatcherTimer();
            this._AutoHideTimer.Interval = TimeSpan.FromMilliseconds(AUTOHIDETIME);
            this._AutoHideTimer.Tick += new EventHandler(AutoHideTimer_Tick);

        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // 获取窗体句柄
            IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
            // 获得窗体的 样式
            int oldstyle = NativeMethods.GetWindowLong(hwnd, NativeMethods.GWL_STYLE);

            // 更改窗体的样式为无边框窗体
            NativeMethods.SetWindowLong(hwnd, NativeMethods.GWL_STYLE, oldstyle & ~NativeMethods.WS_CAPTION);

            // SetWindowLong(hwnd, GWL_EXSTYLE, oldstyle & ~WS_EX_LAYERED);
            // 1 | 2 << 8 | 3 << 16  r=1,g=2,b=3 详见winuse.h文件
            // 设置窗体为透明窗体
            NativeMethods.SetLayeredWindowAttributes(hwnd, 1 | 2 << 8 | 3 << 16, 0, NativeMethods.LWA_ALPHA);

            // 创建圆角窗体  12 这个值可以根据自身项目进行设置
            NativeMethods.SetWindowRgn(hwnd, NativeMethods.CreateRoundRectRgn(0, 0, Convert.ToInt32(this.ActualWidth), Convert.ToInt32(this.ActualHeight), 12, 12), true);
        }
        private void Image_MouseUp(object sender, MouseButtonEventArgs e)
        {
            System.Windows.Application.Current.Shutdown();
        }
        private void Image_MouseUpMini(object sender, MouseButtonEventArgs e)
        {
            this.WindowState = WindowState.Minimized;
        }
        private void btn_mini_Click(object sender, RoutedEventArgs e)
        {
            this.WindowState = WindowState.Minimized;
        }
        private void btn_close_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Application.Current.Shutdown();
        }

        private void Border_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (e.ChangedButton == MouseButton.Left)
            {
                if (Mouse.LeftButton == MouseButtonState.Pressed)
                {
                    var windowMode = this.ResizeMode;
                    if (this.ResizeMode != ResizeMode.NoResize)
                    {
                        this.ResizeMode = ResizeMode.NoResize;
                    }
                    this.UpdateLayout();

                    DragMove();
                    if (this.ResizeMode != windowMode)
                    {
                        this.ResizeMode = windowMode;
                    }
                    this.UpdateLayout();
                }
            }
        }

        void AutoHideTimer_Tick(object sender, EventArgs e)
        {
            POINT p;
            if (!GetCursorPos(out p))
            {
                return;
            }

            if (p.x >= this.Left && p.x <= (this.Left + this.ActualWidth)
                && p.y >= this.Top && p.y <= (this.Top + this.ActualHeight))
            {
                this.ShowWindow();
            }
            else
            {
                this.HideWindow();
            }
        }

        protected override void OnLocationChanged(EventArgs e)
        {
            if (!this._IsHidded)
            {
                if (this.Top <= 0 && this.Left <= 0)
                {
                    this._Location = Location.LeftTop;
                    this.HideWindow();
                }
                else if (this.Top <= 0 && this.Left >= SystemParameters.VirtualScreenWidth - this.ActualWidth)
                {
                    this._Location = Location.RightTop;
                    this.HideWindow();
                }
                else if (this.Top <= 0)
                {
                    this._Location = Location.Top;
                    this.HideWindow();
                }
                else
                {
                    this._Location = Location.None;
                }
            }
            base.OnLocationChanged(e);
        }

        enum Location
        {
            None,
            Top,
            LeftTop,
            RightTop
        }

        private void ShowWindow()
        {
            if (this._IsHidded)
            {
                switch (this._Location)
                {
                    case Location.Top:
                    case Location.LeftTop:
                    case Location.RightTop:
                        this.Top = 0;
                        this.Topmost = false;
                        this._IsHidded = false;
                        this.UpdateLayout();
                        break;
                    case Location.None:
                        break;
                }
            }
        }

        private void HideWindow()
        {
            if (!this._IsHidded)
            {
                switch (this._Location)
                {
                    case Location.Top:
                        this.Top = BORDER - this.ActualHeight;
                        this.Topmost = true;
                        this._IsHidded = true;
                        this._AutoHideTimer.Start();
                        break;
                    case Location.LeftTop:
                        this.Left = 0;
                        this.Top = BORDER - this.ActualHeight;
                        this.Topmost = true;
                        this._IsHidded = true;
                        this._AutoHideTimer.Start();
                        break;
                    case Location.RightTop:
                        this.Left = SystemParameters.VirtualScreenWidth - this.ActualWidth;
                        this.Top = BORDER - this.ActualHeight;
                        this.Topmost = true;
                        this._IsHidded = true;
                        this._AutoHideTimer.Start();
                        break;
                    case Location.None:
                        break;
                }
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int x;
            public int y;
            public POINT(int x, int y)
            {
                this.x = x;
                this.y = y;
            }
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool GetCursorPos(out POINT pt);

    }
}

### END

免费评分

参与人数 3吾爱币 +9 热心值 +2 收起 理由
Ywlzfot + 1 我很赞同!
wushaominkk + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
大聪明 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

星云落花 发表于 2023-1-3 16:45
hrpzcf 发表于 2023-1-3 16:04
我知道,但是楼主的后台代码是 C#

C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言。


百度百科抄的,winForm,WPF本来就是用C#开发的、、、、
MarioCrane 发表于 2023-1-4 20:38
星云落花 发表于 2023-1-3 16:45
C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开 ...

它是指这个帖子的tag选错了,不该选c/c++

免费评分

参与人数 1热心值 +1 收起 理由
隐藏英雄 + 1 热心回复!

查看全部评分

魔道书生 发表于 2023-1-2 16:44
hrpzcf 发表于 2023-1-2 17:54
牛哇,但这不是C#么
星云落花 发表于 2023-1-3 16:00
hrpzcf 发表于 2023-1-2 17:54
牛哇,但这不是C#么

WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET 的一部分
hrpzcf 发表于 2023-1-3 16:04
星云落花 发表于 2023-1-3 16:00
WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET 的一部分

我知道,但是楼主的后台代码是 C#
星云落花 发表于 2023-1-5 14:08
MarioCrane 发表于 2023-1-4 20:38
它是指这个帖子的tag选错了,不该选c/c++

这个还真还没注意、、、
racecar 发表于 2023-1-6 09:41
运行了一下,确实很像。主要看下NativeMethods的用法
reveriexue 发表于 2023-1-6 13:22
感谢分享~~~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表