none
UI 設計的問題(VB2005) RRS feed

  • 問題

  • 各位應該有用過 excel 的 text to columns 的功能吧

    請問如果想做一個類似那個功能裏面把txt檔讀進來

    並且可以讓使用者點選指定文字position的UI

    請問我該用什麼user control 比較容易做到 

     

    看來這好像不太好做

    那再請問一下有人知道如何可以做到 Textbox裏的字大小都一樣

    不管是 iii 或是 www 所占的位置都一樣太

     

    例如

     iiiii

     WWWWW

    像這樣一樣是五個字元 w就比 i 來得長

    有可能做到一樣長嗎

    2007年5月23日 下午 02:12

解答

  • 那是字型的問題。

     

    每個字型對每個字的寬度定義都不一樣,例如:

     

    • Microsoft Visual Studio 2005 (Arial)
    • Microsoft Visual Studio 2005 (Times New Roman)
    • Microsoft Visual Studio 2005 (Verdana)

    目前已知道英文字母有固定寬度的字型,只有程式碼字型而已,例如 Courier New。

    連中文字型也只有在中文字上會有固定寬度,在符號和英文字則沒有。

     

    Visual Studio 2005 預設是細明體字型,是不可能對齊的,我都改成 Courier New 才可以對齊。

    2007年5月25日 上午 02:12
    版主

