自繪窗口與自繪控件(VFB教程4-3)

  勇芳 2018-2-19 7510

此處為VisualFreeBasic編程教程(從零開始學或VB進階)的子章節部分,全部目錄點鏈接。

看到許多漂亮的UI,許多人第一時間想到控件,可是那有人寫好東西給你白用??!

需要個性,需要漂亮,那就需要自己畫了。

你所看到的,控件、窗口,等等一切,都是畫上去的,可以說,是一筆一劃,1個1個畫的。

當然還有圖片,文字。這一切操作系統給你畫了,如果我們自己畫,應該從何開始呢?

這就是我要說的,自繪

每個窗口或控件,啥時需要畫畫,操作系統會通知你,就是

QQ截圖20180219140109.jpg

你自己畫好后,就返回 Function=True ,系統就知道你自己畫了,系統就不畫了,

自繪固定模式模版,除了自己畫畫,其它就固定

你也可以不用內存DC,直接畫,但效率低。

需要內存DC類,必須在 FF_AppStart 模塊里加

#include Once  "afx\CMemBmp.inc"

這 ***_WM_PAINT 加

  Dim nDC As hDC                 '控件或窗口的DC 
  Dim ps As PAINTSTRUCT          '繪畫范圍,就是排除被遮擋部分,系統處理,我們只要這么寫就可以了。
  Dim As Long w,h,x,a
  nDC=BeginPaint(hWndForm,@ps) '獲取需要繪畫DC,推薦此方法,繪圖效率高
  FF_Control_GetSize( hWndForm, w, h )
  Dim pMemBmp As CMemBmp = CMemBmp(w,h,nDC,&HFF80FF)  '創建內存DC,先畫內存DC,加速畫畫速度,避免產生閃耀 
  '需要內存DC類,必須在 FF_AppStart 模塊里加   #include Once  "afx\CMemBmp.inc"
  '自己畫畫  ================================
  TextOut1 ( pMemBmp.GetMemDC,10,10,"漂亮的,個性的要自繪")
  TextOut1 ( pMemBmp.GetMemDC,10,40,"自繪固定模式例題")
  '自己畫畫完成 =========================
  BitBlt ndc,0,0,w,h,pMemBmp.GetMemDC,0,0,SrcCopy '將內存DC,輸出到控件
  EndPaint(hWndForm,@ps) '完成繪圖
  Function=True

Dim pMemBmp As CMemBmp = CMemBmp(w,h,目標DC,底色) 

除了畫畫,當然還要使用,就必須處理鼠標事件,但是系統沒提供鼠標移出事件

自繪第2模版,在自定義消息里

Function FORM1_PICTURE1_CUSTOM ( _
                               ControlIndex  As Long,  _     ' 控件數組索引
                               hWndForm      As HWnd, _      ' 窗體句柄
                               hWndControl   As HWnd, _      ' 控件句柄
                               wMsg          As UInteger,  _  ' 消息類型
                               wParam        As wParam, _    ' 第一個消息參數
                               lParam        As lParam   _   ' 第二個消息參數
                               ) As Long
Dim entTrack As tagTRACKMOUSEEVENT
Select Case  wMsg
    Case WM_MOUSELEAVE   '鼠標出窗口
'            鼠標在按鈕 =0
'            鼠標按下=0
            FF_Redraw(hWndControl) '重繪控件
    Case WM_NCHITTEST        '啟用鼠標出窗口檢查 
        entTrack.cbSize=SizeOf(tagTRACKMOUSEEVENT)
        entTrack.dwFlags=TME_LEAVE
        entTrack.hwndTrack=hWndControl
        entTrack.dwHoverTime =HOVER_DEFAULT
        TrackMouseEvent @entTrack  
    Case  WM_ERASEBKGND 
         Function=1  '防止擦除背景
End Select
End Function

以上是,自己控制全部的畫畫和鼠標,數據處理等,一般用在 窗口和 Picture1 控件

