知识杂记





  每个月的流量大多贡献给查资料了,学习果然是件烧钱的事情啊(正经脸)


清空手机谷歌浏览器缓存的二十几个网页,也做一个简单的知识回顾。

使用CImage加载PNG的一般方法

  1. 打开stdafx.h添加#include<atlimage.h>
  2. 定义一个CImage类对象,调用CImage::Load方法装载一个外部图像文件;
  3. 调用CImage::Draw方法绘制图像。

eg.(待测试)

1
2
3
4
5
6
7
8
9
10
CRect rc;
m_picCtrl.GetClientRect(&rc);
SetWindowPos(this, 0, 0, 320, 80, SWP_SHOWWINDOW);
CString strTemp;
strTemp.Format(_T("%d%d"), rc.right, rc.bottom);
CImage image;
image.Load(_T("D:\\1.png"));
CDC* pDc = m_picCtrl.GetWindowDC();//获取设备句柄
image.Draw(pDc->m_hDC, rc);
UpdateWindow();

MFC tab控件

  1. 创建一个对话框,放tab控件,将控件添加变量m_tabCtrl
  2. 再创建两个对话框,修改属性Border:none,Style:Child
  3. 在tabDlg中添加两个对话框类变量

    1
    2
    CDialog1 m_dlg1;
    CDialog2 m_dlg2;
  4. 在tabDlg的OnInitDialog()函数中添加:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CRect rect;
    m_tabCtrl.GetClientRect(&rect);
    rect.top+=20;
    rect.bottom-=1;
    rect.left+1=1;
    rect.right-=2;

    m_tabCtrl.InsertItem(0,"第一页");
    m_tabCtrl.InsertItem(1,"第二页");

    m_dlg1.Create(IDD_DIALOG1,&m_tabCtrl);//或者Create(IDD_DIALOG1,GetDlgItem(IDC_TAB));
    m_dlg2.Create(IDD_DIALOG2,&m_tabCtrl);

    m_dlg1.ShowWindow(&rect);
    m_dlg2.ShowWindow(&rect);

    m_dlg1.ShowWindow(true);
    m_dlg2.ShowWindow(false);
  5. 在tabDlg中添加TCN_SELECHANGE消息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void CtabDlg::OnTcnSelchangeTab1(NMHDR *PNMHDR, LRSULT *pResult)
    {
    switch(m_tabCtrl.GetCurSel())
    {
    case 0:
    m_dlg1.ShowWindow(true);
    m_dlg2.SWP_SHOWWINDOW(false);
    break;
    case1:
    m_dlg1.ShowWindow(false);
    m_dlg2.ShowWindow(true);
    break;
    }
    *pResult = 0;
    }

安全函数

strtok_s
wcstok_s

在MFC对话框中显示html网页

创建对话框时勾选html对话框,添加控件变量m_html;
然后在OnInitDialog()中添加

1
m_html.Navigate("www.baidu.com");

CXImage的使用

另成一篇。

限制只启动一个exe

1
2
3
4
5
if(FindWindow(NULL,"caption")!= 0)
{
MessageBox("程序已运行!");
return;
}

PCE.js

https://jamesfriend.com.au/pce-js/mobile/

MFC复选框

法一:

1
2
CButton* pBtn=(CButton*)GetDlgItem(IDC_CHECK1);
int state = pBtn->GetCheck();

state==0 复选框没有被选中
state==1 复选框被选中
state==2 不确定(只有button有BS_3STATE或BS_AUTO3STATE style时才可用)
设置状态:

1
2
CButton* pBtn=(CButton*)GetDlgItem(IDC_CHECK1);
int state = pBtn->GetCheck(1);

法二:

1
2
3
4
if(BST_CHECKED == IsDlgButtonChecked(IDC_CHECK1))
{
//对应操作
}

