使用Microsoft.NETFrameworks創(chuàng)建基于Windows的應(yīng)用程序ShawnBurkeMicrosoftCorpora" />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

使用 Microsoft.NET Frameworks 創(chuàng)建Windows應(yīng)

系統(tǒng) 2390 0
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>

使用 Microsoft.NET Frameworks 創(chuàng)建基于 Windows 的應(yīng)用程序

Shawn Burke
Microsoft Corporation
2000年9月

摘要: :本文介紹了 Win 表單這一新的窗體程序包,借助這一程序包,開(kāi)發(fā)人員能夠充分利用 Microsoft Windows 操作系統(tǒng)所提供的 UI 功能。

目錄



簡(jiǎn)介

目前 Web 已成了街談巷議的話題,看起來(lái)好像 Microsoft? Visual Studio? 開(kāi)發(fā)系統(tǒng)對(duì)創(chuàng)建基于 Microsoft Windows? 的傳統(tǒng)應(yīng)用程序的支持有所減弱。實(shí)際上,Microsoft 對(duì)基于 Windows 的應(yīng)用程序開(kāi)發(fā)方面的投資在不斷加大。

Win 表單是一個(gè)新的窗體程序包,借助這一程序包,開(kāi)發(fā)人員能夠充分利用 Microsoft Windows? 操作系統(tǒng)所提供的豐富的用戶界面功能,創(chuàng)建基于 Windows 的應(yīng)用程序。Win Forms 是新的 Microsoft?.NET 平臺(tái)的一個(gè)組成部分,它提供了許多新技術(shù),包括通用的應(yīng)用程序框架、可管理的執(zhí)行環(huán)境、一體化的安全性以及面向?qū)ο蟮脑O(shè)計(jì)原則。而且,Win Forms 全面支持快速簡(jiǎn)便地接入 Web Services 以及建立豐富的基于 ADO+ 數(shù)據(jù)模型的數(shù)據(jù)感知應(yīng)用程序。得益于 Visual Studio 中新的共享開(kāi)發(fā)環(huán)境,開(kāi)發(fā)人員能夠使用包括 Microsoft Visual Basic? 和 C# 在內(nèi)的任何支持 .NET 平臺(tái)的語(yǔ)言創(chuàng)建 Win Forms 應(yīng)用程序。


介紹 Win Forms

就像剛才所說(shuō)的,Win Forms 是專(zhuān)用于 Windows 客戶機(jī) UI 編程的 .NET Framework 的命名空間。它與 ASP+ UI 程序包(即 Web Forms)共享同樣的設(shè)計(jì)原則,但其類(lèi)和實(shí)現(xiàn)卻全然不同。在 Microsoft Win32? API 和 Web 組件之間沒(méi)有魔術(shù)般變形的類(lèi)。就像所有的 .NET Frameworks 一樣,一致性已成為優(yōu)先考慮的問(wèn)題。其目的是為了 Win Forms 開(kāi)發(fā)人員能夠迅速適應(yīng)在 Web Forms 中編寫(xiě)代碼,反之亦然。例如,所有命名空間都有 Button 類(lèi),每一個(gè)都有文本、默認(rèn)的 OnClick 事件以及 ForeColor BackColor Font 屬性。

