基本信息
源码名称:c++ duilib 入门实例(opencv)
源码大小:50.31M
文件格式:.rar
开发语言:C/C++
更新时间:2018-07-23
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
// Win32_01.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "Win32_01.h" #include "../DuiLib/UIlib.h" #include <opencv2/core.hpp> #include <opencv2/videoio.hpp> #include <opencv2/highgui.hpp> #include <iostream> #include <stdio.h> using namespace cv; using namespace std; #include <algorithm> #ifdef _DEBUG # ifdef _UNICODE # pragma comment(lib, "../lib/DuiLib_ud.lib") # else # pragma comment(lib, "../lib/DuiLib_d.lib") # endif #else # ifdef _UNICODE # pragma comment(lib, "../lib/DuiLib_u.lib") # else # pragma comment(lib, "../lib/DuiLib.lib") # endif #endif using namespace DuiLib; class CDuiFrameWnd : public CWindowWnd, public INotifyUI { public: CDuiFrameWnd(); ~CDuiFrameWnd(); virtual LPCTSTR GetWindowClassName() const; virtual CDuiString GetSkinFile() { return _T("duilib.xml"); } virtual CDuiString GetSkinFolder() { return _T(""); } virtual void Notify(TNotifyUI & msg); virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT CDuiFrameWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); virtual LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT CDuiFrameWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT CDuiFrameWnd::OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT CDuiFrameWnd::OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT CDuiFrameWnd::OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT CDuiFrameWnd::OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); private: //BOOL IsInStaticControl(CControlUI * pControl); protected: CPaintManagerUI m_PaintManager; CControlUI *m_pHelloBtn; CControlUI *m_pRoot; }; CDuiFrameWnd::CDuiFrameWnd() { m_pRoot = NULL; m_pHelloBtn = NULL; } CDuiFrameWnd::~CDuiFrameWnd() { } //cpp文件 LPCTSTR CDuiFrameWnd::GetWindowClassName() const { return _T("DuiFrameWnd"); } void CDuiFrameWnd::Notify(TNotifyUI & msg) { if (msg.sType == _T("click")) { if (msg.pSender->GetName() == _T("closebtn")) { ::PostQuitMessage(WM_QUIT); } if (msg.pSender->GetName() == _T("btnHello")) { MessageBox(NULL, _T("我是按钮"), _T("点击了按钮"), NULL); Mat frame; //--- INITIALIZE VIDEOCAPTURE VideoCapture cap; // open the default camera using default API cap.open(0); // OR advance usage: select any API backend int deviceID = 0; // 0 = open default camera int apiID = cv::CAP_ANY; // 0 = autodetect default API // open selected camera using selected API cap.open(deviceID apiID); // check if we succeeded if (!cap.isOpened()) { cerr << "ERROR! Unable to open camera\n"; return; } //--- GRAB AND WRITE LOOP cout << "Start grabbing" << endl << "Press any key to terminate" << endl; for (;;) { // wait for a new frame from camera and store it into 'frame' cap.read(frame); // check if we succeeded if (frame.empty()) { cerr << "ERROR! blank frame grabbed\n"; break; } // show live and wait for a key with timeout long enough to show images imshow("Live", frame); if (waitKey(5) >= 0) break; } } } } LRESULT CDuiFrameWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { LONG styleValue = ::GetWindowLong(*this, GWL_STYLE); styleValue &= ~WS_CAPTION; ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); m_PaintManager.Init(m_hWnd);//主窗口类与窗口句柄关联 CDialogBuilder builder; CControlUI* pRoot = builder.Create(_T("layout.xml"), (UINT)0, NULL, &m_PaintManager);//加载XML并动态创建界面无素,与布局界面元素,核心函数单独分析 //注意:CDialogBuilder 并不是一个对话框类 ASSERT(pRoot && "Failed to parse XML"); if (NULL == pRoot)//如果找不到皮肤文件则退出 { MessageBox(NULL, TEXT("Cant not find the skin!"), NULL, MB_ICONHAND); return 0; } m_PaintManager.AttachDialog(pRoot);//附加控件数据到HASH表中……为pRoot作为对话框结点,为其创建控件树 m_PaintManager.AddNotifier(this);//增加通知处理 return 0; } LRESULT CDuiFrameWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT lRes = 0; BOOL bHandled = TRUE; switch (uMsg) { case WM_CREATE: lRes = OnCreate(uMsg, wParam, lParam, bHandled); break; case WM_DESTROY: ::PostQuitMessage(0); bHandled = FALSE; break; case WM_NCHITTEST: lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled); break; case WM_KEYDOWN: if (wParam == VK_ESCAPE) //ESC { Close(); } break; case WM_SIZE: lRes = OnSize(uMsg, wParam, lParam, bHandled); break; case WM_NCACTIVATE: lRes = OnNcActivate(uMsg, wParam, lParam, bHandled); break; case WM_GETMINMAXINFO: lRes = true; OnGetMinMaxInfo(uMsg, wParam, lParam, bHandled); break; case WM_SYSCOMMAND: lRes = OnSysCommand(uMsg, wParam, lParam, bHandled); break; case WM_NCCALCSIZE: lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled); break; default: bHandled = FALSE; break; } if (bHandled) return lRes; if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) != 0) return lRes; return CWindowWnd::HandleMessage(uMsg, wParam, lParam); } LRESULT CDuiFrameWnd::OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; rcWork.Offset(-rcWork.left, -rcWork.top); LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam; lpMMI->ptMaxPosition.x = rcWork.left; lpMMI->ptMaxPosition.y = rcWork.top; lpMMI->ptMaxSize.x = rcWork.right; lpMMI->ptMaxSize.y = rcWork.bottom; bHandled = FALSE; return 0; } LRESULT CDuiFrameWnd::OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (wParam == SC_CLOSE) { bHandled = TRUE; SendMessage(WM_CLOSE); return 0; } #if defined(WIN32) && !defined(UNDER_CE) BOOL bZoomed = ::IsZoomed(*this); LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam); if (::IsZoomed(*this) != bZoomed) { } #else LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam); #endif return lRes; } LRESULT CDuiFrameWnd::OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { return 0; // wParam为TRUE时,返回0将会使窗口的大小变为客户区的大小,也就是说这将把窗口的标题栏、窗口边框移除,只显示客户区 } LRESULT CDuiFrameWnd::OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (::IsIconic(*this)) bHandled = FALSE; return (wParam == 0) ? TRUE : FALSE; } LRESULT CDuiFrameWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { SIZE szRoundCorner = m_PaintManager.GetRoundCorner(); // GetRoundCorner用来获取xml中的Window标签中roundcorner属性值,该值指示圆角的长宽 if (!::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0)) { CDuiRect rcWnd; ::GetWindowRect(*this, &rcWnd); rcWnd.Offset(-rcWnd.left, -rcWnd.top); // rcWnd.right就成为了窗口的宽度了 rcWnd.right ; rcWnd.bottom ; HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy); ::SetWindowRgn(*this, hRgn, TRUE); // 窗口圆角化处理 ::DeleteObject(hRgn); } bHandled = FALSE; return 0; } LRESULT CDuiFrameWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { POINT pt; pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam); ::ScreenToClient(*this, &pt); RECT rcClient; ::GetClientRect(*this, &rcClient); if (!::IsZoomed(*this)) { RECT rcSizeBox = m_PaintManager.GetSizeBox(); // GetSizeBox用来获取xml中Window标签的sizebox属性,该属性指示你的鼠标移动到窗口边框多少个像素会变成指示符(这个指示符表示可以改变窗口大小的指示符) if (pt.y < rcClient.top rcSizeBox.top) { if (pt.x < rcClient.left rcSizeBox.left) return HTTOPLEFT; if (pt.x > rcClient.right - rcSizeBox.right) return HTTOPRIGHT; return HTTOP; } else if (pt.y > rcClient.bottom - rcSizeBox.bottom) { if (pt.x < rcClient.left rcSizeBox.left) return HTBOTTOMLEFT; if (pt.x > rcClient.right - rcSizeBox.right) return HTBOTTOMRIGHT; return HTBOTTOM; } if (pt.x < rcClient.left rcSizeBox.left) return HTLEFT; if (pt.x > rcClient.right - rcSizeBox.right) return HTRIGHT; } RECT rcCaption = m_PaintManager.GetCaptionRect(); // GetCaptionRect用来获取xml中Window标签的caption属性,该属性指示标题栏的大小 if (pt.x >= rcClient.left rcCaption.left && pt.x < rcClient.right - rcCaption.right && pt.y >= rcCaption.top && pt.y < rcCaption.bottom) { CControlUI* pControl = static_cast<CControlUI*>(m_PaintManager.FindControl(pt)); if (pControl && _tcsicmp(pControl->GetClass(), _T("ButtonUI")) != 0 && _tcsicmp(pControl->GetClass(), _T("OptionUI")) != 0) return HTCAPTION; } return HTCLIENT; } int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); //加载XML的时候,需要使用该句柄去定位EXE的路径,才能加载XML的路径 CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() _T("skin")); //定位图片等资源的位置 HRESULT Hr = ::CoInitialize(NULL); if (FAILED(Hr)) return 0; CDuiFrameWnd * duiFrame = new CDuiFrameWnd(); if (duiFrame == NULL) return 0; //#define UI_WNDSTYLE_FRAME (WS_VISIBLE | WS_OVERLAPPEDWINDOW) duiFrame->Create(NULL, _T("测试"), UI_WNDSTYLE_EX_FRAME, WS_EX_WINDOWEDGE); duiFrame->CenterWindow();//将窗口放到桌面中央 duiFrame->ShowWindow(true); CPaintManagerUI::MessageLoop(); ::CoUninitialize(); return 0; }