找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2238|回复: 2

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

[复制链接]
发表于 2018-2-27 11:00:18 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×

此处为VisualFreeBasic编程教程(从零开始学或VB进阶)的子章节部分,全部目录点链接。

看到许多漂亮的UI,许多人第一时间想到控件,可是那有人写好东西给你白用啊!

需要个性,需要漂亮,那就需要自己画了。

你所看到的,控件、窗口,等等一切,都是画上去的,可以说,是一笔一划,1个1个画的。

当然还有图片,文字。这一切操作系统给你画了,如果我们自己画,应该从何开始呢?

这就是我要说的,自绘

每个窗口或控件,啥时需要画画,操作系统会通知你,就是

1519020079339837.jpg

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

自绘固定模式模版,除了自己画画,其它就固定

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

  1.   Dim nDC As hDC                 '控件或窗口的DC [/p]  Dim ps As PAINTSTRUCT          '绘画范围,就是排除被遮挡部分,系统处理,我们只要这么写就可以了。
  2.   Dim As Long w,h,x,a
  3.   nDC=BeginPaint(hWndControl,@ps) '获取需要绘画DC,推荐此方法,绘图效率高
  4.   FF_Control_GetSize( hWndControl, w, h )
  5.   Dim pMemBmp As CMemBmp = CMemBmp(w,h,nDC,,&HFF80FF)  '创建内存DC,先画内存DC,加速画画速度,避免产生闪耀
  6.   '需要内存DC类,必须在 FF_AppStart 模块里加   #include Once  "afx\CMemBmp.inc"
  7.   '自己画画  ================================
  8.   TextOut1 ( pMemBmp.GetMemDC,10,10,"漂亮的,个性的要自绘")
  9.   TextOut1 ( pMemBmp.GetMemDC,10,40,"自绘固定模式例题")
  10.   '自己画画完成 =========================
  11.   BitBlt ndc,0,0,w,h,pMemBmp.GetMemDC,0,0,SrcCopy '将内存DC,输出到控件
  12.   EndPaint(hWndForm,@ps) '完成绘图
  13.   Function=True
复制代码

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

除了画画,当然还要使用,就必须处理鼠标事件,但是系统没提供鼠标移出事件

自绘第2模版,在自定义消息里

  1. Function FORM1_PICTURE1_CUSTOM ( _[/p]                               ControlIndex  As Long,  _     ' 控件数组索引
  2.                                hWndForm      As HWnd, _      ' 窗体句柄
  3.                                hWndControl   As HWnd, _      ' 控件句柄
  4.                                wMsg          As UInteger,  _  ' 消息类型
  5.                                wParam        As wParam, _    ' 第一个消息参数
  6.                                lParam        As lParam   _   ' 第二个消息参数
  7.                                ) As Long
  8. Dim entTrack As tagTRACKMOUSEEVENT
  9. Select Case  wMsg
  10.     Case WM_MOUSELEAVE   '鼠标出窗口
  11. '            鼠标在按钮 =0
  12. '            鼠标按下=0
  13.             FF_Redraw(hWndControl) '重绘控件
  14.     Case WM_NCHITTEST        '启用鼠标出窗口检查
  15.         entTrack.cbSize=SizeOf(tagTRACKMOUSEEVENT)
  16.         entTrack.dwFlags=TME_LEAVE
  17.         entTrack.hwndTrack=hWndControl
  18.         entTrack.dwHoverTime =HOVER_DEFAULT
  19.         TrackMouseEvent @entTrack  
  20.     Case  WM_ERASEBKGND
  21.          Function=1  '防止擦除背景
  22. End Select
  23. End Function
复制代码

以上是,自己控制全部的画画和鼠标,数据处理等,一般用在 窗口和 Picture1 控件

为了方便使用,系统也为我们提供了自绘控件的方法,此时,我们只负责画画,其它原控件功能不变

1519021205526322.jpg