Win Forms 的所有控件都基于 System.WinForms.Control 類(lèi)。 Control 已內(nèi)置了所有基本的 HWND 功能,并且它能處理我們已經(jīng)熟悉并喜愛(ài)的絕大多數(shù)通用 WM_xxxx 消息。 RichControl 由 Control 派生而來(lái),其中添加了布局邏輯和繪圖代碼。System.WinForms 命名空間中的絕大多數(shù)控件實(shí)際上都由 RichControl 派生而來(lái)。 ScrollableControl 能夠支持窗口客戶區(qū)域的滾動(dòng)。一般情況下,對(duì)滾動(dòng)功能的支持是通過(guò) ContainerControl 實(shí)現(xiàn)的,后者由 ScrollableControl 派生而來(lái),并增加了對(duì)管理子控件、焦點(diǎn)問(wèn)題和跨欄的支持。 Form 由 ContainerControl 派生而來(lái),是 Win Form 的頂級(jí)控件,它帶有控制標(biāo)題欄、系統(tǒng)菜單、非矩形窗口和默認(rèn)控件的屬性。 UserControl 也由 ContainterControl 派生而來(lái),是開(kāi)發(fā)人員能夠創(chuàng)建的控件的基本類(lèi)。UserControl 一般用于托管其它子控件,但對(duì)于外部客戶機(jī)來(lái)說(shuō),它又是作為單個(gè)單元出現(xiàn)的。UserControl 和 Form 在 Microsoft? Visual Studio.NET 中都有可視設(shè)計(jì)器,您會(huì)找到用于添加和設(shè)計(jì)由其所派生的類(lèi)的項(xiàng)。

圖 1. Win Forms 控件層次結(jié)構(gòu)

既然我們已了解 Win Forms 的(最)基本方面,讓我們揭開(kāi)它的面紗,看看其表面下的一些相當(dāng)不錯(cuò)的功能。


更好的易學(xué)易用性

Win Forms 的主要目的是盡可能地提高定位到 Win32 平臺(tái)的開(kāi)發(fā)人員的工作效率。無(wú)論是圖形設(shè)備界面 (GDI) 還是窗口狀態(tài)管理,為 Win32 編程通常都是很困難的。例如,類(lèi)似 WS_BORDER 或 WS_CAPTION 的一些窗口樣式只能在創(chuàng)建窗口時(shí)指定或修改。而 WS_VISIBLE 或 WS_CHILD 等其它窗口樣式則可以對(duì)已創(chuàng)建的窗口進(jìn)行修改。Win Forms 盡力消除了這些細(xì)微的差別,并確保操作過(guò)程始終保持一致性。可以隨時(shí)地、不限次序地對(duì) Win Forms 控件的屬性進(jìn)行設(shè)置,總能產(chǎn)生預(yù)期效果。如果改動(dòng)過(guò)程需要?jiǎng)?chuàng)建新的 HWND,Win Forms 框架能夠自動(dòng)地、透明地重新生成窗口,并為其應(yīng)用相適宜的所有設(shè)置。

