勇芳软件 发表于 2018-2-27 11:00:18

【VFB】自绘窗口与自绘控件(VFB教程4-3)

此处为VisualFreeBasic编程教程(从零开始学或VB进阶)的子章节部分,全部目录点链接。看到许多漂亮的UI,许多人第一时间想到控件,可是那有人写好东西给你白用啊!
需要个性,需要漂亮,那就需要自己画了。你所看到的,控件、窗口,等等一切,都是画上去的,可以说,是一笔一划,1个1个画的。当然还有图片,文字。这一切操作系统给你画了,如果我们自己画,应该从何开始呢?这就是我要说的,自绘每个窗口或控件,啥时需要画画,操作系统会通知你,就是
你自己画好后,就返回 Function=True ,系统就知道你自己画了,系统就不画了,自绘固定模式模版,除了自己画画,其它就固定你也可以不用内存DC,直接画,但效率低。Dim nDC As hDC               '控件或窗口的DC Dim ps As PAINTSTRUCT          '绘画范围,就是排除被遮挡部分,系统处理,我们只要这么写就可以了。
Dim As Long w,h,x,a
nDC=BeginPaint(hWndControl,@ps) '获取需要绘画DC,推荐此方法,绘图效率高
FF_Control_GetSize( hWndControl, 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=TrueDim pMemBmp As CMemBmp = CMemBmp(w,h,目标DC,底色) 除了画画,当然还要使用,就必须处理鼠标事件,但是系统没提供鼠标移出事件
自绘第2模版,在自定义消息里Function FORM1_PICTURE1_CUSTOM ( _                               ControlIndexAs Long,_   ' 控件数组索引
                               hWndForm      As HWnd, _      ' 窗体句柄
                               hWndControl   As HWnd, _      ' 控件句柄
                               wMsg          As UInteger,_' 消息类型
                               wParam      As wParam, _    ' 第一个消息参数
                               lParam      As lParam   _   ' 第二个消息参数
                               ) As Long
Dim entTrack As tagTRACKMOUSEEVENT
Select CasewMsg
    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
    CaseWM_ERASEBKGND
         Function=1'防止擦除背景
End Select
End Function以上是,自己控制全部的画画和鼠标,数据处理等,一般用在 窗口和 Picture1 控件为了方便使用,系统也为我们提供了自绘控件的方法,此时,我们只负责画画,其它原控件功能不变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 lpdisAs 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 AsHICON= 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


海南怪人 发表于 2020-2-18 09:03:27

有没有控件功能改造的?

xiawan 发表于 2022-5-13 16:59:17


非常感谢~~支持~~~
页: [1]
查看完整版本: 【VFB】自绘窗口与自绘控件(VFB教程4-3)