infopath如何使用控件XcodeUI控件来做象棋

对于自己做的游戏即使输了脸上一般还是洋溢着笑容的,那么如何做一个简单的游戏呢?&
600) this.width = 600;attachimg(this, 'load');" onmouseover="attachimginfo(this, 'attach_17022', 1);attachimg(this, 'mouseover')" onclick="zoom(this);" onmouseout="attachimginfo(this, 'attach_17022', 0, event)" style="CURSOR:"
/>() 12:40:44 600) this.width = 600;attachimg(this, 'load');" onmouseover="attachimginfo(this, 'attach_17023', 1);attachimg(this, 'mouseover')" onclick="zoom(this);" onmouseout="attachimginfo(this, 'attach_17023', 0, event)" style="CURSOR:"
/>() 12:40:44一.再说呈现在自绘那篇我们已经知道了如何把东西画出来,或许你已经能通过重载OnRender函数非常熟练的画出这样棋子。 600) this.width = 600;attachimg(this, 'load');" onmouseover="attachimginfo(this, 'attach_17024', 1);attachimg(this, 'mouseover')" onclick="zoom(this);" onmouseout="attachimginfo(this, 'attach_17024', 0, event)" style="CURSOR:"
/>() 12:40:44那么OnRender方法中的DrawingContext参数到底来自哪呢?因为DrawingContext是抽象类,所以微软创建了一个叫做RenderDataDrawingContext的具体类以及他的子类VisualDrawingContext,我们的所用的DrawingContext实际就是VisualDrawingContext这个类,不过微软都把他们定义为了internal,我们在程序集以外无法访问,既然无法访问,那么当我们需要多个这样的对象时如何创建呢?DrawingVisual这类为我们实现多个DrawingContext成为了可能,因为他的实例方法RenderOpen()在内部创建了VisualDrawingContext,DrawingVisual也可以说继承于Visual,当我们用DrawingContext的Drawing一些东西的时候,其实产生的是画图的数据,数据有了,可要把数据给UI 的线程才能被显示,WPF似乎是用ContextLayoutManager这个类来把UI重绘请求放到Dispatcher队列,用Visual里的DUCE发送消息和线程对话.我们创建可视数据的代码可以写成这样:DrawingVisual boardVisual = new DrawingVisual();
using (DrawingContext drawingContext = boardVisual.RenderOpen())
复制代码以上是创建了画图的数据,那么怎么用ContextLayoutManager把数据给Dispatcher队列。UIElement中的 PropagateResumeLayout方法循环递归把需要刷新的Visual对象放到队列中,经过这样的分装我们只需要知道把需要呈现的Visual仍给系统就可以,他自己会判断是否要刷新。怎么给Visual,微软要求我们先给Visual的数量,这需要我们通过以下方式来给定protected override int VisualChildrenCount
复制代码然后他会用一个for循环来得到需要的Visual对象for (int i = 0; i & internalVisualChildrenC i++)
Visual visualChild = v.InternalGetVisualChild(i);
if (visualChild != null)
PropagateResumeLayout(v, visualChild);
复制代码internalVisualChildrenCount的数量就是VisualChildrenCount返回的值, InternalGetVisualChild的方法实际做的就是我们常重载的GetVisualChild方法。protected override Visual GetVisualChild(int index)
if (index == 0)
return boardV
throw new ArgumentOutOfRangeException(&out of range&);
复制代码就这么简单,我们是否已经看到自己画的棋盘了。
二.可视树与逻辑树& & & 虽然我也承认这两棵树已经被人刨根问底的掘了N次,但对于自定义控件来说这树可不是说舍弃就舍弃的(要充分合理利用资源嘛)。& & &
逻辑树(Logical Tree)当然是逻辑意义上的,如果把Visual 可以比作汽车的一部分比如车厢,轮胎,油箱,当我们坐在车厢里的时候我们实际也可以说做在车中,车是一个逻辑意义上的含义,是各个汽车零件和的总称。所以我们的控件上的Parent或者是Child一般都是逻辑的物件,那么加入他除了一个标示外,还有其他的什么意义呢?他还可以属性值继承,比如说我们在我们这个象棋控件上设置下字体的变化,希望上面的棋子车、马、帅等的字体也发生变化就可以用到他。在我们的象棋控件中这样注册:public static readonly DependencyProperty FontFamilyProperty =
DependencyProperty.Register(&FontFamily&,
typeof(FontFamily),
typeof(ChineseChessboard),
new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits));
复制代码棋子中可以这样public static readonly DependencyProperty FontFamilyProperty = ChineseChessboard.FontFamilyProperty.AddOwner(typeof(ChessmanControl),
new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits));
复制代码另外的还有事件路由和资源就不多说了(我也没用到^-^)。& & & 可视树(Visual Tree)据说是逻辑树的扩展,所以把元素只加入可视树依然可以进行属性继承,当然前提是类要继承于FrameworkElement 或FrameworkContentElement,从树的字面意义来看似乎告诉我们不加入他就不能看到,实际上他和呈现没有太大关系,可问题是当你把一个visual显示出来了,也停留在只可远观而不可亵玩的地步 —— 不能引发事件,加入了VisualTree 这个问题就可以解决了,有了点击测试(HitTest),事件也有了,人也顺心了,编程也不困惑了。这里要说明下当我把整个大棋盘加入到可视树时,上面的棋子未加入到可视树的前提下,棋子上的鼠标响应依然可以获得HitTest也能捕捉的到棋子,可见WPF似乎根据一个区域的像素点来判断。至于VisualTreeHelper里的方法可以自己查询MSDN了解。& & &
说到这两个树还有两个类值得提下:VisualCollection和UIElementCollection 前者可以用来操作可视树,后者既可以操作可视树又可以操作逻辑树,如果只想操作可视树,可以把UIElementCollection 构造函数中的logicParent 赋为null。使用了这两个类你就可以简单操作树上的元素了。三.HitTest和TranslateTransform当我们把棋子放到UIElementCollection 中,并输出队列protected override int VisualChildrenCount
// +1 是为棋盘
return (ChessmanCollection != null ? ChessmanCollection.Count : 0) + 1;
protected override Visual GetVisualChild(int index)
//第一个为棋盘其他为棋子
if (index == 0)
return boardV
return ChessmanCollection[index - 1];
复制代码并输出他们的实际大小protected override Size MeasureOverride(Size availableSize)
for (int i = 0; ChessmanCollection != null && i & ChessmanCollection.C i++)
ChessmanCollection.Measure(availableSize);
return new Size(CellWidth * 10, CellWidth * 11);
复制代码看到了棋子的显示,我们接下来的事便是要选中棋子protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
Point location = e.GetPosition(this);
HitTestResult result = VisualTreeHelper.HitTest(this, location);
ChessmanControl chessmanControl = result.VisualHit as ChessmanC
复制代码当然点击测试还可以做很多事,具体的看选中以后我们要移动,并需要一个移动过程的效果TranslateTransform _moveTransform = new TranslateTransform();
_chessmanBaseDic[newChessman].RenderTransform = _moveT
DoubleAnimation xAnimation = new DoubleAnimation((newPoint.X - oldPoint.X) * CellWidth, _moveDuration, FillBehavior.Stop);
_moveTransform.BeginAnimation(TranslateTransform.XProperty, xAnimation);
DoubleAnimation yAnimation = new DoubleAnimation((newPoint.Y - oldPoint.Y) * CellWidth, _moveDuration, FillBehavior.Stop);
EventHandler tempAction = default(EventHandler);
tempAction = delegate
_chessmanBaseDic[newChessman].ClearValue(UIElement.RenderTransformProperty);
_chessmanBaseDic[newChessman].isSelected =
_currentChessmanControl =
if (oldChessman != null)
ChessmanCollection.Remove(_chessmanBaseDic[oldChessman]);
this.InvalidateArrange();
//移除本身
<pleted -= tempA
<pleted += tempA
_moveTransform.BeginAnimation(TranslateTransform.YProperty, yAnimation);
复制代码如果你感觉写两个Animation来分别控制有点蠢的话,你也可以把TranslateTransform 放到CompositionTarget.Rendering来控制。当然这样移动是暂时的,所以我们要引发InvalidateArrange()来实际输出控件的位置protected override Size ArrangeOverride(Size finalSize)
for (int i = 0; ChessmanCollection != null && i & ChessmanCollection.C i++)
ChessmanControl item = ChessmanCollection as ChessmanC
item.Arrange(new Rect(
new Point(item.Chessman.Location.X * CellWidth - item.DesiredSize.Width / 2+CellWidth,
item.Chessman.Location.Y * CellWidth - item.DesiredSize.Height / 2+CellWidth),
item.DesiredSize));
return this.DesiredS
四.画图问题棋盘背景可以加张图片BitmapImage backgroundImage = new BitmapImage();
backgroundImage.BeginInit();
backgroundImage.UriSource = new Uri(@&pack://application:,,,/ChineseChessCcomponent/Images/woodDeskground.jpg&, UriKind.RelativeOrAbsolute);
backgroundImage.EndInit();
backgroundImage.Freeze();
复制代码其中的Uri 如果不熟悉的话可以看下面两个网址(一个为3.5的一个为3.0的):对于棋盘的立体效果,是用两条线来达到的,上面一条用了深色画笔,下面一个用了浅色画笔drawingContext.DrawLine(darkPen, new Point(CellWidth * i, CellWidth), new Point(CellWidth * i, CellWidth * 10 / 2));
drawingContext.DrawLine(lightPen, new Point(CellWidth * i + 1.5, CellWidth), new Point(CellWidth * i + 1.5, CellWidth * 10 / 2));
复制代码棋盘的话也可以先画四分之一,然后通过反转得到 600) this.width = 600;attachimg(this, 'load');" onmouseover="attachimginfo(this, 'attach_17026', 1);attachimg(this, 'mouseover')" onclick="zoom(this);" onmouseout="attachimginfo(this, 'attach_17026', 0, event)" style="CURSOR:"
/>() 12:46:31//第一象限
drawingContext.PushTransform(new ScaleTransform(-1, 1, CellWidth * 5, CellWidth * 5.5));
quarterBoard();
drawingContext.Pop();
//第二象限
quarterBoard();
//第三象限
drawingContext.PushTransform(new ScaleTransform(1, -1, CellWidth * 5, CellWidth * 5.5));
quarterBoard();
drawingContext.Pop();
//第四象限
drawingContext.PushTransform(new ScaleTransform(-1, -1, CellWidth * 5, CellWidth * 5.5));
quarterBoard();
drawingContext.Pop();
复制代码对于楚河、汉界几个字先文字竖排,文字竖排其实就是限制文字输出的宽度,让他把字给挤下去。FormattedText textFormat = new FormattedText(
text, System.Globalization.CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface(&STLiti&),
Brushes.Black);
textFormat.MaxTextWidth = fontS
textFormat.TextAlignment = TextAlignment.J
复制代码在翻转的时候要注意的是我们的翻转的文字块往往是长方形,而不是正方形, 600) this.width = 600;attachimg(this, 'load');" onmouseover="attachimginfo(this, 'attach_17027', 1);attachimg(this, 'mouseover')" onclick="zoom(this);" onmouseout="attachimginfo(this, 'attach_17027', 0, event)" style="CURSOR:"
/>() 12:46:31所以你在需要先把A点的X坐标加上长宽之差一半的距离再加全部字宽度的一半,Y坐标减去长宽之差的一半加上字体大小的一半再加全部字的高度的一半
五.动画提醒有些时候下棋的时候会没有觉察出对方下了哪个棋,应该过几秒提醒下,顺便也督促下已经思考了一段时间了快快下吧。我们可以使用 DispatcherTimer类来计时,让其每个几秒来做提醒。DispatcherTimer _dispatcherTimer = new DispatcherTimer(DispatcherPriority.ApplicationIdle);
_dispatcherTimer.Interval = TimeSpan.FromSeconds(10);
_dispatcherTimer.Tick += delegate
_renderingListener.StartListening();
复制代码然后用CompositionTarget.Rendering来改变控件的透明度达到跳动的效果。_renderingListener.Rendering += delegate
if (tempChessmanControl == null)
tempChessmanControl = _lastMoveC
if (tempChessmanControl != null)
if (frameCount % 20 == 0)
tempChessmanControl.Opacity = tempChessmanControl.Opacity & 0 ? 0 : 1;
frameCount++;
if (tempChessmanControl != _lastMoveChessman //已经换了棋子
|| frameCount & 120 //提醒大于规定
|| !IsRedReady& &
//红方没有开始,或已经结束
|| !IsBlueReady)&
//蓝方没有开始,或已经结束
tempChessmanControl.Opacity = 1;
frameCount = 0;
tempChessmanControl =
_renderingListener.StopListening();
复制代码六.联机操作协议:UDP先发送广播给局域网看是否有空闲主机。 空闲主机接到广播如果空闲则回应。 创建主机的时候再发广播告诉已经有新建主机。 互联后告诉其他主机已经在对战,让其从服务列表下拿掉。 走一步告诉对方是从哪个坐标点移动到哪个坐标点 没做 发送广播public void SendBroadcast(object obj, int port)
byte[] sendbuf = UDPClass.Serialization(obj);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ep = new IPEndPoint(IPAddress.Broadcast, port);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
s.SendTo(sendbuf, ep);
s.Close();
复制代码发送普通消息public void Send(IPAddress ipAddress, object obj, int port)
byte[] sendbuf = UDPClass.Serialization(obj);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ep = new IPEndPoint(ipAddress, port);
s.SendTo(sendbuf, ep);
s.Close();
复制代码监听端口private void StartUdpListenerPort()
bool done =
using (UdpClient listener = new UdpClient())
listener.EnableBroadcast =
IPEndPoint iep = new IPEndPoint(IPAddress.Any, _listenPort);
//端口复用
listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse, false);
listener.Client.Bind(iep);//绑定这个实例
while (done)
byte[] bytes = listener.Receive(ref iep);
_callback(iep,_listenPort, UDPClass.Deserialize(bytes));
listener.Close();
复制代码因为存在多客户端所以一个端口不能重用,我是从2000可以,每次加一看看是否被使用过。这里用了比较烂的方法,不知道大家有没有比较好的办法public static int GetIdlePort(int startPort)
while (true)
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipport = new IPEndPoint(IPAddress.Any, startPort);
s.Bind(ipport);
startPort++;
s.Close();
return startP
七.窗体关闭事件窗体的事件是在View上的,如何让ViewModel和之上的事件相绑定呢?我们知道事件其实包含的是一个委托的集合,如果让View上的事件所用的委托同ViewModel的委托相绑定不就得的效果了。我们可以参考Prism框架做个中间件,用附加属性给窗体以作绑定。&Window x:Class=&ChineseChess.Shell&
xmlns=&/winfx/2006/xaml/presentation&
xmlns:x=&/winfx/2006/xaml&
xmlns:local=&clr-namespace:ChineseChess&
xmlns:views=&clr-namespace:ChineseChess.Views&
Width=&500& Height=&600&&
&local:WindowRegionMetadata.WindowRegionMetadata&
&local:WindowRegionMetadata BeforeClose=&{Binding PersistAction}&/&
&/local:WindowRegionMetadata.WindowRegionMetadata&
&Window.Title&
&MultiBinding& StringFormat=&{}{0}:{1}&&
&Binding Path=&LocalIP&/&
&Binding Path=&Port&/&
&/MultiBinding&
&/Window.Title&
复制代码但是App中的启动要改成这样protected override void OnStartup(StartupEventArgs e)
base.OnStartup(e);
Shell window = WindowRegionBehavior.CreateWindow&Shell&(null, null);
ShellViewModel shellViewModel = new ShellViewModel();
window.DataContext = shellViewM
window.Show();
复制代码具体的代码限于篇幅请参见事例。八.写在最后本事例只是简单的实现了一些功能,如有需要添加的可以自己练练手,做些小游戏还是很能提高对程序的积极性的。示例下载(.netFramework 3.5 SP1):
附件: 亲,您没有权限下载或查看附件喔:-)
试试 或 吧!
[quote] 原帖由 [b]cobra[/b] 于
12:37:00 发表[b][size=5]七.窗体关闭事件[/size][/b]窗体的事件是在View上的,如何让ViewModel和之上的事件相绑定呢?我们知道事件其实包含的是一个委托的集合,如果让View上的事件所用的委托同ViewModel的委托相绑定不就得的效果了。我们可以参考Prism框架做个中间件,用附加属性给窗体以作绑定。[code]&Window x:Class=&Chines [/quote]技术共享,强烈的支持一下
很不错!!
dddddddddddddddddddddddddddasAssssssssssssssssd
Powered by
CopyRight &12614_cnchess T 控件是为Delphi程序员编写的中国象棋 。用T , 能够快速 Poker games 棋牌游戏 182万源代码下载-
&文件名称: 12614_cnchess
& & & & &&]
&&所属分类:
&&开发工具: Delphi
&&文件大小: 706 KB
&&上传时间:
&&下载次数: 12
&&提 供 者:
&详细说明:TCnChess控件是为Delphi程序员编写的中国象棋控件。用TCnChess,Delphi程序员能够快速的
编写中国象棋的游戏程序。-jhgj
文件列表(日期:~)(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&D5&&..\CnChess.dcr&&..\CNChess.dcu&&..\CnChess.res&&..\CNChess_D5.bpl&&D6&&..\CnChess.dcr&&..\CNChess.dcu&&..\CnChess.res&&..\CNChess_D6.bpl&&Demo&&....\Demo.cfg&&....\Demo.dof&&....\Demo.dpr&&....\Demo.exe&&....\Demo.res&&....\&&....\&&....\&&....\&&....\Skin&&....\....\Skin1&&&&&&&&&&&&....\....\.....\Guard_G.bmp&&....\....\.....\Guard_R.bmp&&....\....\.....\King_G.bmp&&....\....\.....\King_R.bmp&&....\....\.....\Knight_G.bmp&&....\....\.....\Knight_R.bmp&&....\....\.....\Mask.bmp&&....\....\.....\Pawn_G.bmp&&....\....\.....\Pawn_R.bmp&&....\....\.....\Rook_G.bmp&&....\....\.....\Rook_R.bmp&&....\....\.....\skin.ini&&....\....\skin2&&&&....\....\.....\Cannon_G.bmp&&....\....\.....\Cannon_R.bmp&&....\....\.....\Elephant_G.bmp&&....\....\.....\Elephant_R.bmp&&....\....\.....\Guard_G.bmp&&....\....\.....\Guard_R.bmp&&....\....\.....\King_G.bmp&&....\....\.....\King_R.bmp&&....\....\.....\Knight_G.bmp&&....\....\.....\Knight_R.bmp&&....\....\.....\Mask.bmp&&....\....\.....\Pawn_G.bmp&&....\....\.....\Pawn_R.bmp&&....\....\.....\Rook_G.bmp&&....\....\.....\Rook_R.bmp&&....\....\.....\skin.ini&&Readme.txt
&相关搜索:
&输入关键字,在本站182万海量源码库中尽情搜索:
&[] - 一个生成象棋棋步的源程序,该程序可以实时生成棋步,并实现同步图形显示
&[] - StoneChess棋牌类游戏开发控件,供初学者研究使用
&[] - 用DELPHI编写的系统托盘程序
&[] - 功能完整的中国象棋,具有完整的走棋规则,能实现悔棋功能,能保存与读取残局,另外还做了一个软件封面。代码都配有详尽的注释,
适合初学者作为入门实例。
&[] - 中国象棋规则演示,非常不错的学习型代码。
&[] - 为物业部门提供一套高效、快捷的应用软件。适用于房产业主、大中小型物业公司、物业服务商、房地产开发商、物业中介公司等物业管理;用于管理公寓、住宅群体、智能小区、商品房、多层住宅、商业大厦、别墅等各类小区。
经过系统分析,系统的项目大体上完成的内容有:住户管理、住户投诉管理、住户报修管理、物业设备维修随笔 - 400&
评论 - 9395&
&&&&&&&&&&&
在线演示地址:
这节我们要布局Index.xaml界面。
首先,我们定义一下全局的宽和高:[数字差不多就行了]
一堆代码,都是自动生成的,只是改了两个数字,不说大伙也知道改啥数字了。
&UserControl&x:Class="NewChessProject.Index"&&&&xmlns="/winfx/2006/xaml/presentation"&&&&xmlns:x="/winfx/2006/xaml"&&&&xmlns:d="/expression/blend/2008"&&&&xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"&&&&mc:Ignorable="d"&&&&d:DesignHeight="<span style="color: #0"&d:DesignWidth="<span style="color: #00"&&&&&&&&&&Grid&x:Name="LayoutRoot"&Background="White"&&&&&&/Grid&&/UserControl&
接着我们要分块了,如果看过主界面就知道分几块了,如下图:
共有五个区,每个区我都弄成一个用户控件,然后往里加载。
怎么个加载?新建几个用户控件,然后往里拖?拖过了,好像不太行。
于是,不知从哪看到这么一种方法来加载:
A:拖一个Border控件到界面去
B:后台写上这两句代码:
控件A&chessControl&=&new&控件A();chessBoard.Child=chessC
通过这种方式能动态加载用户控件,有点Asp.net里的Literal控件。
好了,所以目前我们要往界面里预备好几个Border控件,然后起好名称:
先来一个下棋区的吧,放完之后界面是一片空白的,不要着急先:
&Border&BorderBrush="Silver"&BorderThickness="<span style="color: #"&Height="<span style="color: #4"&HorizontalAlignment="Left"&Margin="<span style="color: #,10,0,0"&Name="chessBoard"&VerticalAlignment="Top"&Width="<span style="color: #2"&&/Border&
然后我们新建一个一区的下棋控件:
添加控件大伙都会了吧:对着项目右键-》添加&#8212;》新建项-&用户控件-&输入名称:Chess.xaml
好了,我们回到Index.xaml.cs后台去,把添加控件的代码写进去:
&public&partial&class&Index&:&UserControl&&&&{&&&&&&&&public&Index()&&&&&&&&{&&&&&&&&&&&&InitializeComponent();&&&&&&&&&&&&Chess&chessControl=new&Chess();//实例化控件&&&&&&&&&&&&chessBoard.Child&=&chessC//加载控件&&&&&&&&}&&&&}
如果你想看效果,你就运行了,不过结果也是一片空白的,因为新建的用户控件啥也没有?接下来让它有-》棋
进入Chess.xaml,我们把Grid删除,换成Cavans:
&Canvas&Background="White"&Height="<span style="color: #0"&HorizontalAlignment="Left"&Margin="<span style="color: #,0,0,0"&Name="canvasRoot"&VerticalAlignment="Top"&Width="<span style="color: #0"&&&&&&&/Canvas&
这里的宽和高我们先不急着改,因为我们后台根据棋盘的大小来设置
写到这里博客园挂了15:21分,也许是这边挂了,但QQ还正常着,网易也能上):
public&Chess()&&&&&&&&{&&&&&&&&&&&&InitializeComponent();&&&&&&&&&&&&ChessNewInstance.Chess&chess&=&new&ChessNewInstance.Chess(canvasRoot);&&&&&&&&&&&&chess.InitBoard();&&&&&&&&&&&&chess.InitChessman();&&&&&&&&&&&&canvasRoot.Width&=&chess.Board.W&&&&&&&&&&&&canvasRoot.Height&=&chess.Board.H&&&&&&&&}
上面代码看着很熟悉吧,以前经常示例用来显示棋盘和棋子的,最后两行就是设置宽和高了。
现在可以F5运行了:登陆-&进入房间-&主界面:一个棋盘出来了(这里就不上图片了,博客园访问不了)
好,这节简单点到这里了,下节我们布局下一个区在线用户区[没按图的顺序来的,哪个简单先来哪个了]。
阅读(...) 评论()修改后的VB中WINSOCK控件在网上象棋中的应用_微型机与应用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
9页免费9页免费6页免费6页&#165;3.004页免费2页免费19页1下载券12页5下载券10页2下载券2页1下载券
喜欢此文档的还喜欢11页免费19页免费2页免费4页免费5页1下载券
修改后的VB中WINSOCK控件在网上象棋中的应用_微型机与应用|本&#8203;文&#8203;首&#8203;先&#8203;介&#8203;绍&#8203;了&#8203;V&#8203;i&#8203;s&#8203;u&#8203;a&#8203;l&#8203; &#8203;B&#8203;a&#8203;s&#8203;i&#8203;c&#8203;中&#8203;的&#8203;W&#8203;I&#8203;N&#8203;S&#8203;O&#8203;C&#8203;K&#8203;控&#8203;件&#8203;的&#8203;使&#8203;用&#8203;方&#8203;法&#8203;,&#8203;然&#8203;后&#8203;深&#8203;入&#8203;探&#8203;讨&#8203;了&#8203;网&#8203;上&#8203;象&#8203;棋&#8203;系&#8203;统&#8203;的&#8203;设&#8203;计&#8203;思&#8203;想&#8203;及&#8203;其&#8203;实&#8203;现&#8203;过&#8203;程&#8203;。&#8203;
&#8203;
&#8203; &#8203; &#8203; &#8203; &#8203;本&#8203;文&#8203;收&#8203;录&#8203;于&#8203;&&#8203;l&#8203;t&#8203;;&#8203;&&#8203;l&#8203;t&#8203;;&#8203;微&#8203;型&#8203;机&#8203;与&#8203;应&#8203;用&#8203;&&#8203;g&#8203;t&#8203;;&#8203;&&#8203;g&#8203;t&#8203;;&#03;0&#03;1&#8203;年&#03;1&#8203;期
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢}

我要回帖

更多关于 mscomm控件使用详解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信