由控件獲得通知或事件在 Win Forms 中也要容易得多。Win Forms 事件都基于稱(chēng)為 Delegates 的一個(gè)通用語(yǔ)言運(yùn)行時(shí)功能。Delegates 從本質(zhì)上講是對(duì)類(lèi)型安全的、可靠的函數(shù)指針。對(duì)于任一控件的任一事件,都可以添加代理處理程序;絕不會(huì)強(qiáng)迫您創(chuàng)建派生類(lèi)以通過(guò)替代處理事件,創(chuàng)建事件映射,或僅為處理一個(gè)事件而為類(lèi)的所有事件實(shí)施一個(gè)接口。也可以通過(guò)替代派生類(lèi)處理事件,但這種方式一般用于控件創(chuàng)建者或更為高級(jí)的應(yīng)用。匯集某一按鈕的 Click 事件相當(dāng)簡(jiǎn)單:

      
        public class ButtonClickForm: System.WinForms.Form {private System.WinForms.Button button1;public ButtonClickForm() {// 創(chuàng)建按鈕button1 = new System.WinForms.Button();      // 添加處理程序button1.AddOnClick(new System.EventHandler(button1_Click));// 將按鈕添加到窗體中this.Controls.Add(button1);  }private void button1_Click(object sender, EventArgs e) {MessageBox.Show("button1 clicked!");  }    }
      
    

這里,我們創(chuàng)建了一個(gè)按鈕,并添加了一個(gè)名為 button1_Click 的處理程序方法,通過(guò)短短幾行代碼,在單擊該按鈕后,將調(diào)用這一方法。請(qǐng)注意,即使處理程序方法被標(biāo)記為專(zhuān)用,創(chuàng)建這一掛鉤的代碼仍可以使用該方法,單擊按鈕后,按鈕將能夠激活這一方法的事件。

啟動(dòng) Win Forms 項(xiàng)目的過(guò)程也得到了簡(jiǎn)化。使用 Visual Studio.NET 創(chuàng)建 Win Forms 項(xiàng)目的過(guò)程只會(huì)創(chuàng)建一個(gè)要編譯的項(xiàng)目文件:Form1.cs。沒(méi)有頭文件,沒(méi)有接口定義文件,沒(méi)有引導(dǎo)程序文件,沒(méi)有資源文件,沒(méi)有庫(kù)文件。項(xiàng)目所需的所有信息都包含在窗體的代碼中。這樣做有一個(gè)好處:項(xiàng)目由一個(gè)簡(jiǎn)單的單窗體應(yīng)用程序擴(kuò)展到復(fù)雜的、帶有多個(gè)代碼文件的多窗體應(yīng)用程序要方便得多。鏈接過(guò)程不需要中間對(duì)象文件,只有代碼和已構(gòu)建的、受管理的所有 DLL。只要您習(xí)慣了這一方法,就能明顯地感覺(jué)到創(chuàng)建 .NET Framework 應(yīng)用程序和創(chuàng)建 C/C++ 應(yīng)用程序之間復(fù)雜性的不同。因?yàn)樾畔H僅包含在代碼文件中,在 Visual Studio.NET 環(huán)境外創(chuàng)建版本的過(guò)程也非常容易,無(wú)論是 Visual Basic 代碼、C# 代碼,還是任何其它語(yǔ)言編寫(xiě)的針對(duì) .NET Framework 的代碼。

因?yàn)?Win Forms 建立在通用語(yǔ)言運(yùn)行時(shí)的基礎(chǔ)之上,開(kāi)發(fā)人員可以任選目前針對(duì)通用語(yǔ)言運(yùn)行時(shí)的眾多語(yǔ)言中的一種,構(gòu)建 Win32 應(yīng)用程序。開(kāi)發(fā)人員現(xiàn)在可以使用多種語(yǔ)言編寫(xiě) Win Forms 應(yīng)用程序(或 Web Forms 應(yīng)用程序或 Data 應(yīng)用程序):從 C# 到 COBOL 到 Eiffel 再到 Perl 等等,中間還有很多種(上一次計(jì)數(shù)是 17 種)。方便易用再加上廣泛的應(yīng)用場(chǎng)合相得益彰,為開(kāi)發(fā)人員提供了深厚的基礎(chǔ),使他們能夠迅速有效地使用 Win Forms 構(gòu)建實(shí)用的應(yīng)用程序。


布局

如果您曾嘗試創(chuàng)建能夠正常調(diào)整大小的窗體,您就會(huì)知道這一過(guò)程有多么困難。Microsoft Foundation Classes (MFC) 或早期的 Visual Basic 版本沒(méi)有對(duì)這一功能提供內(nèi)置的支持。然而現(xiàn)在只需幾行代碼(通常情況下您甚至不需要編寫(xiě)這些代碼,因?yàn)樵谠O(shè)計(jì)時(shí)就能通過(guò) Property Browser 實(shí)現(xiàn)這些功能!),即可創(chuàng)建能夠正常調(diào)整大小的對(duì)話框。

基本布局由兩條組成:Anchoring 和 Docking。 RichControl 有一個(gè) Anchor 屬性,它是一種枚舉類(lèi)型,可以用“或”操作將這些值組合在一起,以說(shuō)明控件將與其父控件的某一邊保持恒定距離。例如,如果您將一個(gè)按鈕置于窗體上,并將 Anchor 屬性設(shè)置為 AnchorStyles.BottomRight ,則在調(diào)整按鈕的大小時(shí),按鈕將與窗體的底邊和右邊保持同一距離。此外,如果將 Anchor 設(shè)置為 AnchorStyles.All ,則按鈕的各個(gè)邊都與窗體的對(duì)應(yīng)邊保持同一距離,在調(diào)整按鈕大小時(shí)仍要滿足這些約束條件。

