此处为VisualFreeBasic编程教程(从零开始学或VB进阶)的子章节部分,全部目录点链接。
看到许多漂亮的UI,许多人第一时间想到控件,可是那有人写好东西给你白用啊!
需要个性,需要漂亮,那就需要自己画了。
你所看到的,控件、窗口,等等一切,都是画上去的,可以说,是一笔一划,1个1个画的。
当然还有图片,文字。这一切操作系统给你画了,如果我们自己画,应该从何开始呢?
这就是我要说的,自绘
每个窗口或控件,啥时需要画画,操作系统会通知你,就是
你自己画好后,就返回 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 控件
为了方便使用,系统也为我们提供了自绘控件的方法,此时,我们只负责画画,其它原控件功能不变
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
因国家互联网安全管理要求,关闭回帖功能。大家需要留言,请使用【勇芳软件客服】即时联系勇芳点此打开->>勇芳软件客服