MFC控件使用小结

2018-8-29 流沙 C/C++

CComoboBox:

CComboBox *pCombo = (CComboBox *)GetDlgItem(IDC_COMBO_TEST);
pCombo->InsertString(0, _T("男"));
pCombo->InsertString(1, _T("女"));
pCombo->InsertString(2, _T("秘密"));
pCombo->SetCurSel(1);

CComboBox *pCombo = (CComboBox *)GetDlgItem(IDC_COMBO_COUNTRY);
for(int i = 0; g_Country[i].country[0] != '\0'; i++)
{
pCombo->InsertString(i, g_Country[i].country);

}

CComboBox *pCombo = (CComboBox *)GetDlgItem(IDC_COMBO_CITY);
pCombo->GetLBText(pCombo->GetCurSel(), m_strCity);


CListCtrl m_listCtrl; //在控件属性设置中设置为:View:Report


static DWORD m_SortColum;
static BOOL m_bAs;

DWORD CSelectTopicDialog::m_SortColum = 0;
BOOL CSelectTopicDialog::m_bAs = TRUE;

static int CALLBACK MyListCompar(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

int   CALLBACK CSelectTopicDialog::MyListCompar(LPARAM   lParam1,   LPARAM   lParam2,   LPARAM   lParamSort) 

//通过传递的参数来得到CSortList对象指针,从而得到排序方式 
CListCtrl* pListCtrl = (CListCtrl*) lParamSort;

//通过ItemData来确定数据 

int   iCompRes; 
CString    szComp1 = pListCtrl->GetItemText(lParam1,m_SortColum);
CString    szComp2 = pListCtrl->GetItemText(lParam2,m_SortColum);

switch(m_SortColum) 

case(2): 
//以第一列为根据排序   编号
                //_ttol 
iCompRes=atof(szComp1) <=atof(szComp2)?-1:1; 
break; 

default: 
iCompRes=szComp1.Compare(szComp2); 
break; 

//根据当前的排序方式进行调整

if(m_bAs) 
return   iCompRes; 
else 
return   -iCompRes;


LVN_COLUMNCLICK:
void CSelectTopicDialog::OnColumnclickListTopicSelect(NMHDR* pNMHDR, LRESULT* pResult) 
{
      NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
      m_SortColum = pNMListView->iSubItem;
  m_bAs=!m_bAs;//升序还是降序
  

      int count = m_listCtrl.GetItemCount();   //行数
      for (int i=0; i<count;  i++)  
  {  
m_listCtrl.SetItemData(i,i);  
  }
  m_listCtrl.SortItems(MyListCompar, (LPARAM) &m_listCtrl);
      *pResult = 0;
}

CImageList m_imageList;


设置没项:

m_listCtrl.SetExtendedStyle( LVS_EX_FULLROWSELECT);
m_listCtrl.InsertColumn( 0, _T("网站来源"),LVCFMT_LEFT,85);
m_listCtrl.InsertColumn( 1, _T("产品"),LVCFMT_LEFT,110);
m_listCtrl.InsertColumn( 2, _T("价格"),LVCFMT_LEFT,80);

int iLine = m_listCtrl.GetItemCount();
m_listCtrl.InsertItem( iLine,_T("SOHU"));
m_listCtrl.SetItemText( iLine, 1,_T("IPHONE") );
m_listCtrl.SetItemText( iLine, 2,_T("5000") );

iLine = m_listCtrl.GetItemCount();
m_listCtrl.InsertItem( iLine,_T("TAOBAO"));
m_listCtrl.SetItemText( iLine, 1,_T("奔驰") );
m_listCtrl.SetItemText( iLine, 2,_T("500000") );

iLine = m_listCtrl.GetItemCount();
m_listCtrl.InsertItem( iLine,_T("GOOGLE"));
m_listCtrl.SetItemText( iLine, 1,_T("宝马") );
m_listCtrl.SetItemText( iLine, 2,_T("600000") );
清空:
//清空列表记录
while(m_listCtrl.DeleteItem(0));
选择:NM_CLICK
void CSelectTopicDialog::OnClickListTopicSelect(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here

int istat=m_listCtrl.GetSelectionMark();//用istat存放当前选定的是第几项
m_Tid = atol(m_listCtrl.GetItemText(istat,0));//获取当前项中的数据,0代表是第0列
m_strTopic = m_listCtrl.GetItemText(istat,1);

*pResult = 0;
}

右键:NM_RCLICK
void CPageAllNeed::OnNMRClickListNeed(NMHDR *pNMHDR, LRESULT *pResult)
{

int istat=m_listCtrl.GetSelectionMark();//用istat存放当前选定的是第几项
m_strSelectedTopic =m_listCtrl.GetItemText(istat,1);//获取当前项中的数据,0代表是第0列

POINT point;
HMENU hMenu, hSubMenu;
GetCursorPos(&point); //鼠标位置
hMenu = LoadMenu(NULL, 
MAKEINTRESOURCE(IDR_MENU_TOPICR)); // 加载菜单
hSubMenu = GetSubMenu(hMenu, 0);//得到子菜单(因为弹出式菜单是子菜单)

SetMenuDefaultItem(hSubMenu, -1, FALSE);//设置缺省菜单项,-1为无缺省项
SetForegroundWindow(); // 激活窗口并置前

TrackPopupMenu(hSubMenu, 0, 
point.x, point.y, 0, m_hWnd, NULL);
*pResult = 0;
}


窗口总在最前面:
::BringWindowToTop(m_hWnd);
::SetWindowPos(
m_hWnd, 
HWND_TOPMOST, 
0, 0, 0, 0, 
SWP_NOMOVE | SWP_NOSIZE);


CTreeCtrl  m_configTree;

m_basicPage.Create(IDD_DIALOG_BASICCONFIG, this);
m_cartPage.Create(IDD_DIALOG_CARTCONFIG, this);

CDC *pDc = GetDlgItem(IDC_STATIC_AREA)->GetWindowDC();
pDc->SetBkMode(TRANSPARENT);

CRect rcDlgs;
GetDlgItem(IDC_STATIC_AREA)->GetWindowRect(rcDlgs);
ScreenToClient(rcDlgs);
rcDlgs.top += 12;
rcDlgs.bottom -= 5;
rcDlgs.left += 5;
rcDlgs.right -= 5;
m_basicPage.MoveWindow(rcDlgs);  
m_basicPage.ShowWindow(SW_SHOW);
m_cartPage.MoveWindow(rcDlgs);  
m_cartPage.ShowWindow(SW_HIDE);


HTREEITEM  hItem1;
hItem1 = m_configTree.InsertItem("基本设置", 0, 1, TVI_ROOT, TVI_LAST);
        m_configTree.SetItemData(hItem1, (DWORD)&m_basicPage);

hItem1 = m_configTree.InsertItem("购物车", 0, 1, TVI_ROOT, TVI_LAST);
        m_configTree.SetItemData(hItem1, (DWORD)&m_cartPage);

TVN_SELCHANGED:
void CSysConfigDlg::OnSelchangedTreeSysconfig(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here

HTREEITEM hCurrent = m_configTree.GetSelectedItem();
        if(hCurrent)
{
((CPropertyPage*)m_configTree.GetItemData(hCurrent))->ShowWindow(SW_SHOW);
UpdateWindow();
}

*pResult = 0;
}

TVN_SELCHANGING:
void CSysConfigDlg::OnSelchangingTreeSysconfig(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here

HTREEITEM hCurrent = m_configTree.GetSelectedItem();
        if(hCurrent)
{
((CPropertyPage*)m_configTree.GetItemData(hCurrent))->ShowWindow(SW_HIDE);
//UpdateWindow();
}


*pResult = 0;
}

CTabCtrl m_tabCtrl;
       //创建3个子对话框,Border为 None,style:child,分别为:

CPageAllNeed m_allNeedPage;//1
CPageFavor m_favorPage;//2
CPageMessage m_msgPage;//3
CDialog *m_pDialog[MAX_DLG_PAGE];
int m_CurSelTab;

m_tabCtrl.InsertItem(0, _T("进程"));
m_tabCtrl.InsertItem(1, _T("网络"));
m_tabCtrl.InsertItem(2, _T("文件"));

m_tabCtrl.SetPadding(19);
m_tabCtrl.SetMinTabWidth(50);
m_tabCtrl.SetItemSize(CSize(50,25));

m_allNeedPage.Create(IDD_PAGE_ALLNEED, &m_tabCtrl);
m_favorPage.Create(IDD_PAGE_FAVOR, &m_tabCtrl);
m_msgPage.Create(IDD_PAGE_MESSAGE, &m_tabCtrl);

//设定在Tab内显示的范围
CRect rc;
m_tabCtrl.GetClientRect(rc);
  rc.top += 25;
// rc.bottom -= 8;
// rc.left += 8;
// rc.right -= 8;

m_allNeedPage.MoveWindow(&rc);
m_favorPage.MoveWindow(&rc);
m_msgPage.MoveWindow(&rc);

//m_allNeedPage.SetListCtrlSize();
//m_favorPage.SetListCtrlSize();
//m_msgPage.SetListCtrlSize();

//把对话框对象指针保存起来
m_pDialog[0] = &m_allNeedPage;
m_pDialog[1] = &m_favorPage;
m_pDialog[2] = &m_msgPage;
//显示初始页面
m_pDialog[0]->ShowWindow(SW_SHOW);
m_pDialog[1]->ShowWindow(SW_HIDE);
m_pDialog[2]->ShowWindow(SW_HIDE);

//保存当前选择
m_CurSelTab = 0;

TCN_SELCHANGE:

void CINeedDlg::OnTcnSelchangeTabMain(NMHDR *pNMHDR, LRESULT *pResult)
{
m_pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);
m_CurSelTab = m_tabCtrl.GetCurSel();
if (m_pDialog[m_CurSelTab])
{
m_pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);
}
*pResult = 0;
}

