飛艷小屋

          程序--人生--哲學(xué)___________________歡迎艷兒的加入

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks
          ?

          VB 6到VB.NET——窗體特殊應(yīng)用

          李洪根

          一、?? 摘要

          ??? VB .NET做為VB6的升級(jí)版本,具備了許多新的功能,它可以簡(jiǎn)便快捷地創(chuàng)建 .NET 應(yīng)用程序(包括 XML Web services 和 ASP.NET Web 應(yīng)用程序),還是一個(gè)功能強(qiáng)大的面向?qū)ο蟮木幊陶Z(yǔ)言(如繼承、接口和重載)。新的語(yǔ)言功能包括自由線程處理和結(jié)構(gòu)化異常處理。VB.NET 還完全集成了.NET 框架和公共語(yǔ)言運(yùn)行庫(kù),.NET 框架和公共語(yǔ)言運(yùn)行庫(kù)共同提供語(yǔ)言互操作性、垃圾回收、增強(qiáng)的安全性和改進(jìn)的版本支持??梢哉f(shuō)是一個(gè)劃時(shí)代的產(chǎn)品!

          VB6到VB.NET的開(kāi)發(fā)過(guò)程中,窗體應(yīng)用始終是一個(gè)永恒的話(huà)題。任何一個(gè)WINDOWS的應(yīng)用程序,都與窗體密切相關(guān),在許多場(chǎng)合,我們都需要對(duì)窗體進(jìn)行一些特殊的設(shè)置或操作,本文用VB6和VB.NET相結(jié)合,來(lái)說(shuō)明窗體應(yīng)用的特殊問(wèn)題及處理,以及VB.NET給我們帶來(lái)的新的功能!

          ?

          二、正文

          1、???????????? 創(chuàng)建特殊形狀的窗體

          我們還是來(lái)看一下在VB6中的實(shí)現(xiàn),VB6中實(shí)現(xiàn)(借助API函數(shù))

          做一個(gè)古怪的窗口必須要用的也是此程序中最重要的一個(gè)函數(shù)就是SetWindowRgn

          它的功能就是對(duì)指定的窗口進(jìn)行重畫(huà),把這個(gè)窗口你選擇的部分留下其余的部分抹掉

          參數(shù):hWnd:你所要重畫(huà)的窗口的句柄,比如你想重畫(huà)form1則應(yīng)該讓此參數(shù)為form1.hWnd

          ???? hRgn:你要保留的區(qū)域的句柄,這個(gè)句柄是關(guān)鍵,你需要通過(guò)別的渠道來(lái)獲得

          在這里的區(qū)域是由Combinergn合成的新區(qū)域

          ???? bRedram:是否要馬上重畫(huà),一般設(shè)為true

          函數(shù)CombineRgn將兩個(gè)區(qū)域組合為一個(gè)新區(qū)域

          函數(shù)Createrectrgn為創(chuàng)建一個(gè)由點(diǎn)X1,Y1和X2,Y2描述的矩形區(qū)域

          函數(shù)CreateEllipticRgn為創(chuàng)建一個(gè)X1,Y1和X2,Y2的橢圓區(qū)域

          DeleteObject這個(gè)函數(shù)可刪除GDI對(duì)象,比如畫(huà)筆、刷子、字體、位圖、區(qū)域以及調(diào)色板等等。對(duì)象使用的所有系統(tǒng)資源都會(huì)被釋放

          ?

          以下是VB6的代碼:

          ??? PrivateDeclareFunction CreateEllipticRgn Lib "gdi32" (ByVal X1 AsLong, ByVal Y1 AsLong, ByVal X2 AsLong, ByVal Y2 AsLong) AsLong

          ??? PrivateDeclareFunction CreateRectRgn Lib "gdi32" (ByVal X1 AsLong, ByVal Y1 AsLong, ByVal X2 AsLong, ByVal Y2 AsLong) AsLong

          ??? PrivateDeclareFunction CombineRgn Lib "gdi32" (ByVal hDestRgn AsLong, ByVal hSrcRgn1 AsLong, ByVal hSrcRgn2 AsLong, ByVal nCombineMode AsLong) AsLong

          PrivateDeclareFunction SetWindowRgn Lib "user32" (ByVal hWnd AsLong, ByVal hRgn AsLong, ByVal bRedraw AsBoolean) AsLong

          ??? PrivateDeclareFunction DeleteObject Lib "gdi32" (ByVal hObject AsLong) AsLong

          ??? PrivateConst RGN_DIFF = 4

          ?

          ??? PrivateSub Form_Load()

          ??????? Dim rgn AsLong

          ??????? Dim rgnRect AsLong

          ??????? Dim rgnDest AsLong

          ?

          ??????? rgn = CreateEllipticRgn(0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY)

          ??????? rgnRect = CreateRectRgn((Me.Width / Screen.TwipsPerPixelX - 20) / 2, (Me.Height / Screen.TwipsPerPixelY - 20) / 2, (Me.Width / Screen.TwipsPerPixelX + 20) / 2, (Me.Height / Screen.TwipsPerPixelY + 20) / 2)

          ??????? rgnDest = CreateRectRgn(0, 0, 1, 1)

          ??? CombineRgn rgnDest, rgn, rgnRect, RGN_DIFF

          SetWindowRgn Me.hWnd, rgnDest, True

          ??? Call DeleteObject(rgnRect)

          ??? Call DeleteObject(rgnDest)

          ??? EndSub

          ?

          ??? PrivateSub Command1_Click()

          ??????? End

          ??? EndSub

          ?

          ?

          VB.NET中,我們可以使用.NET 框架類(lèi)庫(kù)System.Drawing.Drawing2D的GraphicsPath 類(lèi)(應(yīng)用程序使用路徑來(lái)繪制形狀的輪廓、填充形狀內(nèi)部和創(chuàng)建剪輯區(qū)域),來(lái)繪制圖形,

          然后通過(guò)窗體的Me.Region來(lái)設(shè)置窗口的可見(jiàn)區(qū)域。

          ?

          以下是VB.NET的代碼:

          ??? '聲明一個(gè)布爾型變量,判斷窗體是否正常區(qū)域

          Dim IsNormalRegion AsBoolean = True

          ?

          ? ??PrivateSub Button2_Click(ByVal sender As System.Object, _

          ??????????? ByVal e As System.EventArgs) Handles Button2.Click

          ?

          ??????? If (IsNormalRegion) Then

          ??????????? '構(gòu)造一個(gè)GraphicsPath對(duì)象實(shí)例

          ??????????? Dim Graphics AsNew System.Drawing.Drawing2D.GraphicsPath()

          ??????????? Dim intHeight AsInteger = Me.Size.Height

          ??????????? Dim intWidth AsInteger = Me.Size.Width

          ?

          ??????????? '定義內(nèi)矩形的左上角坐標(biāo)

          ??????????? Dim RectTop AsInteger = 100

          ??????????? '在窗體上繪制一個(gè)大橢圓,左上角的坐標(biāo)取為(0,0)

          ??????????? Graphics.AddEllipse(0, 0, intWidth, intHeight)

          ??????????? '再繪制一個(gè)小矩形

          ??????????? Dim AddRect AsNew Rectangle(RectTop, RectTop, intHeight - (RectTop * 2), intHeight - (RectTop * 2))

          ??????????? Graphics.AddRectangle(AddRect)

          ??????????? '設(shè)置窗口的可見(jiàn)區(qū)域

          ??????????? Me.Region = New Region(Graphics)

          ??????? Else

          ??????????? Me.Region = Nothing

          ??????? EndIf

          ??????? IsNormalRegion = Not IsNormalRegion

          EndSub

          程序運(yùn)行的結(jié)果如下:

          2、???????????? 使窗體在其他所有窗體之上(Allway On Top)

          VB6中實(shí)現(xiàn)(借助API函數(shù)SetWindowPos

          ??? PrivateDeclareFunction SetWindowPos Lib "user32" (ByVal hwnd AsLong, _

          ??????????????? ByVal hWndInsertAfter AsLong, ByVal x AsLong, ByVal y AsLong, _

          ??????????????? ByVal cx AsLong, ByVal cy AsLong, ByVal wFlags AsLong) AsLong

          ---- hWnd變?cè)谴翱诘木浔?;x,y是窗口的左上角的坐標(biāo);cx、cy是窗口寬度和高度;hWndInsertAfter變?cè)谴翱谇鍐沃衕Wnd窗口前面的窗口句柄,有四個(gè)可選值:
          序號(hào) 可 選 值 作 用
          1 HWND_BOTTOM 把窗口放在窗口清單的底部
          2 HWND_TOP 把窗口放在窗口清單的字符順序的頂部
          3 HWND_TOPMOST 把窗口放在窗口清單的頂部
          4 HWND_NOTOPMOST 把窗口放在窗口清單的頂部,最上層窗口之下
          ---- WFlags變?cè)獮檎椭担邪藗€(gè)可選值:
          序號(hào) 可 選 值 作用
          1 SWP_DRAWFRAME 在窗口周?chē)?huà)一個(gè)方框
          2 SWP_HIDEWINDOW 隱藏窗口
          3 SWP_NOACTIVATE 不激活窗口
          4 SWP_NOMOVE 保持窗口當(dāng)前位置
          5 SWP_NOREDRAW 窗口不自動(dòng)重畫(huà)
          6 SWP_NOSIZE 保持窗口當(dāng)前尺寸
          7 SWP_NOZORDER 保持窗口在窗口清單中的當(dāng)前位置
          8 SWP_SHOWWINDOW 顯示窗口

          ??? PrivateDeclareFunction SetWindowPos Lib "user32" (ByVal hwnd AsLong, _

          ??????????????????? ByVal hWndInsertAfter AsLong, ByVal x AsLong, ByVal y AsLong, _

          ??????????????????? ByVal cx AsLong, ByVal cy AsLong, ByVal wFlags AsLong) AsLong

          ??? PrivateConst SWP_NOMOVE = 2

          ??? PrivateConst SWP_NOSIZE = 1

          ??? PrivateConst FLAGS = SWP_NOMOVE Or SWP_NOSIZE

          ??? PrivateConst HWND_TOPMOST = -1

          ??? PrivateConst HWND_NOTOPMOST = -2

          ?

          ??? PrivateSub Command1_Click()

          ??????? '把窗體放在最前面:

          ??????? res% = SetWindowPos(Form1.hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)

          ??? EndSub

          ?

          ??? PrivateSub Command2_Click()

          ??????? '使窗體恢復(fù)普通模式:

          ??????? res% = SetWindowPos(Form1.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)

          ??? EndSub

          ?

          ?

          VB.NET中,太簡(jiǎn)單了!系統(tǒng)為窗體提供了TopMost屬性,我們將TopMost屬性設(shè)置為T(mén)rue,就實(shí)現(xiàn)了Allways On Top 的功能,要取消此功能,設(shè)置為False即可。

          ??? PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load

          ??????? Me.TopMost = True

          EndSub

          ?

          3、???????????? 窗體透明度漸變效果

          我們還是來(lái)看一下在VB6中的實(shí)現(xiàn),VB6中實(shí)現(xiàn)(借助API函數(shù)SetLayeredWindowAttributes)

            使用這個(gè)函數(shù),可以輕松的控制窗體的透明度。按照微軟的要求,透明窗體在創(chuàng)建時(shí)應(yīng)使用WS_EX_LAYERED參數(shù)(用CreateWindowEx),或者在創(chuàng)建后設(shè)置該參數(shù)(用SetWindowLong),我選用后者。

          SetLayeredWindowAttributes函數(shù),其中hwnd是透明窗體的句柄,crKey為顏色值,bAlpha是透明度,取值范圍是[0,255],dwFlags是透明方式,可以取兩個(gè)值:當(dāng)取值為L(zhǎng)WA_ALPHA時(shí),crKey參數(shù)無(wú)效,bAlpha參數(shù)有效;當(dāng)取值為L(zhǎng)WA_COLORKEY時(shí),bAlpha參數(shù)有效而窗體中的所有顏色為crKey的地方將變?yōu)橥该鳌?b style="mso-bidi-font-weight: normal">

          ??? Const LWA_COLORKEY = &H1

          ??? Const LWA_ALPHA = &H2

          ??? Const GWL_EXSTYLE = (-20)

          ??? Const WS_EX_LAYERED = &H80000

          ??? PrivateDeclareFunction GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd AsLong, ByVal nIndex AsLong) AsLong

          ??? PrivateDeclareFunction SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd AsLong, ByVal nIndex AsLong, ByVal dwNewLong AsLong) AsLong

          ??? PrivateDeclareFunction SetLayeredWindowAttributes Lib "user32" (ByVal hWnd AsLong, ByVal crKey AsLong, ByVal bAlpha AsByte, ByVal dwFlags AsLong) AsLong

          ??? PrivateSub Form_Load()

          ??????? Dim Ret AsLong

          ??????? 'Set the window style to 'Layered'

          ??????? Ret = GetWindowLong(Me.hWnd, GWL_EXSTYLE)

          ??????? Ret = Ret Or WS_EX_LAYERED

          SetWindowLong Me.hWnd, GWL_EXSTYLE, Ret

          ??????? 'Set the opacity of the layered window to 128

          ??????? '我們可以設(shè)置這個(gè)數(shù)值來(lái)控制透明程度

          ??????? SetLayeredWindowAttributes Me.hWnd, 0, 128, LWA_ALPHA

          ??? EndSub

          ?

          ?

          ?

          VB.NET中,太簡(jiǎn)單了!系統(tǒng)為窗體提供了Opacity屬性,來(lái)確定窗體的不透明和透明程度,0%為透明,100%為不透明。

          以下程序通過(guò)循環(huán)顯示窗體的透明度過(guò)程,為了讓大家看清楚其變化,在循環(huán)過(guò)程中使用了System.Threading.Thread.Sleep來(lái)停頓。

          ?

          ???? PrivateSub button1_Click(ByVal sender As System.Object, _

          ???????????? ByVal e As System.EventArgs) Handles button1.Click

          ??????? '窗體的透明度漸變過(guò)程

          ??????? button1.Enabled = False

          ??????? Dim I AsDouble

          ??????? For I = 0.01 To 1 Step 0.01

          ??????????? Me.Opacity = I

          ??????????? System.Windows.Forms.Application.DoEvents()

          ??????????? System.Threading.Thread.Sleep(5)

          ??????? Next

          ??????? Me.Opacity = 1

          ??????? button1.Enabled = True

          EndSub

          ?

          4、???????????? 使窗體右上角的X無(wú)效,禁止Alt+F4關(guān)閉窗體

          在特殊窗體的應(yīng)用中,我們有時(shí)需要把窗體右上角標(biāo)題欄上的關(guān)閉按鈕屏幕,當(dāng)用戶(hù)點(diǎn)擊其它地方(比如說(shuō)一個(gè)Button)退出,那我們?cè)趺醋瞿???o:p>

          ?

          我們還是來(lái)看一下在VB6中的實(shí)現(xiàn),VB6中實(shí)現(xiàn)(借助API函數(shù))

          ??? PrivateDeclareFunction GetSystemMenu Lib "user32" (ByVal hwnd AsLong, ByVal bRevert AsLong) AsLong

          ??? PrivateDeclareFunction GetMenuItemCount Lib "user32" (ByVal hMenu AsLong) AsLong

          ??? PrivateDeclareFunction DrawMenuBar Lib "user32" (ByVal hwnd AsLong) AsLong

          ??? PrivateDeclareFunction RemoveMenu Lib "user32" (ByVal hMenu AsLong, ByVal nPosition AsLong, ByVal wFlags AsLong) AsLong

          ??? Const MF_BYPOSITION = &H400&

          ??? Const MF_REMOVE = &H1000&

          ??? PrivateSub Form_Load()

          ??????? Dim hSysMenu AsLong, nCnt AsLong

          ??????? ' Get handle to our form's system menu

          ??????? ' (Restore, Maximize, Move, close etc.)

          ??????? hSysMenu = GetSystemMenu(Me.hwnd, False)

          ?

          ??????? If hSysMenu Then

          ??????????? ' Get System menu's menu count

          ??????????? nCnt = GetMenuItemCount(hSysMenu)

          ??????????? If nCnt Then

          ???? ???????????' Menu count is based on 0 (0, 1, 2, 3...)

          ??????????????? RemoveMenu hSysMenu, nCnt - 1, MF_BYPOSITION Or MF_REMOVE

          ??????????????? RemoveMenu hSysMenu, nCnt - 2, MF_BYPOSITION Or MF_REMOVE ' Remove the seperator

          ??????????????? DrawMenuBar(Me.hwnd)

          ??????????????? ' Force caption bar's refresh. Disabling X button

          ??????????????? Me.Caption = "Try to close me!"

          ??????????? EndIf

          ??????? EndIf

          EndSub

          ?

          '如果還要屏蔽Alt+F4,加上

          ??? PrivateSub Form_QueryUnload(ByVal Cancel AsInteger, ByVal UnloadMode AsInteger)

          ??????? Cancel = 1

          ??? EndSub

          ?

          VB.NET中,這次需要借助API了,因?yàn)橄到y(tǒng)沒(méi)有提供這樣的類(lèi),這個(gè)例子,同時(shí)給大家提供了一個(gè)API的使用范例。(因?yàn)橄到y(tǒng)類(lèi)庫(kù)包裝了絕大部分API,所以不推薦使用)

          以下是VB.NET的代碼:

          ??? 'API聲明

          ??? PrivateDeclareFunction GetSystemMenu Lib "User32" (ByVal hwnd AsInteger, ByVal bRevert AsLong) AsInteger

          ??? PrivateDeclareFunction RemoveMenu Lib "User32" (ByVal hMenu AsInteger, ByVal nPosition AsInteger, ByVal wFlags AsInteger) AsInteger

          ??? PrivateDeclareFunction DrawMenuBar Lib "User32" (ByVal hwnd AsInteger) AsInteger

          ??? PrivateDeclareFunction GetMenuItemCount Lib "User32" (ByVal hMenu AsInteger) AsInteger

          ??? PrivateConst MF_BYPOSITION = &H400&

          ??? PrivateConst MF_DISABLED = &H2&

          ?

          ??? PrivateSub disableX(ByVal wnd As Form)

          ??????? Dim hMenu AsInteger, nCount AsInteger

          ???? ???'得到系統(tǒng)Menu

          ??????? hMenu = GetSystemMenu(wnd.Handle.ToInt32, 0)

          ??????? '得到系統(tǒng)Menu的個(gè)數(shù)

          ??????? nCount = GetMenuItemCount(hMenu)

          ??????? '去除系統(tǒng)Menu

          ??????? Call RemoveMenu(hMenu, nCount - 1, MF_BYPOSITION Or MF_DISABLED)

          ??????? '重畫(huà)MenuBar

          ??????? DrawMenuBar(Me.Handle.ToInt32)

          ??? EndSub

          ?

          ??? PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load

          ??????? '使用X不能用

          ??????? disableX(Me)

          ??? EndSub

          ?

          ??? PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

          ??????? '關(guān)閉窗口

          ??????? Me.Close()

          EndSub

          ?

          ??? '如果還要屏蔽Alt+F4,加上

          ??? ProtectedOverridesSub WndProc(ByRef m As System.Windows.Forms.Message)

          ??????? Dim SC_CLOSE AsInteger = 61536

          ??????? Dim WM_SYSCOMMAND AsInteger = 274

          ??????? '判斷是系統(tǒng)消息,是不是關(guān)閉窗體,使Alt+F4無(wú)效

          ??????? If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32 = SC_CLOSE Then

          ??????????? ExitSub

          ??????? EndIf

          ??????? MyBase.WndProc(m)

          ??? EndSub

          ?

          ?

          程序運(yùn)行的結(jié)果如下:

          5、????????????? 無(wú)標(biāo)題欄的窗體的拖動(dòng)問(wèn)題

          在特殊窗體的應(yīng)用中,我們有時(shí)需要把窗體的標(biāo)題欄屏蔽掉,以窗體換上自己的外殼。是,當(dāng)去掉了窗體標(biāo)題欄后,移動(dòng)窗體就成了一個(gè)問(wèn)題。

          我們還是來(lái)看一下在VB6中的實(shí)現(xiàn),VB6中實(shí)現(xiàn)(借助API函數(shù)SendMessage

          在設(shè)計(jì)時(shí)將窗體的BorderStyle屬性設(shè)置為0-none

          ??? PrivateDeclareFunction SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd AsLong, ByVal wMsg AsLong, ByVal wParam AsLong, ByVal lParam As Any) AsLong

          ??? PrivateDeclareSub ReleaseCapture Lib "User32" ()

          ??? Const WM_NCLBUTTONDOWN = &HA1

          ??? Const HTCAPTION = 2

          Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

          ??????? Dim lngReturnValue AsLong

          ??????? If Button = 1 Then

          ??????????? 'Release capture

          ??????????? Call ReleaseCapture()

          ??????????? 'Send a 'left mouse button down on caption'-message to our form

          ??????????? lngReturnValue = SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)

          ????? ??EndIf

          ??? EndSub

          ??? PrivateSub Form_Paint()

          ??????? Me.Print("Click on the form, hold the mouse button and drag it")

          ??? EndSub

          ?

          ?

          VB.NET中,這次需要借助API SendMessage 了

          在設(shè)計(jì)時(shí)將Form.FormBorderStyle 屬性設(shè)置為None,然后添加以下代碼:

          ??? DeclareFunction SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd AsInteger, ByVal wMsg AsInteger, ByVal wParam AsInteger, ByVal lParam AsInteger) AsInteger

          ?

          ??? PrivateDeclareSub ReleaseCapture Lib "User32" ()

          ??? Const WM_NCLBUTTONDOWN = &HA1

          ??? Const HTCAPTION = 2

          ?

          ??? PrivateSub Form1_MouseDown(ByVal sender AsObject, ByVal e As System.Windows.Forms.MouseEventArgs) HandlesMyBase.MouseDown

          ??????? ReleaseCapture()

          ??????? SendMessage(Me.Handle.ToInt64, WM_NCLBUTTONDOWN, HTCAPTION, 0)

          EndSub

          ?

          三、結(jié)束語(yǔ)

          以上實(shí)例在Windows 2000,VB6,VS.NET環(huán)境下運(yùn)行通過(guò)。從以上實(shí)例,我們可以看到,以前VB6沒(méi)有的好多屬性和方法,在VB.NET中已經(jīng)提供了出來(lái),而且.NET提供了許多類(lèi)庫(kù),可以完成在VB6中需要借助大量的API才能實(shí)現(xiàn)的操作。比如說(shuō)構(gòu)建一個(gè)多線程應(yīng)用程序,用VB.NET就很容易了!更值得一提的就是,VB.NET是完全的面向?qū)ο?,更加容易封裝我們的業(yè)務(wù)邏輯,構(gòu)建N層應(yīng)用程序等企業(yè)級(jí)應(yīng)用。我愛(ài)VB6,更愛(ài).NET!

          ?


          posted on 2006-06-29 14:49 天外飛仙 閱讀(630) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): .net
          主站蜘蛛池模板: 张家界市| 临高县| 安顺市| 淮滨县| 东安县| 漠河县| 得荣县| 安庆市| 从化市| 锡林浩特市| 怀仁县| 南华县| 霍林郭勒市| 东兰县| 雷波县| 紫云| 高邑县| 邳州市| 宿松县| 磐石市| 泰和县| 梧州市| 张家界市| 濮阳县| 宿松县| 顺义区| 西畴县| 赤壁市| 安新县| 牟定县| 莲花县| 思茅市| 增城市| 广宗县| 咸宁市| 亚东县| 乌兰浩特市| 安塞县| 鄂托克旗| 封开县| 伊宁县|