Docking 實(shí)際上是 Anchoring 的一個(gè)特殊情況。 RichControl Dock 屬性說(shuō)明控件要將自身固定到其父控件的哪一邊。Docking 可以是 Top、Left、Right、Bottom 或 Fill。在每種情況下,控件都將移動(dòng)到盡量靠近指定邊,并調(diào)整其大小,以填滿那一邊。如果父控件的大小有所調(diào)整,這一狀況仍將保持。將一個(gè)控件移動(dòng)到父控件的底端,并將 Anchor 設(shè)置為 AnchorStyle.BottomLeftRight ,可以模擬 Docking Bottom。在此處的示例中,列表框是 Docked Left,按鈕與窗體的頂端、左邊和右邊保持恒定距離,由此它們保持了相對(duì)位置和大小。下面的示例對(duì)話框(圖 2)完全使用 Visual Studio.NET 中的 Win Forms 設(shè)計(jì)器創(chuàng)建,只花了兩分鐘的時(shí)間,沒(méi)有編寫(xiě)一行代碼。

圖 2. 使用 Win Forms 設(shè)計(jì)器所創(chuàng)建的可調(diào)整大小的對(duì)話框

      
        // ResizableSample.csnamespace ResizableSampleNamespace {    using System;using System.Drawing;using System.ComponentModel;using System.WinForms;/// <summary>///    ResizableSample 的摘要說(shuō)明。/// </summary>public class ResizableSample : System.WinForms.Form {/// <summary> ///    為 Win Forms 設(shè)計(jì)器所要求 /// </summary>private System.ComponentModel.Container components;private System.WinForms.Button button3;private System.WinForms.Button button2;private System.WinForms.Button button1;private System.WinForms.ListBox listBox1;public ResizableSample() {// 為 Win Form 設(shè)計(jì)器支持所要求InitializeComponent();        }/// <summary>///    釋放正在使用的所有資源/// </summary>public override void Dispose() {base.Dispose();components.Dispose();        }/// <summary>///    應(yīng)用程序的主入口點(diǎn)。/// </summary>public static void Main(string[] args) {Application.Run(new ResizableSample());        }/// <summary>        ///    設(shè)計(jì)器支持所要求的方法 — 不要用編輯器        ///    修改這一方法的內(nèi)容/// </summary>private void InitializeComponent()   {this.components = new System.ComponentModel.Container();this.button2 = new System.WinForms.Button();this.button3 = new System.WinForms.Button();this.button1 = new System.WinForms.Button();this.listBox1 = new System.WinForms.ListBox();//@design this.TrayLargeIcon = false;//@design this.TrayHeight = 0;this.Text = "Resizable Dialog";this.IMEMode = System.WinForms.IMEMode.Off;this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);this.ClientSize = new System.Drawing.Size(256, 173);button2.Location = new System.Drawing.Point(152, 60);button2.Size = new System.Drawing.Size(92, 32);button2.TabIndex = 2;button2.Anchor = System.WinForms.AnchorStyles.TopLeftRight;button2.Text = "Cancel";button3.Location = new System.Drawing.Point(152, 120);button3.Size = new System.Drawing.Size(92, 44);button3.TabIndex = 3;button3.Anchor = System.WinForms.AnchorStyles.All;button3.Text = "Filler";button1.Location = new System.Drawing.Point(152, 8);button1.Size = new System.Drawing.Size(92, 32);button1.TabIndex = 1;button1.Anchor = System.WinForms.AnchorStyles.TopLeftRight;button1.Text = "OK";listBox1.Size = new System.Drawing.Size(120, 173);listBox1.Dock = System.WinForms.DockStyle.Left;listBox1.TabIndex = 0;listBox1.Items.All = new object[] {"Item One","Item Two","Item Three","Item Four"};this.Controls.Add(button3);this.Controls.Add(button2);this.Controls.Add(button1);this.Controls.Add(listBox1);   }    }}
      
    


GDI+

