Dialog
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
风格
- LVS_ICON (0x0000): 大图标,为每个item显示大图标
- LVS_SMALLICON (0x0002): 小图标,为每个item显示小图标
- LVS_LIST (0x0003): 列表,显示一列带有小图标的item
- LVS_REPORT (0x0001): 详细资料,显示item详细资料
- 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