这里主要介绍一下如何清洗蛤蜊,不然沙子太多,这美味就无法享受啦。
做法后期补上。。。

阅读全文 »

动态修改控件风格

CStatic* pWndAli = (CStatic*)GetDlgItem(IDC_STATIC_ALIPAY);//WS_EX_DLGMODALFRAME
if (0 == pWndAli->ModifyStyleEx(WS_EX_DLGMODALFRAME, WS_EX_CLIENTEDGE, SWP_DRAWFRAME| SWP_FRAMECHANGED))
{
int iREt = GetLastError();
OutputDebugString(L"modify style failed.\n");
}
pWndAli->Invalidate();

修改字体和颜色

CBrush m_brush;
CFont m_font;

m_font.CreatePointFont(150,"华文行楷");//代表15号字体,华文行楷
m_font.CreatePointFont(270, _T("SimSun"));
m_brush.CreateSolidBrush(RGB(0,255,0));//画刷为绿色

添加WM_CTLCOLOR 消息响应

HBRUSH CYourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if (pWnd->GetDlgCtrlID() == IDC_STATICText)
{
pDC->SetBkColor(RGB(0,255,0));//文字背景色为绿色 需要返回对应颜色画刷,才能填充没有文字的背景
pDC->SetTextColor(RGB(255, 0, 0));//文字为红色
pDC->SelectObject(&m_font);//文字为15号字体,华文行楷
return m_brush; // 需要返回对应颜色画刷,才能画满完全的背景
}
// TODO: Return a different brush if the default is not desired
return hbr;
}

动态修改控件风格

CStatic* pWndAli = (CStatic*)GetDlgItem(IDC_STATIC_ALIPAY);//WS_EX_DLGMODALFRAME
if (0 == pWndAli->ModifyStyleEx(WS_EX_DLGMODALFRAME, WS_EX_CLIENTEDGE, SWP_DRAWFRAME| SWP_FRAMECHANGED))
{
int iREt = GetLastError();
OutputDebugString(L"modify style failed.\n");
}
pWndAli->Invalidate();

修改字体和颜色

CBrush m_brush;
CFont m_font;

m_font.CreatePointFont(150,"华文行楷");//代表15号字体,华文行楷
m_font.CreatePointFont(270, _T("SimSun"));
m_brush.CreateSolidBrush(RGB(0,255,0));//画刷为绿色

添加WM_CTLCOLOR 消息响应

HBRUSH CYourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if (pWnd->GetDlgCtrlID() == IDC_STATICText)
{
pDC->SetBkColor(RGB(0,255,0));//文字背景色为绿色 需要返回对应颜色画刷,才能填充没有文字的背景
pDC->SetTextColor(RGB(255, 0, 0));//文字为红色
pDC->SelectObject(&m_font);//文字为15号字体,华文行楷
return m_brush; // 需要返回对应颜色画刷,才能画满完全的背景
}
// TODO: Return a different brush if the default is not desired
return hbr;
}

一个比较悠久的OCR识别库了,很早就接触过,目前居然还健在,而且还进化了不少。面对人工智能,机器学习的压力,仍然可以表现出色。

阅读全文 »

设置符号等环境

cache会在本地指定目录缓存symbols
SRV指定symbols的库
cache*e:/symbols/;SRV*https://msdl.microsoft.com/download/symbols;*e:/symbols/*F:\1_QtProject\qt1213\H264Video\dmp\

cache*e:/SymbolCache/;SRV*https://msdl.microsoft.com/download/symbols;*e:/symbols/*E:\project\cpp\measure-junmai\x64\Release;

调试dump文件

  1. 设置VC编译选项,勾选生成MAP和Debug Info、Progma Datebase:
  2. 将编译生成的Release目录中的pdb、map文件保存起来,以后调试会用到:
  3. 运行程序,单击确定按钮出现异常后自动重启,并创建一个Log文件夹,里面生成dump文件:
    我们打开WinDbg,设置一下相关路径

A、设置pdb路径(File \ Symbol File Path)
B、设置源代码路径( File \ Source File Path )
C、设置Exe路径( File \ Image File Path )

  1. 用WiinDbg打开dump文件(File \ Open Crash Dump)
  2. 输入命令!analyze -v,等待几秒后会打印出错误信息,函数调用栈如下图:

获取帮助列表

.hh

调试 exe cpu 占用率高

使用 windbg 运行程序
查看线程池 !threadpool
查看哪个线程占用 cpu 时间过多 !runaway

切换线程 0
~0 s

查看栈
!clrstack

波形符(~) 命令显示指定线程或当前进程中的所有线程的信息

操作checkbox

if (pwnd->m_curInfo.isShowFloat)
{
CheckDlgButton(IDC_CHECK_FLOATWINDOW, BST_CHECKED);
}
else
{
CheckDlgButton(IDC_CHECK_FLOATWINDOW, BST_UNCHECKED);
}

if (IsDlgButtonChecked(IDC_CHECK_FLOATWINDOW))
{
// checked
}

MFC radio button

CButton		m_wndBtn;
m_wndBtn.Create(TEXT("Save"),BS_DEFPUSHBUTTON,CRect(0,0,60,22),this,IDC_BTN_WEB_SAVE);

==================================================================
Radio button

保证资源号连续,并且第一个Radio Button的属性中Group被选中即可。


Win32
UINT iRet = IsDlgButtonChecked(IDC_RADIO_ACCEPT);

#define BST_UNCHECKED 0x0000
#define BST_CHECKED 0x0001
#define BST_INDETERMINATE 0x0002
#define BST_PUSHED 0x0004
#define BST_FOCUS 0x0008


Win32
BM_SETCHECK
wParam BST_CHECKED,BST_INDETERMINATE,BST_UNCHECKED
lParam NULL

BOOL CheckRadioButton(
__in HWND hDlg,
__in int nIDFirstButton,
__in int nIDLastButton,
__in int nIDCheckButton
);
If the function succeeds, the return value is nonzero. Otherwise is zero.


MFC
int GetCheckedRadioButton(
int nIDFirstButton,
int nIDLastButton
);
ID of the checked radio button, or 0 if none is selected.


void CheckRadioButton(
int nIDFirstButton,
int nIDLastButton,
int nIDCheckButton
);

// Of the 4 radio buttons, selects radio button 3.
void CMyDlg::OnMarkRadio()
{
CheckRadioButton(IDC_RADIO1, IDC_RADIO4, IDC_RADIO3);
}

操作checkbox

if (pwnd->m_curInfo.isShowFloat)
{
CheckDlgButton(IDC_CHECK_FLOATWINDOW, BST_CHECKED);
}
else
{
CheckDlgButton(IDC_CHECK_FLOATWINDOW, BST_UNCHECKED);
}

if (IsDlgButtonChecked(IDC_CHECK_FLOATWINDOW))
{
// checked
}

MFC radio button

CButton		m_wndBtn;
m_wndBtn.Create(TEXT("Save"),BS_DEFPUSHBUTTON,CRect(0,0,60,22),this,IDC_BTN_WEB_SAVE);

==================================================================
Radio button

保证资源号连续,并且第一个Radio Button的属性中Group被选中即可。


Win32
UINT iRet = IsDlgButtonChecked(IDC_RADIO_ACCEPT);

#define BST_UNCHECKED 0x0000
#define BST_CHECKED 0x0001
#define BST_INDETERMINATE 0x0002
#define BST_PUSHED 0x0004
#define BST_FOCUS 0x0008


Win32
BM_SETCHECK
wParam BST_CHECKED,BST_INDETERMINATE,BST_UNCHECKED
lParam NULL

BOOL CheckRadioButton(
__in HWND hDlg,
__in int nIDFirstButton,
__in int nIDLastButton,
__in int nIDCheckButton
);
If the function succeeds, the return value is nonzero. Otherwise is zero.


MFC
int GetCheckedRadioButton(
int nIDFirstButton,
int nIDLastButton
);
ID of the checked radio button, or 0 if none is selected.


void CheckRadioButton(
int nIDFirstButton,
int nIDLastButton,
int nIDCheckButton
);

// Of the 4 radio buttons, selects radio button 3.
void CMyDlg::OnMarkRadio()
{
CheckRadioButton(IDC_RADIO1, IDC_RADIO4, IDC_RADIO3);
}

安装Open-cv