CEdit m_edtCtrl;//m_strPath
CStatic //GetDlgItem(IDC_STATIC_XXX)->SetWindowText();



CChecked:
        直接添加一个成员变量布尔类型
Radio:
直接添加一个INT类型的成员变量,但需要第一个radio和最后一个radio的下一个控件设置为group属性.i = 0,1,2,3分别代表第几个被选中了。怎么确定谁是radio的下一个控件呢?Format-->tab order

控件的移动操作:

GetWindowRect(rcRect);
rcRect.DeflateRect(0, 0, 0, -50);
MoveWindow(&rcRect);
CRect rcbtn;
m_btnUpPic.GetWindowRect(&rcbtn);
ScreenToClient(&rcbtn);
rcbtn.DeflateRect(0,50,0,-50);
m_btnUpPic.MoveWindow(&rcbtn);

m_btnClose.GetWindowRect(&rcbtn);
ScreenToClient(&rcbtn);
rcbtn.DeflateRect(0,50,0,-50);
m_btnClose.MoveWindow(&rcbtn);

m_btnSend.GetWindowRect(&rcbtn);
ScreenToClient(&rcbtn);
rcbtn.DeflateRect(0,50,0,-50);
m_btnSend.MoveWindow(&rcbtn);

打开文件:

static TCHAR BASED_CODE szFilter[] = _T("JPG (*.jpg)|*.jpg|")
_T("BMP文件 (*.bmp)|*.bmp|")
_T("PNG文件 (*.png)|*.png|")
/*_T("All Files (*.*)|*.*||")*/;