Win Forms 全面利用了 GDI+ 這一 Microsoft 下一代的二維圖形系統(tǒng)。Win Forms 中的圖形編程模式完全是面向?qū)ο蟮模魇礁鳂拥漠?huà)筆、筆刷、圖像和其它圖形對(duì)象與 .NET Framework 的其它部分一樣,遵循了簡(jiǎn)單易用的指導(dǎo)方針。開(kāi)發(fā)人員目前可以使用相當(dāng)不錯(cuò)的一些繪圖新功能,如 alpha 混色、漸變色、紋理、消除鋸齒以及采用除位圖外的其它圖像格式。與 Windows 2000 操作系統(tǒng)分層和透明的窗口功能配合使用,開(kāi)發(fā)人員能夠毫不費(fèi)力地創(chuàng)建豐富的、更為圖形化的 Win32 應(yīng)用程序。

如果觸發(fā)了控件的 OnPaint 事件,能夠由 PaintEventArgs 訪問(wèn)的 System.Drawing.Graphics 對(duì)象就成為一個(gè) GDI+ 圖形對(duì)象。圖形對(duì)象能夠執(zhí)行的所有操作都通過(guò) GDI+ 實(shí)施。作為一個(gè)示例,使用 GDI+ 創(chuàng)建一個(gè)繪制漸變背景的按鈕。

圖 3. 使用 GDI+ 創(chuàng)建的按鈕

以下是實(shí)現(xiàn)這一按鈕的代碼:

      
        public class GradientButton : Button {// 保留顏色設(shè)置的成員private Color startColor;private Color endColor;            // 書(shū)寫(xiě)文字時(shí)我們將需要它private static StringFormat format = new StringFormat();public GradientButton() : base() {// 初始化顏色 startColor = SystemColors.InactiveCaption;endColor = SystemColors.ActiveCaption;format.Alignment = StringAlignment.Center;format.LineAlignment = StringAlignment.Center;    }            /// <summary>/// 漸變色的終止顏色// </summary>public Color EndColor {get {return this.endColor;         }set {this.endColor = value;// 如有必要,則導(dǎo)致重新繪制if (this.IsHandleCreated && this.Visible) {Invalidate();            }         }   }            /// <summary>/// 漸變色的起始顏色// </summary>public Color StartColor {get {return this.startColor;         }set {this.startColor = value;// 如有必要,則導(dǎo)致重新繪制if (this.IsHandleCreated && this.Visible) {Invalidate();           }        }   }    protected override void OnPaint(PaintEventArgs pe) {// 繪制按鈕的常規(guī)背景以形成 // 邊框,等等。              base.OnPaint(pe);Graphics g = pe.Graphics;Rectangle clientRect = this.ClientRectangle;// 縮小矩形,以免繪制時(shí)出界clientRect.Inflate(-1,-1);// 創(chuàng)建漸變筆刷,從// 左上角運(yùn)行到右下角。Brush backgroundBrush = new LinearGradientBrush(new Point(clientRect.X,clientRect.Y), new Point(clientRect.Width, clientRect.Height), startColor, endColor);// 以漸變色填充背景....g.FillRectangle(backgroundBrush, clientRect);// 在客戶機(jī)區(qū)域的中間書(shū)寫(xiě)文字。g.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), clientRect, format);   }}
      
    

就像您所看到的,這并不是非常困難。得益于 Win Forms 和 GDI+ 面向?qū)ο蟮脑O(shè)計(jì),無(wú)需編寫(xiě)任何復(fù)雜的代碼,即可實(shí)現(xiàn)我們的 GradientButton ,并且在設(shè)計(jì)器中,可以通過(guò) Property Browser 操作 Text Font StartColor EndColor


訪問(wèn)底層系統(tǒng)

