WIN32界面开发之DUI雏形开发(二)

开源一套DUI控件源码 文章目录简介效果图现状分析DDUI控件全景图设计原理Delphi中的UI设计区分“设计时”和“运行时”GDI VS GDI+消息分发皮肤TDUIWinBase容器类控件类Scintilla后续工作联系作者 简介 ETS_DDUI是一套Delphi原生的DUI控件,完全兼容于VCL,开发这套控件的目的是为了改善Delphi程序的界面显示效果。 开源地址 效果图 Demo程序借鉴了360的设计。 此页面是对目前已支持的DUI控件的测试样例。 此页面是表格控件的测试样例。 此页面中展示的控件并不是DUI控 阅读详情

前言:上篇《WIN32界面开发之三:DUI雏形开发(一)》讲解了界面加载框架的创建,但我们的这些控件并没有起到控件的作用,现在还无法响应我们的点击事件和其它事件,所以我们先给我们的框架添加上EVENT事件机制,然后我们再讲解,为什么我们还要加上NOTIFY通知机制,以及如何添加NOTIFY机制。

一、添加EVENT事件机制

基本思想:以通知某个按钮LButtonDown为例,我们首先在HandleMessage()中,截获WM_LBUTTONDOWN消息,然后根据点击位置,找到某个控件,然后发送EVENT消息通知它。在这个控件收到EVNET通知后,然后根据事件类型,重新绘图。这里涉及到几个问题,1:我们如何根据点击位置找到点击的是哪个控件呢?这个问题的解决在FFindCtrlFromPT实现。2:我们发送EVENT消息给控件时,这个消息结构体应该包含哪些内容?,这个问题的解决在下面的EVENT结构体定义。3:在收到EVNET消息以后,我们的控件怎么判断出消息类型呢,这些消息类型就是我们下面要讲的事件类型枚举。

(一)、事件相关定义

1、事件类型枚举

在添加事件之前,我们要先对我们要先枚举出我们所要添加的事件,这些事件也就是我们感兴趣的事件,比如MOUSEENTER、MOUSELEAVE、BUTTONDOWN、DBLCLICK……,记住这些不是给用户看的,只是为了让我们的控件识别用的。只是为了告诉我们的控件现在用户怎么样我们的控件了,我们的控件在绘图上应该怎么样改变!!!比如当MOUSEIN的时候换成另一个背景图,MOUSELEAVE的时候还原原来的背景图。

[cpp]  view plain copy
  1. typedef enum EVENTTYPE_UI  
  2. {  
  3.     UIEVENT__FIRST = 0,  
  4.     UIEVENT_MOUSEMOVE,  
  5.     UIEVENT_MOUSELEAVE,  
  6.     UIEVENT_MOUSEENTER,  
  7.     UIEVENT_MOUSEHOVER,  
  8.     UIEVENT_BUTTONDOWN,  
  9.     UIEVENT_BUTTONUP,  
  10.     UIEVENT_DBLCLICK,  
  11. };  
2、消息结构体定义

[cpp]  view plain copy
  1. typedef struct tagTEventUI  
  2. {  
  3.     int Type;  //消息类型  
  4.     CControlUI* pSender; //发送消息者  
  5.     DWORD dwTimestamp;//时间戳  
  6.     POINT ptMouse;//如果是单双击事件,则传递点击的鼠标位置  
  7.     TCHAR chKey;//如果是按键消息,则传递按下的是哪个键  
  8.     WORD wKeyState;//键状态  
  9.     WPARAM wParam;//WPARAM  
  10.     LPARAM lParam;//LPARAM  
  11. } TEventUI;  
3、FindCtrlFromPT()原理及实现
由于CDialogUI布局范围是整个窗体,所以我们先在CDialogUI中调用FindCtrlFromPT(POINT pt),那FindCtrlFromPT该怎么实现呢,看代码:
[cpp]  view plain copy
  1. CControlUI* CContainerUI::FindCtrlFromPT(POINT pt)  
  2. {  
  3.     if (!::PtInRect(&m_RectItem,pt)) return NULL;///如果不在当前容器内,则直接返回NULL;  
  4.     for( int it = 0; it != m_items.GetSize(); it++ ) {  
  5.         CControlUI* pControl = static_cast<CControlUI*>(m_items[it])->FindCtrlFromPT(pt);  
  6.         if( pControl != NULL ) return pControl;  
  7.     }  
  8.     return CControlUI::FindCtrlFromPT(pt);  
  9.   
  10. }  