CFileDialog Filedlg(TRUE,_T(""), NULL, 
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
szFilter, NULL);
if (Filedlg.DoModal() != IDOK)
{
return;
}
m_szPicFile = Filedlg.GetPathName();


//设置加入计时器
WM_TIMER:参见POPUP弹窗 ON_WM_TIMER()
#define TIMER_ELAPSE_ID 100

SetTimer(TIMER_ELAPSE_ID, 1*1000, NULL);

void CPopupDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case TIMER_ELAPSE_ID:
UpdateData(TRUE);
m_szTime.Format(_T("还剩: %2d 秒"), --m_lefttime);
UpdateData(FALSE);
if (m_lefttime == 0)
{
KillTimer(nIDEvent);
UpdateData(TRUE);
CDialog::OnOK();
}
break;
default:
break;
}

CDialog::OnTimer(nIDEvent);
}

KillTimer(TIMER_ELAPSE_ID);

将窗口移动到右下角:

// 获得桌面大小
CRect rectWorkArea;
SystemParametersInfo(SPI_GETWORKAREA,0,&rectWorkArea,SPIF_SENDCHANGE);   

// 获得对话框大小
CRect rectDlg;

m_showMsgDlg.GetWindowRect(&rectDlg);//m_showMsgDlg是你要显示在右下角的对话框
int nW = rectDlg.Width();
int nH = rectDlg.Height();

