MFCDialog

通过项目模板MFC App -> Application type -> Dialog based.
日志文件夹

窗口界面资源和类关联

在资源视图打开窗口设计器,设置ID属性,添加控件。一个新的对话框可以通过右击添加类,创建一个关联的C++类。对话框的ID在.h头文件中定义。

#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

日志文件夹

窗口消息映射

头文件中声明宏DECLARE_MESSAGE_MAP,cpp文件中定义分界宏

//.h
DECLARE_MESSAGE_MAP()

//.cpp
BEGIN_MESSAGE_MAP(CDlgExec, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &CDlgExec::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CDlgExec::OnBnClickedButton2)
END_MESSAGE_MAP()

静态文件控件

在窗口资源视图中添加控件,并修改ID,通过右击控件->添加变量关联控件到类中,此步操作会在类的头文件中添加变量,并在cpp文件的DoDataExchange函数中自动关联控件。控件关联后,就可以通过该变量获取或设置控件的文本。

//.h
CStatic m_Text;

//.cpp
void CDlgExec::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_Text, m_Text);
}


BEGIN_MESSAGE_MAP(CDlgExec, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &CDlgExec::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CDlgExec::OnBnClickedButton2)
END_MESSAGE_MAP()


// CDlgExec message handlers


void CDlgExec::OnBnClickedButton1()
{
	// TODO: Add your control notification handler code here
	m_Text.SetWindowTextW(TEXT("Hello World"));
}


void CDlgExec::OnBnClickedButton2()
{
	// TODO: Add your control notification handler code here
	CString str;
	m_Text.GetWindowTextW(str);
	MessageBox(str);
}

日志文件夹

显示图像

控件使用StaticText。

	m_Img.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE);
#define HBMP(filepath,width,height) (HBITMAP) LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width, height,LR_LOADFROMFILE|LR_CREATEDIBSECTION)
	CRect crect;
	m_Img.GetWindowRect(crect);
	m_Img.SetBitmap(HBMP(TEXT("./1.bmp"), crect.Width(), crect.Height())); 

文本编辑框

Multiline
Auto HScroll
Auto VScroll
Horizontal Scroll
Vertical Scroll
Want Return

void CMFCApplication2Dlg::OnOK()
{
	// TODO: Add your specialized code here and/or call the base class

	//CDialogEx::OnOK();
}

void CMFCApplication2Dlg::OnBnClickedButtonCopy2()
{
	// TODO: Add your control notification handler code here
	this->m_edit3 = TEXT("xyz");
	UpdateData(false);
}


void CMFCApplication2Dlg::OnBnClickedButtonCopy3()
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	MessageBox(this->m_edit3);
}

void CMFCApplication2Dlg::OnBnClickedButtonCopy()
{
	// TODO: Add your control notification handler code here
	CString str;
	this->m_CEdit1.GetWindowTextW(str);
	this->m_CEdit2.SetWindowTextW(str);

}

Combo Box

Data=A;B;C;
Sort=FALSE;
Type=Drop List

this->m_CBX.AddString(TEXT("Michael"));
this->m_CBX.AddString(TEXT("Michael2"));
this->m_CBX.AddString(TEXT("Michael4"));
this->m_CBX.SetCurSel(2);
this->m_CBX.DeleteString(3);
this->m_CBX.InsertString(0,TEXT("OK"));

void CMFCApplication2Dlg::OnCbnSelchangeCombo1()
{
	// TODO: Add your control notification handler code here
	int i = this->m_CBX.GetCurSel();
		CString str;
	this->m_CBX.GetLBText(i,str);
	MessageBox(str);
}

List Control

风格

  1. LVS_ICON (0x0000): 大图标,为每个item显示大图标
  2. LVS_SMALLICON (0x0002): 小图标,为每个item显示小图标
  3. LVS_LIST (0x0003): 列表,显示一列带有小图标的item
  4. LVS_REPORT (0x0001): 详细资料,显示item详细资料
  5. LVS_TYPEMASK (0x0003): 通过lStyle &= ~LVS_TYPEMASK;可以清除风格

风格

  • GetWindowLong, SetWindowLong,通过句柄,获取或设置窗口或控件的信息
  • GetExtendedStyle, SetExtendedStyle, 获取或设置控件的扩展风格
  • 正常窗口样式是WS_前缀的,但是列表窗口有一个专属的窗口样式,是LVS_前缀的。

    LONG lStyle; lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style lStyle &= ~LVS_TYPEMASK; //清除显示方式位 lStyle |= LVS_REPORT; //设置style lStyle |= LVS_SHOWSELALWAYS;//选中item一直显示,即使失去焦点,失去焦点后,会变为灰色,但是还是能标识出来。 SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style

    DWORD dwStyle = m_list.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl) dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl) dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件 m_list.SetExtendedStyle(dwStyle); //设置扩展风格

选中和取消选中一行

int nIndex = 0;
//选中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);

获取选中和checkbox状态

m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED;
m_list.GetCheck(i);

POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
	TRACE0("No items were selected!/n");
else
{
	while (pos)
	{
		int nItem = m_list.GetNextSelectedItem(pos);
		TRACE1("Item %d was selected!/n", nItem);
		// you could do your own processing on nItem here
	}
}

获取item的信息

TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_list.GetItem(&lvi);

获取Header

LVCOLUMN lvcol;
char  str[256];
int   nColNum;
CString  strColumnName[4];//假如有4列

nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
{ 
	strColumnName[nColNum] = lvcol.pszText;
	nColNum++;
}

使listctrl中一项可见,即滚动滚动条

m_list.EnsureVisible(i, FALSE);

获取列数

int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();

示例代码

View=Report

CString strHeader[3] = {TEXT("Name"),TEXT("Sex") ,TEXT("Age") };
for (int i = 0; i < 3; i++)
{
	this->m_List.InsertColumn(i, strHeader[i], LVCFMT_CENTER,100);
}

//m_List.InsertItem(0,TEXT("Michael"));
//m_List.SetItemText(0, 1, TEXT("Male"));
//m_List.SetItemText(0, 2, TEXT("30"));

for (int i = 0; i < 10; i++)
{
	CString name;
	name.Format(TEXT("name %d"), i+1);
	m_List.InsertItem(i, name);
	m_List.SetItemText(i, 1, TEXT("Male"));
	m_List.SetItemText(i, 2, TEXT("30"));
}
m_List.SetExtendedStyle(m_List.GetExtendedStyle()| LVS_EX_FULLROWSELECT| LVS_EX_GRIDLINES);

修改窗口Enter自动退出问题

void CLoginDlg::OnOK()
{
	// TODO: Add your specialized code here and/or call the base class

	//CDialogEx::OnOK();
}

修改窗口右上角X按钮关闭程序功能

void CLoginDlg::OnClose()
{
	// TODO: Add your message handler code here and/or call default
	exit(0);

	//CDialogEx::OnClose();
}

Predefined Symbols

IDABORT	(control) Dialog box, Abort button
IDC_STATIC	(control) Static control
IDCANCEL	(control) Dialog box, Cancel button
IDIGNORE	(control) Dialog box, Ignore button
IDNO	(control) Dialog box, No button
IDOK	(control) Dialog box, OK button
IDR_ACCELERATOR1	(resource) Accelerator table
IDRETRY	(control) Dialog box, Retry button
IDS_PROJNAME	(string) Current application name
IDYES	(control) Dialog box, Yes button