大家可以看到,我们是在CContainerUI中实现的(声明为虚函数),并没有在CDialogUI实现,这是因为CContainerUI也是容器类型,他们两个查找子控件的算法是一样的,所以我们只要把FindCtrlFromPT()声明为CContainerUI的虚函数,让CDialogUI去继承就好了,当然了,CDialogUI也可以重写,不过在这里没这个必要。
另外FindCtrlFromPT()的返回值,是看是不是在控件的范围内,所以给CControlUI也应该加上这个函数的定义。

[cpp]  view plain copy
  1. CControlUI* CControlUI::FindCtrlFromPT(POINT pt)  
  2. {  
  3.     if (::PtInRect(&m_RectItem,pt))  
  4.     {  
  5.         return this;  
  6.     }else  
  7.     {  
  8.         return NULL;  
  9.     }  
  10. }  

(二)拦截消息,转发给控件

1、我们先拦截一个吧(WM_LBUTTONDOWN),看代码:
[cpp]  view plain copy
  1. case WM_LBUTTONDOWN:  
  2.     {  
  3.         POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
  4.   
  5.         CControlUI* pControl = m_root->FindCtrlFromPT(pt);//找到点击的控件  
  6.         if( pControl == NULL ) break;  
  7.   
  8.         m_pEventClick=pControl;  
  9.   
  10.         TEventUI event = { 0 };  
  11.         event.Type = UIEVENT_BUTTONDOWN;  
  12.         event.wParam = wParam;  
  13.         event.lParam = lParam;  
  14.         event.ptMouse = pt;  
  15.         event.wKeyState = wParam;  
  16.         event.dwTimestamp = ::GetTickCount();  
  17.         pControl->SetHwnd(GetHWND());///将HWND传递给CControl,用于SendMessage  
  18.   
  19.         pControl->Event(event); //发送消息  
  20.         // We always capture the mouse  
  21.         ::SetCapture(GetHWND());////注意,只有在点在控件内的时候才要SetCapture,否则会造成托动窗口时,会无效,  
  22.         //因为上面用FindCtrlFromPT找到了控件,这时应该让这个控件获得焦点  
  23.     }  
  24.     break;  

讲解:
1、这里的顺序就是:先根据点击的位置,获取点击的控件,然后向控件发送消息,最后让该控件获得焦点
2、这里注意一下,多了一句pControl->SetHwnd(),上节我们讲了控件为什么也要HWND,因为SendMessage(),还记得么,SendMessage的第一个参数,就是我们窗体的HWND。
3、多了个变量,CControlUI *m_pEventClick;这个变量是为了记录当前获取事件的控件,以便WM_LBUTTONUP中发送事件消息。

2、拦截第二个消息(WM_LBUTTONUP)

[cpp]  view plain copy
  1. case WM_LBUTTONUP:  
  2.     {  
  3.         if (m_pEventClick==NULL) break;  
  4.   
  5.         POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
  6.         ::ReleaseCapture();  
  7.         TEventUI event = { 0 };  
  8.         event.Type = UIEVENT_BUTTONUP;  
  9.         event.wParam = wParam;  
  10.         event.lParam = lParam;  
  11.         event.ptMouse = pt;  
  12.         event.wKeyState = wParam;  
  13.         event.dwTimestamp = ::GetTickCount();  
  14.   
  15.         m_pEventClick->Event(event);  
  16.   
  17.         m_pEventClick = NULL;  
  18.     }  
  19.     break;  

(三)控件处理

1、声明变量,标识当前控件状态

[cpp]  view plain copy
  1. UINT m_uButtonState;//按钮状态  
记得初始化为0;

2、添加EVNET()函数