為了方便使用,系統也為我們提供了自繪控件的方法,此時,我們只負責畫畫,其它原控件功能不變

QQ截圖20180219141953.jpg

Lits\Combo\Button\ListView\Menu\Static\Tab 系統都為我們提供了自繪接口

下面就說說List,其它的可以看MSDN

需要在控件的父窗口,自定義里

Function FORM1_CUSTOM ( _
                      hWndForm      As HWnd, _      ' 窗體句柄
                      wMsg          As UInteger,  _  ' 消息類型
                      wParam        As wParam, _    ' 第一個消息參數
                      lParam        As lParam   _   ' 第二個消息參數
                      ) As Long
    Dim i      As Long
    Dim c      As Long
    Dim itd    As Long
    Dim rc     As Rect
    Dim lpdis  As DRAWITEMSTRUCT Ptr
    Dim wszTxt As WString * 300
    Dim TEXTMARGIN As Long 
    TEXTMARGIN =AfxScaleX(30) ' 文本左邊的距
    Select Case wMsg
     Case WM_DRAWITEM    ' 在所有者描述的控件中繪制項目
        If wParam = IDC_FORM1_LIST1 Then    ' 控件 ID ,要描繪什么
            lpdis =Cast(Any Ptr, lParam)       ' CBLPARAM 指向 DRAWITEMSTRUCT 結構
            If lpdis->itemID = &HFFFFFFFF Then Exit Function '如果列表為空
            rc = lpdis->rcItem

            Select Case lpdis->itemAction
            Case ODA_DRAWENTIRE, ODA_SELECT '要繪畫消息

                If (lpdis->itemState And ODS_SELECTED) = 0 Then                ' 未選中
                    FillRect lpdis->hDC, @rc, GetSysColorBrush(COLOR_WINDOW)    ' 清晰的背景
                    SetBkColor lpdis->hDC, GetSysColor(COLOR_WINDOW)           ' 文本背景
                    SetTextColor lpdis->hDC, GetSysColor(COLOR_WINDOWTEXT)     ' 文本顏色
                Else                                                            ' 處于選中狀態
                    rc.Right = TEXTMARGIN - 2                                 ' 調整矩形的右邊
                    FillRect lpdis->hDC, @rc, GetSysColorBrush(COLOR_3DFACE)    ' 位圖背景
                    rc.Left = TEXTMARGIN - 2                                  ' 調整左邊的矩形
                    rc.Right = lpdis->rcItem.Right                            ' 和右側的矩形
                    FillRect lpdis->hDC, @rc, GetSysColorBrush(COLOR_HIGHLIGHT) ' "選定"的背景
                    SetBkColor lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)        ' 文本背景
                    SetTextColor lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)  ' 文本顏色
                End If

                ' Get/繪制當前項的文本
                ' 輕微調整文本位置
                 rc.Top +=1
                rc.Left= AfxScaleX(2)
                Dim hicon As  HICON  = LoadIcon(App.hInstance,"IMAGE_COPY") '從資源里加載圖標
                DrawIconEx lpdis->hDC,rc.Left, rc.Top,hicon,16,16,0,0,DI_NORMAL     '描繪圖標
                DestroyIcon hicon                                             '用后,句柄必須銷毀
                rc.Left = TEXTMARGIN
                Dim   ttt(2) As String ={"這是自繪List","在窗口樣式里設置自繪","這里的內容是在屬性里添加的"} '給數組賦值
                DrawText lpdis->hDC, ttt(lpdis->itemID), Len(ttt(lpdis->itemID)), @rc, DT_SINGLELINE Or DT_LEFT Or DT_VCENTER
                Function = True
                Exit Function
            End Select
        End If
   End Select
End Function




因國家互聯網安全管理要求,關閉回帖功能。大家需要留言,請使用【勇芳軟件客服】即時聯系勇芳點此打開->>勇芳軟件客服
返回
聯系勇芳
一个人看的www视频播放中文_2012中文字幕电影_亚洲国产成人高清在线观看_中文字幕天堂最新版在线网