// 将窗口设置到右下角
::SetWindowPos(m_showMsgDlg.m_hWnd, HWND_BOTTOM,
rectWorkArea.right-nW-10,rectWorkArea.bottom-nH,nW,nH,SWP_NOZORDER);
//::AnimateWindow(m_showMsgDlg.m_hWnd,1000,AW_VER_NEGATIVE|AW_SLIDE); 
//m_showMsgDlg.ShowWindow(SW_SHOW);

// 将主界面也挪到右下角

GetWindowRect(&rectDlg);
nW = rectDlg.Width();
nH = rectDlg.Height();
::SetWindowPos(m_hWnd, HWND_BOTTOM,
rectWorkArea.right-nW-15,rectWorkArea.bottom-nH,nW,nH,SWP_NOZORDER);

模态对话框:
CXxxDlg dlg;
dlg.DoModal()==IDOK

非模态对话框:
CXxxDlg  m_showMsgDlg; 
m_showMsgDlg.Create(IDD_DIALOG_SHOWMSG, NULL);
m_showMsgDlg.ShowWindow(SW_SHOW);

绘图功能 WM_DRAWITEM();
#include <atlimage.h>
m_stShowPic.ModifyStyle(SS_TYPEMASK,SS_OWNERDRAW); 
void CShowPicMsgDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (nIDCtl == IDC_STATIC_SHOWPICMSG)
{
CRect rcClient;
CImage image;

if (PathFileExists(m_szPicPath))
{

CDC* pDC = GetDlgItem(IDC_STATIC_SHOWPICMSG)->GetWindowDC();

GetDlgItem(IDC_STATIC_SHOWPICMSG)->GetClientRect(&rcClient);

image.Load(m_szPicPath);
SetWindowPos(NULL, 0, 0, image.GetWidth(), image.GetHeight(), SWP_NOMOVE);
m_stShowPic.MoveWindow(0, 0, image.GetWidth(), image.GetHeight());


image.Draw( pDC->m_hDC,rcClient.left, 
rcClient.top, rcClient.Width(), 
rcClient.Height());


ReleaseDC(pDC);
}
return;
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

拖动功能:

选中对话框中的acceptFiles属性
添加WM_DROPFILES
void CImageBaseCheckerDlg::OnDropFiles(HDROP hDropInfo) 
{
// TODO: Add your message handler code here and/or call default
UINT count;
TCHAR filePath[MAX_PATH] = {0};

count = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
if(count == 1)
{
DragQueryFile(hDropInfo, 0, filePath, sizeof(filePath));
m_szPath = filePath;
UpdateData(FALSE);
DragFinish(hDropInfo);

CDialog::OnDropFiles(hDropInfo);
return;

}
else
{   
//m_vectorFile.clear();
for(UINT i=0; i<count; i++)
{
int pathLen = DragQueryFile(hDropInfo, i, filePath, sizeof(filePath));
m_szPath = filePath;
//m_vectorFile.push_back(filePath);
//break;
}

UpdateData(FALSE);
DragFinish(hDropInfo);
}


CDialog::OnDropFiles(hDropInfo);
}

发表评论:

Powered by 流沙团