其实是,我们将EVENT()函数,在CControlUI中声明为虚函数,并不具体实现,只留一个接口,现在是在CButtonUI中的具体实现,看代码吧:

[cpp]  view plain copy
  1. void CButtonUI::Event(TEventUI& event)  
  2. {  
  3.     if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_DBLCLICK )  
  4.     {  
  5.         if( ::PtInRect(&m_RectItem, event.ptMouse)) {  
  6.             m_uButtonState |= UISTATE_PUSHED | UISTATE_CAPTURED;  
  7.   
  8.             Invalidate();  
  9.         }  
  10.     }  
  11.     if( event.Type == UIEVENT_MOUSEMOVE )  
  12.     {  
  13.         if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {  
  14.   
  15.             Invalidate();  
  16.         }  
  17.     }  
  18.     if( event.Type == UIEVENT_BUTTONUP )  
  19.     {  
  20.         if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {  
  21.             m_uButtonState &= ~(UISTATE_PUSHED | UISTATE_CAPTURED);  
  22.             Invalidate();  
  23.         }  
  24.     }  
  25.     if( event.Type == UIEVENT_MOUSEENTER)  
  26.     {  
  27.         m_uButtonState |= UISTATE_HOT;  
  28.         Invalidate();  
  29.     }  
  30.     if( event.Type == UIEVENT_MOUSELEAVE)  
  31.     {  
  32.         m_uButtonState &= ~UISTATE_HOT;  
  33.         Invalidate();  
  34.     }  
  35. }  
这部分也没什么难的,就是根据当前不同的状态,给m_uButtonState添加上不同的值,供绘图时判断当前的控件状态。
3、绘图函数(DoPaint)

[cpp]  view plain copy
  1. assert(hDC);  
  2. Graphics graph(hDC);  
  3. if( (m_uButtonState & UISTATE_DISABLED) != 0 ) {  
  4.     graph.FillRectangle(&SolidBrush(Color::Gray),m_RectItem.left,m_RectItem.top,m_RectItem.right-m_RectItem.left,m_RectItem.bottom-m_RectItem.top);  
  5. }  
  6. else if( (m_uButtonState & UISTATE_PUSHED) != 0 ) {  
  7.     graph.FillRectangle(&SolidBrush(Color::Red),m_RectItem.left,m_RectItem.top,m_RectItem.right-m_RectItem.left,m_RectItem.bottom-m_RectItem.top);  
  8. }  
  9. else{  
  10.     graph.FillRectangle(&SolidBrush(Color::Green),m_RectItem.left,m_RectItem.top,m_RectItem.right-m_RectItem.left,m_RectItem.bottom-m_RectItem.top);  
  11. }  
  12.   
  13. graph.ReleaseHDC(hDC);  
讲解:不难理解,就是根据当前不同的控件状态,给按钮绘制不同的颜色。当点击时,是红色,放开时,是绿色。

添加EVENT后,点击任一个按钮,界面如图

二、添加NOTIFY机制

问题提出及解决:试想一下,上面的EVENT机制能够通知我们的控件,当前控件应该处于哪种状态,并完成哪种绘制,但,当用户想点击控件的时候托动窗体,或者在点击控件的时候弹出另一个窗体该怎么办呢????这,就是NOTIFY通知机制,比如当前控件处理BUTTON—DWON的状态时,我们就向用户发送“click”通知消息,又比如,当我们的控件处于"BUTTON-DOWN"同时又具有"MOUSE-MOVE" 状态时,我们就向用户发送“drag”(拖动)通知消息

(一)、抽象与派生

1、通知消息结构体定义

与EVENT相似,要发送通知消息,总是以结构体为单位的,这样能包含的信息多一些,而这里的消息通知的结构体定义围绕着我们感兴趣的几个变量,如消息发送者(控件)、消息类型、时间戳、鼠标信息等,具体定义如下:

