目前分類:C# (54)

瀏覽方式: 標題列表 簡短摘要

C#里WinForm开发中如何实现控件随窗体大小的改变而自动适应其改变

在设计可供用户调整大小的窗体时,如何实现该窗体上的控件也应能正确地随窗体的改变而自动调整大小并且能重新定位?此时就要借助控件的.Anchor属性。Anchor属性定义控件的定位点位置。当控件锚定到某个窗体时,如果该窗体的大小被调整,那么该控件维持它与定位点位置之间的距离不变。例如,如果“:Button”控件锚定到窗体的左、右和底边缘,那么当调整该窗体的大小时,Button控件水平调整大小,维持到该窗体左边和右边的距离不变,另外控件垂直定位其自身,以便其到窗体底边的距离始终不变,如果控件未锚定而窗体的大小被调整,则该控件相对于窗体边缘的位置将发生变化。下面介绍如何将控件锚定到窗体上。 
    
  首先,选择要锚定的控件。然后,在属性窗口中,单击Anchor属性右边的箭头,将显示一个编辑器,该编辑器显示一个十字线。若要设置定位点,单击该十字线的上、下、左或右部分。在默认情况下,控件锚定左边和上边,若要清除已锚定控件的边,请单击该十字线的相应臂。再次单击Anchor属性名称关闭Anchor属性编辑器。当窗体在运行显示时,该控件调整大小保持与该窗体边缘的距离不变,到锚定边缘的距离始终保持在 “Windows窗体设计器”中定位该控件时所定义的距离。需要注意的是,某些控件(如ComboBox控件)有高度限制,将控件锚定到其窗体或容器的底部,无法强制该控件超过其高度限制。

.NET框架允许你对子控件设置属性,命令在调整父窗体大小时,它们应该如何运作。用来命令控件在调整大小时动作的两个属性就是“Dock”和“Anchor”。

Dock和Anchor通过将控件连接到它们父窗体的某个位置,而免除了使应用程序具有不可预知界面的麻烦。最好的一点就是设立这些属性不需要任何手写代码。所有事情都可以通过Visual Studio IDE中的点和单击来完成。

Anchor属性

正如名称暗示的那样,这个属性迫使控件将其自身定位在父窗体或父控件中的某个相对或绝对位置。这个属性有四个可以开启或关闭的值:

  • Top——表示控件中与父窗体(或父控件)相关的顶部应该保持固定。
  • Bottom——表示控件中与父窗体(或父控件)相关的底边应该保持固定。
  • Left——表示控件中与父窗体(或父控件)相关的左边缘应该保持固定。
  • Right——表示控件中与父窗体(或父控件)相关的右边缘应该保持固定。

要对一个控件设置Anchor属性,只需在Visual Studio设计器中选择控件,然后转到属性窗口。你会看到一个标注为“Anchor”的属性。点击这个属性值的部分,会出现一个小窗口让你选择想要赋予控件的锚点。图表A所示是选择了“顶边、左边”的anchor设置窗口。图表B所示是选择了“底边、右边”的窗口。

图表A

利用Anchor和Dock属性管理WinForm控件

Anchor工具顶部和左边

图表B

戮克 發表在 痞客邦 留言(0) 人氣()