使用BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_RADIOBUTTON或BS_3STATE样式创建的按钮的返回值可以是如下值之一:
BST_CHECKED 按钮被选中
BST_UNCHECKED 按钮未被选中
BST_INDETERMINATE 不确定,按钮灰显(只有button有BS_3STATE或BS_AUTO3STATE style时才可用)

法三:
为控件添加BOOL变量m_delete;

1
2
3
4
5
void CTestDlg::DoDataExchange(CDataExchange *pDX)
{
CTestDlg::DoDataExchange(pDX);
DDX_Check(pDX,IDC_CHECK1,m_delete);
}

关于“不允许指针指向不完整的类类型”问题分析

神贴必看,自从看过后,再也没犯过这个错,我不会说脑海里都是作者满满的嘲讽笑声的
http://m.blog.csdn.net/luna84/article/details/50380186

树节点遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Traverse(m_tree, hChild)
{
HTREEITEM hChild = m_tree.GetChildren(hItem);
while(hChild)
{
bool temp=Traverse(m_tree,hChild);
if(temp==true)
{
return true;
}
hChild=m_tree.GetNextSiblingItem(hChild);
}
return false;
}

遍历Vector的几种方法

C++11
法一:

1
2
3
4
for(size_t i=0;i<vec.size();++i)
{
int iTemp = vec[i];
}

法二:

1
2
3
4
for(auto it = vec.begin();it!=vec.end();++it)
{
int iTemp = *it;
}

法三:

1
2
3
4
for(int i:vec)
{
int iTemp = i;
}

法四:

1
2
3
for_each(vec.begin(),vec.end(),[](int i){
int iTemp = i;
});

表达式的副作用

http://www.cnblogs.com/shiguangshuo/p/5236962.html

理解递归

另成一篇。

屏蔽回车和ESE

1
2
3
4
5
6
7
8
9
10
11
12
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
if(pMsg->wParam==VK_RETURN||pMsg->wParam==VK_ESCAPE)
{
return true;
}
}
return CDialogEx::PreTranslateMessage(pMsg);

}

MFC查找特定后缀文件

法一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CFileFind findfile;
CString strPath;
CString strName;
CString strFilePath;
BOOL bRet=findfile.FindFile(strPath+_T("*.txt"));//以.txt为例
if(!bRet)
{
MessageBox(_T("无此文件!"));
}
while(bRet)
{
bRet=findfile.FindNextFile();
strName=findfile.GetFileTitle();
strFilePath=findfile.GetFilePath();
if(//操作)
{
//所需操作;
}
}

法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
vector<CString> fileList;
WIN32_FIND_DATA wfd;
CString sPath=_T("*.txt");
HANDLE hFile=FindFirstFile(sPath.GetBuffer(),&wfd);
if(INVALID_HANDLE_VALUE==hFile)
{
TRACE(_T("不合法!\n"));
return;
}do
{
fileList.push_back(wfd.cFileName);
TRACE("%s\n",wfd.cFileName);
}while(FindNextFile(hFile,&wfd));

使用WIN32_FIND_DATA好像存在内存释放的问题。

为CDHtmlDialog添加滚动条

初始化中添加以下代码即可。

1
SetHostFlags(DOCHOSTUIFLAG_NO3DBORDER|DOCHOSTUIFLAG_DIALOG);

Notepad++ 没有自动补全敲代码好累…

文章目录
  1. 1. 使用CImage加载PNG的一般方法
  2. 2. MFC tab控件
  3. 3. 安全函数
  4. 4. 在MFC对话框中显示html网页
  5. 5. CXImage的使用
  6. 6. 限制只启动一个exe
  7. 7. PCE.js
  8. 8. MFC复选框
  9. 9. 关于“不允许指针指向不完整的类类型”问题分析
  10. 10. 树节点遍历
  11. 11. 遍历Vector的几种方法
  12. 12. 表达式的副作用
  13. 13. 理解递归
  14. 14. 屏蔽回车和ESE
  15. 15. MFC查找特定后缀文件
  16. 16. 为CDHtmlDialog添加滚动条
|