[cpp]  view plain copy
  1. typedef struct tagTNotifyUI   
  2. {  
  3.     CStdString sType;  //消息类型  
  4.     CControlUI* pSender;  //发送者  
  5.     DWORD dwTimestamp;//时间戳  
  6.     POINT ptMouse;//鼠标位置  
  7.     WPARAM wParam;//WPARAM  
  8.     LPARAM lParam;//LPARAM  
  9. } TNotifyUI;  
2、接口抽象(INotifyUI)
由于我们的NOTIFY机制是一个功能独立的模块,所以我们把它单独抽象为一个类,定义如下:
[cpp]  view plain copy
  1. class INotifyUI  
  2. {  
  3. public:  
  4.     virtual void Notify(TNotifyUI& msg) = 0;  
  5. };  
如定义可知,这个类只包含一个纯虚函数,Notify(),参数为一个TNotifyUI的结构体
3、派生 (CStartPage)

将我们的窗体类CStartPage派生自INotifyUI,即在声明中添加:

[cpp]  view plain copy
  1. class CStartPage: public CWindowWnd, public INotifyUI  
  2. {  
  3. virtual void Notify(TNotifyUI& msg);  
  4.  };  

记得实现Notify()函数。这个我们就写说个声明,最后我们会写出实现代码。

(二)、发送与接收

我们到底想实现怎么样的功能呢,我就是想只在CStartPage中的Notify中获取当前发送NOTIFY的控件及消息内容,然后处理,所以我们应该在CControlUI中定义一个INotifyUI变量,用来保存CStartPage的this指针,然后在需要发送NOTIFY的地方,直接调用this->Notify(msg)即可,这就是第二部分的实现内容:
一、CContolUI中封装CStartPage的this指针

1、CControlUI中变量定义(INotifyUI *m_pNotifyer;)

因为我们要用的是CStartPage中的Notify函数,所以我们将其声明为它的基类类型,当我们调用m_pNotifyer->Notify(msg)时,根据虚函数的派生关系,就会调用到CStartPage中的Notify()函数了。
我们一般将此类变量封装成parivate类型,所以我们要加一个设置函数,如下:

[cpp]  view plain copy
  1. virtual void SetNotifyer(INotifyUI * pCtrl){m_pNotifyer=pCtrl;}  
2、使用SetNotifyer()
在CStartPage的HandleMessage中,添加SetNotifier(this);,其它代码都是EVENT的

[cpp]  view plain copy
  1. case WM_LBUTTONDOWN:  
  2.     {  
  3.         POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
  4.   
  5.         CControlUI* pControl = m_root->FindCtrlFromPT(pt);  
  6.         if( pControl == NULL ) break;  
  7.   
  8.         m_pEventClick=pControl;  
  9.   
  10.         TEventUI event = { 0 };  
  11.         event.Type = UIEVENT_BUTTONDOWN;  
  12.         event.wParam = wParam;  
  13.         event.lParam = lParam;  
  14.         event.ptMouse = pt;  
  15.         event.wKeyState = wParam;  
  16.         event.dwTimestamp = ::GetTickCount();  
  17.         pControl->SetHwnd(GetHWND());///将HWND传递给CControl,用于SendMessage  
  18.   
  19.         pControl->SetNotifyer(this);  
  20.         pControl->Event(event);  
  21.   
  22.         ::SetCapture(GetHWND());////注意,只有在点在控件内的时候才要SetCapture,否则会造成托动窗口时,会无效,  
  23.         //因为上面用FindCtrlFromPT找到了控件,这时应该让这个控件获得焦点  
  24.     }  
  25.     break;  
  26. case WM_LBUTTONUP:  
  27.     {  
  28.         if (m_pEventClick==NULL) break;  
  29.   
  30.         POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
  31.         ::ReleaseCapture();  
  32.         TEventUI event = { 0 };  
  33.         event.Type = UIEVENT_BUTTONUP;  
  34.         event.wParam = wParam;  
  35.         event.lParam = lParam;  
  36.         event.ptMouse = pt;  
  37.         event.wKeyState = wParam;  
  38.         event.dwTimestamp = ::GetTickCount();  
  39.   
  40.         m_pEventClick->SetNotifyer(this);  
  41.         m_pEventClick->Event(event);  
  42.   
  43.         m_pEventClick = NULL;  
  44.     }  
  45.     break;  