Lits\Combo\Button\ListView\Menu\Static\Tab 系统都为我们提供了自绘接口

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

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

  1. Function FORM1_CUSTOM ( _[/p]                      hWndForm      As HWnd, _      ' 窗体句柄
  2.                       wMsg          As UInteger,  _  ' 消息类型
  3.                       wParam        As wParam, _    ' 第一个消息参数
  4.                       lParam        As lParam   _   ' 第二个消息参数
  5.                       ) As Long
  6.     Dim i      As Long
  7.     Dim c      As Long
  8.     Dim itd    As Long
  9.     Dim rc     As Rect
  10.     Dim lpdis  As DRAWITEMSTRUCT Ptr
  11.     Dim wszTxt As WString * 300
  12.     Dim TEXTMARGIN As Long
  13.     TEXTMARGIN =AfxScaleX(30) ' 文本左边的距
  14.     Select Case wMsg
  15.      Case WM_DRAWITEM    ' 在所有者描述的控件中绘制项目
  16.         If wParam = IDC_FORM1_LIST1 Then    ' 控件 ID ,要描绘什么
  17.             lpdis =Cast(Any Ptr, lParam)       ' CBLPARAM 指向 DRAWITEMSTRUCT 结构
  18.             If lpdis->itemID = &HFFFFFFFF Then Exit Function '如果列表为空
  19.             rc = lpdis->rcItem

  20.             Select Case lpdis->itemAction
  21.             Case ODA_DRAWENTIRE, ODA_SELECT '要绘画消息

  22.                 If (lpdis->itemState And ODS_SELECTED) = 0 Then                ' 未选中
  23.                     FillRect lpdis->hDC, @rc, GetSysColorBrush(COLOR_WINDOW)    ' 清晰的背景
  24.                     SetBkColor lpdis->hDC, GetSysColor(COLOR_WINDOW)           ' 文本背景
  25.                     SetTextColor lpdis->hDC, GetSysColor(COLOR_WINDOWTEXT)     ' 文本颜色
  26.                 Else                                                            ' 处于选中状态
  27.                     rc.Right = TEXTMARGIN - 2                                 ' 调整矩形的右边
  28.                     FillRect lpdis->hDC, @rc, GetSysColorBrush(COLOR_3DFACE)    ' 位图背景
  29.                     rc.Left = TEXTMARGIN - 2                                  ' 调整左边的矩形
  30.                     rc.Right = lpdis->rcItem.Right                            ' 和右侧的矩形
  31.                     FillRect lpdis->hDC, @rc, GetSysColorBrush(COLOR_HIGHLIGHT) ' "选定"的背景
  32.                     SetBkColor lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)        ' 文本背景
  33.                     SetTextColor lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)  ' 文本颜色
  34.                 End If

  35.                 ' Get/绘制当前项的文本
  36.                 ' 轻微调整文本位置
  37.                  rc.Top +=1
  38.                 rc.Left= AfxScaleX(2)
  39.                 Dim hicon As  HICON  = LoadIcon(App.hInstance,"IMAGE_COPY") '从资源里加载图标
  40.                 DrawIconEx lpdis->hDC,rc.Left, rc.Top,hicon,16,16,0,0,DI_NORMAL     '描绘图标
  41.                 DestroyIcon hicon                                             '用后,句柄必须销毁
  42.                 rc.Left = TEXTMARGIN
  43.                 Dim   ttt(2) As String ={"这是自绘List","在窗口样式里设置自绘","这里的内容是在属性里添加的"} '给数组赋值
  44.                 DrawText lpdis->hDC, ttt(lpdis->itemID), Len(ttt(lpdis->itemID)), @rc, DT_SINGLELINE Or DT_LEFT Or DT_VCENTER
  45.                 Function = True
  46.                 Exit Function
  47.             End Select
  48.         End If
  49.    End Select
  50. End Function
复制代码




回复

使用道具 举报

发表于 2020-2-18 09:03:27 | 显示全部楼层
有没有控件功能改造的?
回复 赞! 靠!

使用道具 举报

发表于 2022-5-13 16:59:17 | 显示全部楼层

非常感谢~~支持~~~
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-21 21:20 , Processed in 0.033504 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表