所有回覆

  • hi  你好  你下面說的那個問題,跟我在別篇回的解決方法一樣,

    就是用css下去控制針對i 這個字元做間距,當然如果說你對每一個比較短的字,像jjjjj iiiii  lllll

    每一個都要做css,這樣很麻煩喔,你是有什麼需求要做到讓使用者輸入在textbox的字可以一樣長ㄚ??

    2007年5月25日 上午 12:38
  •  

    馬小玲

    感謝你的回覆

    不好意思 我沒說清楚 我做的是windows appliction 不是web

     

    其實是要做一個像是文字編輯的畫面

    字對齊使用者比較好看

     

    你看一般的文字編輯器

    幾乎都是對齊的 例如 windows 裏的記事本 , 或是我們在寫程式的 VS 2005

    所以我才想說這應該是很容易做到

    希望大家給個方向或參考

    2007年5月25日 上午 01:38
  • 那是字型的問題。

     

    每個字型對每個字的寬度定義都不一樣,例如:

     

    • Microsoft Visual Studio 2005 (Arial)
    • Microsoft Visual Studio 2005 (Times New Roman)
    • Microsoft Visual Studio 2005 (Verdana)

    目前已知道英文字母有固定寬度的字型,只有程式碼字型而已,例如 Courier New。

    連中文字型也只有在中文字上會有固定寬度,在符號和英文字則沒有。

     

    Visual Studio 2005 預設是細明體字型,是不可能對齊的,我都改成 Courier New 才可以對齊。

    2007年5月25日 上午 02:12
    版主
  • 後面下半部:

     

    換字型。

    若包含中文選擇細明體(非新細明體)

    一般英語系軟體使用:Courier New

    2007年5月25日 上午 02:13
    版主
  •  璉璉 寫信:

    後面下半部:

     

    換字型。

    若包含中文選擇細明體(非新細明體)

    一般英語系軟體使用:Courier New

     

    真的是字型的問題,我改了就ok 了

    真是感謝,我原先還以為有什麼屬性可以改呢?找了半天都找不到

     

    那請問上半部的問題 有人有任何的idea 嗎

    討論一下吧

    2007年5月25日 上午 03:42
  • 沒看懂上半部在寫麼。
    2007年5月25日 上午 03:59
    版主
  •  璉璉 寫信:
    沒看懂上半部在寫麼。

     

     

    ~.~lll

    拍謝啦

    原來是我表達不好,其實我也不太知道要怎麼描述

     

    我的意思是如果想做一個類似excel裏面text to column(資料>>資料剖析) 的功能

    把一個文字檔(.txt)檔讀進來

    並且可以讓使用者點選要切割文字的position類似那樣的使用者介面

    請問我該用什麼user control 比較容易做到 

     (可能描述的還是不清楚,或許你可以開一下excel 的 資料剖析功能你就會了解我的意思了)

     

     

     

    2007年5月25日 上午 05:18
  • 那個要自己畫吧~

    純粹用控制項是做不出來的。

    2007年5月25日 上午 06:21
    版主
  •  璉璉 寫信:

    那個要自己畫吧~

    純粹用控制項是做不出來的。

     

     

    ...無言

     

    真的這麼難搞?

    好吧  那我就來畫看看不畫不畫的出來

    2007年5月25日 上午 07:15
  • 如果你說的是資料剖析精靈的話,可以用 DataGridView 來做預覽,但分割功能你得要自己做,還有使用 DataGridView 調整的部份你也要自己做。
    2007年5月25日 上午 09:07
    版主
  •  

    你好 請問一下我對CreateGraphics不太了解

     

    我在自己做了一個calss  Inherits System.Windows.Forms.RichTextBox

     

    我也寫了一個onpaint 的sun

    Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(pe)
            drawAllLines()
            'Add your custom paint code here
        End Sub

     

     Public Sub drawAllLines()
            Dim all As Collections.ICollection = myLines.Values
            If IsNothing(g) Then
                g = Me.CreateGraphics()
            End If
            For Each Item As MyLine In all
                g.DrawLine(Pens.Black, MyLine.getDrewX(Item.x1), Item.y1, MyLine.getDrewX(Item.x2), Item.y2)
                Console.WriteLine("DrawLine " & Item.toString)
            Next
        End Sub

     

    當我 抓到 MouseDown event 的時候我也會去call drawAllLines() 這個function

     

    所以只要我點一下 RichTextBox 就會劃一條線

     

    但是當我抓這個 usercontrol 放到一個 form 上面就出現問題了

     

    點一下還是會劃線 但是當form 最小化在最大化是 所有的線都會不見

    但我點了一下RichTextBox  之前劃的線又會劃出來
     

     請問這是什麼原因造成的 可以幫幫我嗎

    2007年5月29日 上午 03:47
  • Graphics 不要從 Me 去建立,pe 本身內含,所以請把 Graphics 當成引數傳給你的 DrawAllLines 。

    ex.

    Dim g As Drawing.Graphics = pe.Graphics

    drawAllLines(g)

     

    若你是要做 Excel 資料剖析,直接繼承 RichTextBox 並不好用,因為控制項不能畫到自己以外,我比較偏向建議你用使用者控制項來做,托拉一個 RichTextBox 後,在控制項左方及上放保留空間來畫行號、欄位,並直接把箭線疊上去。

    2007年5月29日 上午 04:06
    版主
  • 後半段那個縮放不見的原因先前答過了:

    回覆:關於繪圖 

     

    在控制項這部份,我自己目前的作法是仿照 VB6 ,先設計一個 Shape 使用者控制項,利用 Type 來決定是線、矩形或橢圓,在該控制項的 ReSize 事件呼叫 Me.Refresh,由 Me.Refresh 去觸發 OnPaint 事件,這樣才能在畫面上針對畫出來的圖形做其他動作。

    再把這個控制項放到其他控制項內,比如說你可以做個 Line 控制項,動態新增到你現在這個控制項,你才能方便的托拉分隔線。

    2007年5月29日 上午 04:18
    版主
  •  

    其實我有把他放到我的drawAllLines(g)這個function放到

    form的paint event 中了

    我有做console.WriteLine()

    也確定有重劃所有的線了

    但是畫面上並沒有看到,

    剛剛發現好像是劃上去了 但又被清掉了

     

     

    關於這個

    Graphics 不要從 Me 去建立,pe 本身內含,所以請把 Graphics 當成引數傳給你的 DrawAllLines 。

    ex.

    Dim g As Drawing.Graphics = pe.Graphics

    drawAllLines(g)

     

    可是我在form 的 paint event 所拿到的 pe.Graphics 傳到 drawAllLines(g) 這個function對嗎?

    我是要劃在richtextbox 上,所以我才沒傳給drawAllLines() 而是在drawAllLines() 裏面用 Me.CreateGraphics()  (因為這個function 是寫在我繼承的RichTextBox裏)

     

    另外請問

     

    onpaint 這個function 什麼時候才會執行到

     

    我Overrides rithtextbox 的這個function 但在debug 的情況設一個breakpoint

    發現程式好像都沒跑進這個function 過

     

    2007年5月29日 上午 06:00
  •  璉璉 寫信:

    後半段那個縮放不見的原因先前答過了:

    回覆:關於繪圖 

     

    在控制項這部份,我自己目前的作法是仿照 VB6 ,先設計一個 Shape 使用者控制項,利用 Type 來決定是線、矩形或橢圓,在該控制項的 ReSize 事件呼叫 Me.Refresh,由 Me.Refresh 去觸發 OnPaint 事件,這樣才能在畫面上針對畫出來的圖形做其他動作。

    再把這個控制項放到其他控制項內,比如說你可以做個 Line 控制項,動態新增到你現在這個控制項,你才能方便的托拉分隔線。

     

    你的意思是把線做成一個控制項而不要只記座標一條一條重劃嗎?

    那請問如何做一個 " 一個 Shape 使用者控制項,利用 Type 來決定是線、矩形或橢圓,在該控制項的 ReSize 事件呼叫 Me.Refresh,由 Me.Refresh 去觸發 OnPaint 事件 " ?

    可以給我一個簡單的範例嗎

    或是我要去那裏找相關的資料

    2007年5月29日 上午 06:14
  • 併上篇,我自己是這樣做:

     

    Shape 部份程式碼

    Protected Overrides Sub OnPaint(ByVal pevent As PaintEventArgs)

         Dim grfx As Drawing.Graphics = pevent.Graphics

         Dim lp As Drawing.Pen = Border.CreatePen()

         Dim rect As Drawing.Rectangle = GetShowRect()

         Select Case m_Type

         End Select

    End Sub

     

    Private Sub Shape_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize

         Me.Refresh()

    End Sub

     

    比如說當 Type = Rect 時,表示使用方框,就可以用來做圖形縮放的框線處理。

     

    註:作成使用者控制項適用於總數較小的情況,以前碰過跑到 400 個左右就會發生記憶體不足。

     

    2007年5月29日 上午 08:04
    版主
  •  

    璉大 請問一下你這些code 是寫在那裏(Shape?)

    是寫在 usercontrol 還是customer control

    我實在搞不太懂

    usercontrol 跟customer control 有什麼差別

     

    2007年5月29日 上午 08:31
  • Shape 內。上面不是有標記 Shape 部份程式碼 嗎?

    而且有 Shape_ReSize 應該可以看出來吧。

     

    我是用 UserControl ,所以中文叫做使用者控制項。

     

    明確的區分我也分不清楚,我自己是當成完全自己畫用 UserControl ,繼承既有控制項來改是自定控制項。

    2007年5月29日 上午 09:01
    版主
  •  

     

    璉大

    我照你給的方向做了一個使用者控制項

    下面是我的程式碼的link ==> http://61.62.1.248/MyControlLibrary.zip

    看起來大致ok

    但有一個小問題我一直抓不到 可以幫我解答一下嗎

     

    當我點選usercontrol的時候可以自動增加一條線畫面也不會亂跑

    但當我點選的範圍如果是在Richtextbox上的時候 是會自動增加一條線

    但是畫面會移到Richtextbox的最起頭的地方

    這樣使用都就不知道到底有沒有點到了

    可以讓Richtextbox不要亂跑嗎?

     

     

    Code Snippet

       Private Sub RichTextBox_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown, RichTextBox.MouseDown


            Console.WriteLine(Me.Location)
            Console.WriteLine(e.Location)

            Dim x1 As Integer
            x1 = e.Location.X

     


            Dim g As Graphics = RichTextBox.CreateGraphics

            ' 取出字距
            Dim Width As Single = (g.MeasureString("A", RichTextBox.Font).Width)
            Dim Width2 As Single = (g.MeasureString("AA", RichTextBox.Font).Width)
            Dim wordUnit As Integer = CInt(Width2 - Width)
            Dim DrewX As Integer = getDrewX(x1, wordUnit)

            ' 判斷該位置是已有劃線
            If Not Me.Controls.ContainsKey(CStr(DrewX)) Then
                Dim line As New Line
                line.LineType = MyControlLibrary.Line.LineTypeStyle.Vertical
                line.length = Me.Size.Height
                line.Location = New System.Drawing.Point(DrewX, 0)
                line.Name = CStr(DrewX)
                Me.Controls.Add(line)
                line.BringToFront()
                line.Focus()
                line.Select()
                Console.WriteLine("add line" & CStr(line.Location.X))
            End If

        End Sub

     

     

    2007年5月30日 上午 03:24
  • 我看過你的程式碼,控制項沒啥問題,你可能會錯意了。

     

    你在控制項開發模式下測試,並沒有直接拖拉到是窗設計模式,所以你沒注意到下方的捲軸,當你在文字框動作時,捲軸自動轉到作用中的開始位置,也就是文字框的最左邊,並非是控制項的最左邊,所以你的控制項位置並沒有跑,只是那個測試環境自動的視焦轉移,造成你會錯意。

     

    你可以新開一個 Windows Form 專案,再把原先這個專案加進去,會變成解決方案,然後在 Windows Form 裡面測,就不會有控制項專案測試環境的自動視焦轉移的困擾。

    2007年5月30日 上午 08:46
    版主
  •  

    @@---YOU SURE

    哇咧經驗不足就是有差,謝啦

    我來試看看

    2007年5月30日 下午 12:16
  •  璉璉 寫信:

    我看過你的程式碼,控制項沒啥問題,你可能會錯意了。

     

    你在控制項開發模式下測試,並沒有直接拖拉到是窗設計模式,所以你沒注意到下方的捲軸,當你在文字框動作時,捲軸自動轉到作用中的開始位置,也就是文字框的最左邊,並非是控制項的最左邊,所以你的控制項位置並沒有跑,只是那個測試環境自動的視焦轉移,造成你會錯意。

     

    你可以新開一個 Windows Form 專案,再把原先這個專案加進去,會變成解決方案,然後在 Windows Form 裡面測,就不會有控制項專案測試環境的自動視焦轉移的困擾。

     

    璉大

    好像不是你說的那樣

    我開了一個新的專案

    把這個control 放進去一個form裏面

    form 的autoscroll = true (因為這個control 裏的資料可能很長所以我form 設為可以autoscroll)\

    但是當我點到 richtextbox時它還是會一直自動往前跑

    2007年5月30日 下午 01:20
  • ?

    那就把水平捲軸關閉阿...

    2007年5月30日 下午 03:56
    版主
  •  

    ..不行啊

    我就是要開水平軸啊

    因為我做的這個richtextbox可能會很長

    所以form 的水平軸一定要開

     

    有什麼辦法可以讓它點到時不會亂跑嗎

    2007年5月31日 上午 08:23
  •  

    Code Snippet

    Private Sub RichTextBox_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown, RichTextBox.MouseDown


            Console.WriteLine(Me.Location)
            Console.WriteLine(e.Location)

            Dim x1 As Integer
            x1 = e.Location.X

            Dim g As Graphics = RichTextBox.CreateGraphics

            ' 取出字距
            Dim Width As Single = (g.MeasureString("A", RichTextBox.Font).Width)
            Dim Width2 As Single = (g.MeasureString("AA", RichTextBox.Font).Width)
            Dim wordUnit As Integer = CInt(Width2 - Width)
            Dim DrewX As Integer = getDrewX(x1, wordUnit)

            ' 判斷該位置是已有劃線
            If Not Me.Controls.ContainsKey(CStr(DrewX)) Then
                Dim line As New Line
                line.LineType = MyControlLibrary.Line.LineTypeStyle.Vertical
                line.length = Me.Size.Height
                line.Location = New System.Drawing.Point(DrewX, 0)
                line.Name = CStr(DrewX)
                Me.Controls.Add(line)
                line.BringToFront()
                line.Focus()
                line.Select()
                Console.WriteLine("add line" & CStr(line.Location.X))
            End If

        End Sub

     

    我做了一下debug 發現會讓水平軸跑到起始點的原因是Me.Controls.Add(line) 這一行code造成的

    所以我加了  line.Focus() 讓他出現在畫面上 , 的確出現在畫面上了 但是他竟然出現在畫面的最右邊而且他又是一條線

    所以使用者很容易看不到這條線

     

    有什麼方法可以把這個 control Focus 並且移到mouse 的位置
    2007年6月1日 上午 03:23
  •  Ken6558 寫信:

     

    Code Snippet

    Private Sub RichTextBox_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown, RichTextBox.MouseDown


            Console.WriteLine(Me.Location)
            Console.WriteLine(e.Location)

            Dim x1 As Integer
            x1 = e.Location.X

            Dim g As Graphics = RichTextBox.CreateGraphics

            ' 取出字距
            Dim Width As Single = (g.MeasureString("A", RichTextBox.Font).Width)
            Dim Width2 As Single = (g.MeasureString("AA", RichTextBox.Font).Width)
            Dim wordUnit As Integer = CInt(Width2 - Width)
            Dim DrewX As Integer = getDrewX(x1, wordUnit)

            ' 判斷該位置是已有劃線
            If Not Me.Controls.ContainsKey(CStr(DrewX)) Then
                Dim line As New Line
                line.LineType = MyControlLibrary.Line.LineTypeStyle.Vertical
                line.length = Me.Size.Height
                line.Location = New System.Drawing.Point(DrewX, 0)
                line.Name = CStr(DrewX)
                Me.Controls.Add(line)
                line.BringToFront()
                line.Focus()
                line.Select()
                Console.WriteLine("add line" & CStr(line.Location.X))
            End If

        End Sub

     

    我做了一下debug 發現會讓水平軸跑到起始點的原因是Me.Controls.Add(line) 這一行code造成的

    所以我加了  line.Focus() 讓他出現在畫面上 , 的確出現在畫面上了 但是他竟然出現在畫面的最右邊而且他又是一條線

    所以使用者很容易看不到這條線

     

    有什麼方法可以把這個 control Focus 並且移到mouse 的位置

     

    還沒解答但沉了下去 不好意思我推一下希望有人會知道解法

    2007年6月7日 上午 06:53