我们再添加一个对消息的响应,大家试想一下,如果我在点击的按钮,然后移动鼠标的话,那应该发送给用户什么消息呢?对,“Drag”消息!!!!所以我们要在CStartPage中拦截WM_MOUSEMOVE消息,代码如下:
[cpp]  view plain copy
  1. case WM_MOUSEMOVE:  
  2.     {  
  3.         POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
  4.   
  5.         CControlUI* pNewHover = m_root->FindCtrlFromPT(pt);  
  6.         TEventUI event = { 0 };  
  7.         event.ptMouse = pt;  
  8.         event.dwTimestamp = ::GetTickCount();  
  9.   
  10.         if( m_pEventClick != NULL ) {  
  11.             event.Type = UIEVENT_MOUSEMOVE;  
  12.             event.pSender = NULL;  
  13.             ::ReleaseCapture();///增加这个  
  14.             m_pEventClick->Event(event);  
  15.         }  
  16.         else if( pNewHover != NULL ) {  
  17.             event.Type = UIEVENT_MOUSEMOVE;  
  18.             event.pSender = NULL;  
  19.             pNewHover->Event(event);  
  20.         }  
  21.     }  
  22.     break;  
二、控件中的发送消息
借助于事件消息,在鼠标按下的时候,发送“click”消息,当同时具有鼠标按下和鼠标移动的状态时,发送“drag”消息
[cpp]  view plain copy
  1. void CButtonUI::Event(TEventUI& event)  
  2. {  
  3.     if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_DBLCLICK )  
  4.     {  
  5.         if( ::PtInRect(&m_RectItem, event.ptMouse)) {  
  6.             m_uButtonState |= UISTATE_PUSHED | UISTATE_CAPTURED;  
  7.   
  8.             TNotifyUI Msg;  
  9.             POINT pt;pt.x=0;pt.y=0;  
  10.             Msg.pSender = this;  
  11.             Msg.sType =_T("click");  
  12.             Msg.wParam = 0;  
  13.             Msg.lParam = 0;  
  14.             Msg.ptMouse =pt;  
  15.             Msg.dwTimestamp = ::GetTickCount();  
  16.             // Allow sender control to react  
  17.             INotifyUI* pNotifier=static_cast<INotifyUI*>(m_pNotifyer);  
  18.             pNotifier->Notify(Msg);  
  19.   
  20.             Invalidate();  
  21.         }  
  22.     }  
  23.     if( event.Type == UIEVENT_MOUSEMOVE )  
  24.     {  
  25.         if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {  
  26.   
  27.             TNotifyUI Msg;  
  28.             POINT pt;pt.x=0;pt.y=0;  
  29.             Msg.pSender = this;  
  30.             Msg.sType =_T("drag");  
  31.             Msg.wParam = 0;  
  32.             Msg.lParam = 0;  
  33.             Msg.ptMouse =pt;  
  34.             Msg.dwTimestamp = ::GetTickCount();  
  35.             // Allow sender control to react  
  36.             INotifyUI* pNotifier=static_cast<INotifyUI*>(m_pNotifyer);  
  37.             pNotifier->Notify(Msg);  
  38.   
  39.             Invalidate();  
  40.         }  
  41.     }  
  42.     if( event.Type == UIEVENT_BUTTONUP )  
  43.     {  
  44.         if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {  
  45.             m_uButtonState &= ~(UISTATE_PUSHED | UISTATE_CAPTURED);  
  46.             Invalidate();  
  47.         }  
  48.     }  
  49.     if( event.Type == UIEVENT_MOUSEENTER)  
  50.     {  
  51.         m_uButtonState |= UISTATE_HOT;  
  52.         Invalidate();  
  53.     }  
  54.     if( event.Type == UIEVENT_MOUSELEAVE)  
  55.     {  
  56.         m_uButtonState &= ~UISTATE_HOT;  
  57.         Invalidate();  
  58.     }  
  59. }  