許多框架的一個(gè)缺點(diǎn)就是:如果人們編寫(xiě)的應(yīng)用程序類(lèi)型與示例和演示中的嚴(yán)格一致,則這些框架的效果相當(dāng)不錯(cuò),但有時(shí)開(kāi)發(fā)人員發(fā)現(xiàn),一旦他們希望用框架進(jìn)行一些有創(chuàng)造性的工作,某些情況下就會(huì)碰到障礙或遭到失敗。如果遇到這一情況,Win Forms 框架自始至終都能夠允許開(kāi)發(fā)人員訪問(wèn)系統(tǒng)基礎(chǔ)結(jié)構(gòu)。當(dāng)然,希望 Win Forms 這樣一個(gè)設(shè)計(jì)優(yōu)良的框架不會(huì)使用戶遭遇這種情況,但可能發(fā)生的情況幾乎是無(wú)限的。所有的控件都有 Handle 屬性,允許訪問(wèn)控件的窗口句柄 (HWND),GDI 對(duì)象也提供了類(lèi)似的句柄訪問(wèn)過(guò)程。而且, Control 實(shí)際上擁有一個(gè)名為 WndProc 的受保護(hù)的虛擬方法,對(duì)于少數(shù) Win Forms 尚不能支持的消息,可以替代該方法,添加處理方式。

例如,假設(shè)您的應(yīng)用程序是資源密集型的,需要響應(yīng) WM_COMPACTING。如果系統(tǒng)檢測(cè)到內(nèi)存不足,會(huì)向所有高層窗口廣播 WM_COMPACTING,您就會(huì)知道 Win Forms 框架對(duì)這一消息沒(méi)有提供內(nèi)置支持,由此,可以添加如下處理過(guò)程:

      
        /// <summary>///    Win32Form1 的摘要說(shuō)明。/// </summary>public class CompactableForm : System.WinForms.Form {private EventHandler handler;public void AddOnCompacting(EventHandler h) {handler = (EventHandler) Delegate.Combine(handler, h);}protected override void OnCompacting(EventArgs e) {// 查看運(yùn)行時(shí)系統(tǒng)能否釋放任何東西System.GC.Collect();// 調(diào)用任一處理程序。if (handler != null) handler(this, e);   }public void RemoveOnCompacting(EventHandler h) {handler = (EventHandler) Delegate.Remove(handler, h);}protected override void WndProc(ref Message m) {case (m.msg) {case win.WM_COMPACTING:OnCompacting(EventArgs.Empty);break;      }base.WndProc(m);   }    }
      
    

只需數(shù)行代碼,當(dāng)系統(tǒng)試著收集未用資源時(shí),利用新的 CompactableForm 類(lèi)或由此派生的類(lèi)即可得到通知,并作出響應(yīng)。


結(jié)論

盡管在許多開(kāi)發(fā)人員的計(jì)劃中,針對(duì) Web 的開(kāi)發(fā)是當(dāng)前工作的重點(diǎn),而定位于熟悉的 Win32 平臺(tái)仍然是一個(gè)不得不面對(duì)的情況。有了 Win Forms,Windows 開(kāi)發(fā)人員無(wú)論是新手還是老手,都會(huì)發(fā)現(xiàn)使用豐富的接口創(chuàng)建復(fù)雜的應(yīng)用程序是一個(gè)很方便的過(guò)程,而這些接口與 .NET Framework 中具有 Web 和數(shù)據(jù)功能的許多技術(shù)配合良好。

通過(guò)利用跨語(yǔ)言繼承、碎片收集和安全性等通用語(yǔ)言運(yùn)行時(shí)提高工作效率的優(yōu)秀功能,開(kāi)發(fā)人員將從 .NET Framework 和 Win Forms 中獲益。




使用 Microsoft.NET Frameworks 創(chuàng)建Windows應(yīng)用程序


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 城口县| 仁化县| 兴城市| 海南省| 正镶白旗| 简阳市| 宁明县| 山东省| 新竹县| 宁蒗| 南充市| 黄山市| 武乡县| 揭西县| 周宁县| 当雄县| 大庆市| 阿巴嘎旗| 西华县| 琼中| 喀喇沁旗| 论坛| 正镶白旗| 晋江市| 宜昌市| 琼海市| 醴陵市| 太和县| 义乌市| 泰来县| 婺源县| 巢湖市| 康马县| 城口县| 罗山县| 新乐市| 双柏县| 聊城市| 深州市| 大关县| 宽城|