(原创文章,转载请注明来源:http://blog.csdn.net/hulihui)

 

在Socket的接收/发送方法:Send()、BeginSend()、Receive()、BeginReceive()中,第一个参数是字节数数组,表示当前接收数据区或需要发送的数据。普通Socket应用中,往往是接收/发送时创建数组,使用后数组空间由托管堆回收(Socket关闭后其关联的缓冲区情况类似)。显然,频繁创建接收/发送缓冲区将在托管堆上留下很多的内存碎块,影响系统性能。

 

使用Socket异步调事件参数类SocketAsyncEventArgs时考虑了上述情况,基本构思为:自定义一个缓冲区管理类如BufferManager,开辟一个大的、可重用接收/发送收缓冲区,用于SendAsync()、ReceiveAsync()等方法,之前使用SetBuffer()和属性OffSet、Count设定缓冲区空间。

 

事实上,在.NET 2.0平台上的Socket传统APM(异步编程模型)中仍然可用该这个技术。下面是修改的BufferManager类:
public sealed class BufferManager
{
// ... 全部字段为private,类型和名称见构造函数

public BufferManager(int maxSessionCount, int receivevBufferSize, int sendBufferSize)
{
m_maxSessionCount = maxSessionCount; // 最大可连接客户端数, int

戮克 發表在 痞客邦 留言(0) 人氣()

如下图所示,在处理屏幕默认旋转方向的时候可以在这里进行选择,上下左右一共是4个方向。

Unity3D研究院之设置自动旋转屏幕默认旋转方向 - 雨松MOMO程序研究院 - 1

 

策划的需求是游戏采用横屏,但是要求支持两个方向自动旋转,如下图所示,我的设置是这样的。

Default Orientation* Auto Roation 表示游戏支持自动旋转屏幕,但是前提是手机没有锁定屏幕旋转功能。

Landscape Right 和Landscape Left 表示手机屏幕只支持横屏两个方向的自动旋转。

Unity3D研究院之设置自动旋转屏幕默认旋转方向 - 雨松MOMO程序研究院 - 2

这里问题就来了,既然设置了两个方向的自动旋转,那么必然会有一个默认的方向。然而Unity默认的方向就是Landscape Left  就是屏幕的正方向在手机Home的左边。大部分IOS游戏都是这个方向,但是在Android上可能就有点问题了,因为Android屏幕的左下角有个返回的按钮,假如你的游戏是横屏,又假如你的游戏操作区域在右下角,那么玩家玩的时候很有可能点到这个返回按钮,那么用户体验就降低了。。

所以策划想让Android版默认正方向让屏幕在Home的右边,但是还必须支持横屏的自动旋转。。可是Unity的面板里根本没有设置带自动旋转,并且设置默认方向的参数。。。我想到在代码里面给它赋值,于是有了下面的代码。似乎问题解决的不完美,因为Unity开机有个启动画面,然而启动画面是在Awake之前执行的,所以虽然在Awake设置了屏幕方向,可是启动画面的方向确还是读取ProjectSetting里的。

戮克 發表在 痞客邦 留言(0) 人氣()

方法一
    public string test(string[] Stringarray)
    {
string result = string.Join(",", Stringarray);
return result;
    }
方法二
StringBuilder builder = new StringBuilder();
foreach (string value in Stringarray)
{

戮克 發表在 痞客邦 留言(0) 人氣()

問題:
使用WebBrowser開啟網頁時點擊元件發生錯誤如圖
解決方式:
webBrowser1.ScriptErrorsSuppressed = true;

戮克 發表在 痞客邦 留言(0) 人氣()

很簡單
只要指定一個字串到webBrowser1物件的Url屬性
textBox1.Text=webBrowser1.Url.ToString();

戮克 發表在 痞客邦 留言(0) 人氣()

text.Replace("被取代'","新字串");
後者字串取代前者

 text = text.Replace("<img", @"<img class=""rwd-img""");

以下是讀取HTML檔案把一些語法用字串取代成想要的語法
1
2
3
4
5
 string text = System.IO.File.ReadAllText(ConfigPath, System.Text.Encoding.Default);
text = text.Replace("</head>", @"<link href=""./iie/css/rwd.css"" rel=""stylesheet"" type=""text/css""></head>");

戮克 發表在 痞客邦 留言(0) 人氣()

讀取文字檔到字串
   string text = System.IO.File.ReadAllText(ConfigPath, System.Text.Encoding.Default);
字串(寫)存到文字檔
  System.IO.File.WriteAllText(ConfigPath, text, System.Text.Encoding.Default);



如果不加System.Text.Encoding.Default,可能會發生中文亂碼的現象。

戮克 發表在 痞客邦 留言(0) 人氣()

LINQ to JSON
JSON  to LINQ
JSON to XML
XML  to JSON
超好用的工作
三著的轉換五行內搞定



參考:

戮克 發表在 痞客邦 留言(0) 人氣()

新增專案選網頁
 建立一個ASMX檔案
 將要做成網頁服務的方法前面加上[WebMethod]
 執行的測試業面

戮克 發表在 痞客邦 留言(0) 人氣()

十二小時製h要小寫
("yyyy-MM-dd   hh:mm:ss");

二十四小時製H要大寫
("yyyy-MM-dd   HH:mm:ss");

戮克 發表在 痞客邦 留言(0) 人氣()

程式使用到一個空的物件
發生了例外導致一連串的錯誤如以下




ust-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.

戮克 發表在 痞客邦 留言(0) 人氣()

問題:
最近使用C#寫一個ADO存取ACCESS檔案。在W7以及XP執行都正常。但在Windows Embedded POSReady 2009卻一直出現以下錯誤
--------------------------------------------------------------------
System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to interface type 'ADODB.Connection'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00001550-0000-0010-8000-00AA006D2EA4}' failed due to the following error: 不支援此種介面 (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
   at OperateCamera.Form1.button2_Click(Object sender, EventArgs e) in d:\繼光香香雞\new\拍照打卡\OperateCamera\Form1.cs:line 1834
--------------------------------------------------------------------
System.TypeLoadException: Could not load type 'ADODB.FieldsToInternalFieldsMarshaler' from assembly '繼光香香雞拍照打卡, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
   at System.StubHelpers.StubHelpers.CreateCustomMarshalerHelper(IntPtr pMD, Int32 paramToken, IntPtr hndManagedType)
   at ADODB._Recordset.get_Fields()
   at OperateCamera.Form1.button2_Click(Object sender, EventArgs e) in d:\繼光香香雞\new\拍照打卡\OperateCamera\Form1.cs:line 1844

戮克 發表在 痞客邦 留言(0) 人氣()

  private string GetDayName()
        {
            string result = "";

            DateTime today = DateTime.Now;
            if (today.DayOfWeek == DayOfWeek.Monday)
            {
                result = "星期一";
            }
            else if (today.DayOfWeek == DayOfWeek.Tuesday)

戮克 發表在 痞客邦 留言(0) 人氣()


 1
2
3
4
5
6
7
8
9

戮克 發表在 痞客邦 留言(0) 人氣()

winform禁止視窗的放大縮小功能

禁止放大:
把Form裡的MaximuzeBox屬性改成false
禁止縮小:
把Form裡的MinimizeBox屬性改成false

戮克 發表在 痞客邦 留言(0) 人氣()

當你程式碼判斷某個條件要直接跳出函式的時候請勿使用break;會錯誤
如果是沒有回傳值void
直接在要跳出的地方加上
reture;
若是有任何回傳值
reture   回傳值;

戮克 發表在 痞客邦 留言(0) 人氣()

microsoft.jet.oledb.4.0 無法在64位元上執行
只能在32位元上
因次在編譯環境要改成x86
有需要用到64位元的函數
請換個方式呼叫資料庫

戮克 發表在 痞客邦 留言(0) 人氣()

開啟螢幕鍵盤
 System.Diagnostics.Process.Start("" + System.Environment.SystemDirectory + "/osk.exe");



關閉螢幕鍵盤
System.Diagnostics.Process[] MyProcess = System.Diagnostics.Process.GetProcessesByName("osk");
 if (MyProcess.Length>0)
                    MyProcess[0].Kill();

戮克 發表在 痞客邦 留言(0) 人氣()

有人會問可以用相對路徑幹嘛還需要抓執行檔的目錄
舉例來說。呼叫系統程式來抓取執行檔同目錄下的資料時就要使用絕對路徑,如資料庫要抓取執行檔案目錄下之資料表(MDB檔最近遇到的情況)。


string db = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)
                      + Path.DirectorySeparatorChar.ToString();

戮克 發表在 痞客邦 留言(0) 人氣()

«12 3