三、CStartPage中接收Notify消息
这就是对CStartPage的Notify消息的具体实现了,代码如下:
[cpp]  view plain copy
  1. void CStartPage::Notify(TNotifyUI& msg)  
  2. {  
  3.     if (msg.sType==L"click")  
  4.     {  
  5.         //SendMessage(m_hwnd, WM_NCLBUTTONDOWN, HTCAPTION, NULL);  
  6.         //MessageBox(NULL,L"1122",L"cation",MB_OK);  
  7.     }  
  8.     if (msg.sType==L"drag")  
  9.     {  
  10.         SendMessage(GetHWND(), WM_NCLBUTTONDOWN, HTCAPTION, NULL);  
  11.         SendMessage(GetHWND(), WM_LBUTTONUP, NULL, NULL);  
  12.     }  
  13.   
  14. }  
实现的功能,当drag的时候,拖动窗体,当然大家还可以判断发送方是不是Button控件,做进一步识别。
现在的界面如下,在点击按钮的时候可以托动。


本文由HARVIC完成,如若转载,请标明出处,请大家尊重初创者的版权,谢谢!!

源文地址:http://blog.youkuaiyun.com/harvic880925/article/details/9612075

源码地址:http://download.youkuaiyun.com/detail/harvic880925/5837779

声明:感谢金山影音漂亮的界面图片,该图片来自网络

WIN32界面开发之三:DUI雏形开发(二) WIN32界面开发之三:DUI雏形开发(二) 对应源码,对应博客地址:http://blog.youkuaiyun.com/harvic880925/article/details/9612075,转载要标明出处哦!!! 立即下载

相关推荐

WIN32界面开发之三:DUI雏形开发(一) 源码

WIN32界面开发之三:DUI雏形开发(一) 对应源码,博客地址:http://blog.youkuaiyun.com/harvic880925/article/details/9491387,转载请标明出处哦。

Window编程系列之8:DUI控件详解及皮肤切换

我将带领大家学习Windows编程之DUI控件详解及皮肤切换的知识,详细讲解各个控件的使用以及皮肤切换的技术点。本课程包括的内容有页面框架及CPP代码简介、DUI的基本控件、高级控件、扩展控件等,最后讲解DPI比例调整以及皮肤切换等。

PAT|中国大学MOOC-浙江大学翁恺-C语言程序设计习题集(更新中)

##2-0. 整数四则运算 时间限制:400 ms 内存限制:65536 kB 代码长度限制:8000 B 判题程序:Standard 作者:乔林(清华大学) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。 输入格式: 输入在一行中给出2个正整数A和B。 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 输入样例: 3 ...

小鱼波波波 6万+

WIN32界面开发之三:DUI雏形开发(一)

前言:这部分涉及工程比较大,所以我打算分开为两篇来写,第一篇完成基本框架的构建,第二篇添加上EVENT和NOTIFY机制。 完成目标:仿照DirectUI,完成一个基本雏形,开发一个布局控件(Dialog),和一个按钮控件(Button),通过XML来布局窗体,最后按钮响应点击、鼠标移动等事件信息,用户还可以通过NOTIFY机制来定制,用户具体行为时,界面所要做的动作。给大家看下最终界面吧,一个

启舰 1万+

全双工AI语音交互:从原理到实践,构建实时对话系统

语音交互技术正从传统的半双工模式向全双工模式演进,以实现更自然、实时的对话体验。全双工交互的核心原理在于模拟人类电话通话,允许双方同时发送和接收音频流,这需要流式语音识别(Streaming ASR)和实时自然语言理解(Real-time NLU)技术的深度整合。其技术价值在于显著降低交互延迟,支持智能打断(Barge-in),从而提升人机对话的流畅度和自然度。在应用场景上,全双工技术是智能助手、实时翻译、车载语音及无障碍交互等领域的关键突破。本文以微软MAI Realtime等模型为例,探讨如何利用开源技

weixin_33693070的博客 404

利用setEcoMode优化innovus中的ecoAddRepeater批量操作效率

本文详细介绍了在Cadence Innovus工具中,如何利用setEcoMode命令的batchMode参数,显著提升ecoAddRepeater命令在批量插入buffer或inverter时的操作效率。通过合并重复的初始化和数据库更新开销,该模式可将大规模时序修复操作的执行速度提升数倍,并提供了完整的脚本示例与最佳实践,帮助后端设计工程师优化ECO流程。

mango的博客 514

dui框架开发系列:XML解析和界面的动态创建

大家好,我要介绍的所有知识点都是WINCE/windows触摸屏DUI开源框架constvar(点击下载代码)开发过程中遇到的比较有讨论价值的问题。      本文要讨论的是与界面解析加载相关的XML解析和动态创建界面。   XML是directui界面对象配置文件的最好选择,因为它的树形结构很适合描述同样是树形结构的对话框。从XML中可以很清晰的看清界面元素之间的层次关系。同时用XML

3092

避开模板匹配的坑:OpenCVSharp中边缘梯度算法的优化实践

本文深入探讨了OpenCVSharp中边缘梯度算法在模板匹配中的优化实践,解决了传统方法在尺度变化、角度旋转和光照差异下的局限性。通过Sobel算子提取边缘梯度特征,结合轮廓检测和多尺度匹配策略,显著提升了匹配的鲁棒性和准确性。文章还分享了并行计算、内存访问优化等实战技巧,适用于工业检测和自动化识别场景。

http9protocoller的博客 199

WIN32界面开发之DUI雏形开发(一)

前言:这部分涉及工程比较大,所以我打算分开为两篇来写,第一篇完成基本框架的构建,第二篇添加上EVENT和NOTIFY机制。 完成目标:仿照DirectUI,完成一个基本雏形,开发一个布局控件(Dialog),和一个按钮控件(Button),通过XML来布局窗体,最后按钮响应点击、鼠标移动等事件信息,用户还可以通过NOTIFY机制来定制,用户具体行为时,界面所要做的动作。给大家看下最终界面吧,

乱码涅磐的专栏 1015

STM32H743必要外围电路分析

写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO...

Cui_Hongwei的博客 1万+

微电网模型Matlab Simulink,风光储微电网,永磁风机并网仿真,光伏并网仿真,蓄电池仿真

通过探究风光储微电网、永磁风机并网仿真、光伏并网仿真、蓄电池仿真、柴油发电机以及光储微电网和风储微电网等方面的技术,我们可以更好地理解微电网的工作原理和优化方法,从而为微电网的发展做出更大的贡献。微电网模型Matlab Simulink,风光储微电网,永磁风机并网仿真,光伏并网仿真,蓄电池仿真,柴油发电机,光储微电网 风储微电网 Matlab仿真平台搭建的风光储微电网模型,风光柴储微电网,pwm控制,风力发电,光伏发电,微电网并网离网切换,并网孤岛切换,功能强大。永磁风机的并网仿真是一个非常重要的环节。

sjbextz的博客 399

WIN32界面开发之四:CPaintManagerUI类构建

前言:前面我们完成了对DUI雏形的构建,但大家有没有注意到一个问题,我们对消息的处理都是在用户构建的类(CStartPage)中,还有,为了在控件中可以实时刷新,所以每个控件都必须带有一个变量m_hwnd,来保存当前窗体的句柄,而且在每次发送EVENT消息时都要赋值,相当麻烦,所以,我们将这些控件都具有的一些操作和变量,全部都集合起来,封装成一个类,这个类就是CPaintManagerUI

启舰 1万+

Python赋能,洞见先机:构建基于异步爬虫与流处理的实时舆情监控系统

我们将从核心概念入手,逐步搭建一个集。.option("es.resource", "public-opinion-%s" % time.strftime("%Y-%m-%d")) \ # 按日期分索引。| 数据采集层 |----->| 消息队列层 |----->| 流处理与分析层 |----->| 存储与可视化层 |:使用Spark Streaming的状态操作或Flink的CEP库,检测更复杂的模式,如“某关键词的负面舆情在1小时内激增500%”。

2201_76125261的博客 434

SetWindowLong 用法

转自:https://blog.youkuaiyun.com/qing666888/article/details/49682899我们这里主要讲两点用法,一:如何修改窗体样式;二、如何使用GWL_USERDATA保存值;一:修改窗体样式先贴出一段可行的,去掉窗体标题栏的代码:LONG styleValue = ::GetWindowLong(*this, GWL_STYLE); styleValue &...

qq_16334327的博客 713

王者荣耀AI绝悟如何选英雄?

王者荣耀AI绝悟如何选英雄? 【抢射手?抢中单位?「绝悟」在打王者荣耀时是如何选英雄的?】 腾讯 AI Lab 开发的 AI 智能体「绝悟」已让王者峡谷不再只是人类召唤师的竞技场,而且这个 AI 战队在上月底进化成了「完全体」。在一局完整的比赛中,英雄选择阶段是至关重要的(比如五射手或五法师阵容会有官方劝退)。 近日,腾讯 AI Lab 和上海交通大学发布的一篇论文介绍了绝悟的英雄选择策略:Ju...

不断学习,不断进步,提高自己 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

oracle中的reuse,Oracle大表清理truncate .. reuse storage

前言:上篇《WIN32界面开发之三:DUI雏形开发(一)》讲解了界面加载框架的创建,但我们的这些控件并没有起到控件的作用,现在还无法响应我们的点击事件和其它事最近需要清理一张大表,要求不能影响性能。在MySQL里边我们可以通过借助coreutils以及硬链接的方式来最小化I/O,Oracle也可以通过分批次回收空间来最小化I/O,到底如何,下面我们拭目以待。一、TRUNCATE TABLE 语法T...

weixin_28785757的博客 715

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

duilib第四天 2016年6月10日

最近几天状态不好,学习进度很慢,学一天,歇两天,不能这样了,今天开始继续学习duilib 学习添加事件,感谢原作者,通过学习他的文章,感觉对duilib的原理有了更深刻的理解,将博客截录如下: 前言:上篇《WIN32界面开发之三:DUI雏形开发(一)》讲解了界面加载框架的创建,但我们的这些控件并没有起到控件的作用,现在还无法响应我们的点击事件和其它事件,所以我们先给我们的框架添加

FIGHTING!!! 1225

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

5Button的click消息流程(notify消息)

本节研究下当一个 Button 按钮被点击时,消息是如何一步步传输的,并最终被主窗口中的 Notify() 函数处理掉。 通过此,可以清晰的了解 Notify 消息的产生过程及传递过程。

silly的博客 977

Duilib事件处理机制:从按钮点击到复杂交互逻辑实现

在Windows桌面应用开发中,图形用户界面(GUI)的事件处理机制是连接用户操作与程序响应的核心桥梁。作为一款轻量级的DirectUI库,Duilib以其高效的渲染性能和灵活的界面定制能力,在众多桌面应用开发框架中占据一席之地。然而,许多开发者在使用Duilib实现复杂交互时,常常面临事件传递混乱、响应延迟、逻辑耦合度高等问题。本文将系统剖析Duilib的事件处理机制,从最基础的按钮点击事件到复...

gitblog_00885的博客 1089

duilib进阶教程 -- 改进List控件(3)_支持多选+右键菜单(ctrl,shift, 鼠标滑动框选)

看到很多PC客户端的列表都支持多选,比如PP助手,华为网盘,duilib本身UIList却没有此功能的支持,于是想修改一把,完善这方面的劣势,而且相信用到的这个功能的也不少,尤其在开发文件管理相关的功能模块,多选的支持应该是必须的。总结分析:ctrl按下的情况,点击,不会使前一个(一部分)选中项失去选中状态,而只是让当前点击的项改变选中状态,并将焦点移到当前项。抬起时,恢复标识位,右键抬起的话,总结分析:shift按下的情况,点击,是选中一个范围,起始项为焦点所在的项,shift点击的项为结束项。

因热爱而执着,因执着而成功。 979
上一篇: WIN32界面开发之DUI雏形开发(一)
下一篇: GDI+学习及代码总结之------画刷Brush
htt9931
博客等级 码龄24年 43粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值