使(能)控件,显示/隐藏控件
this->GetDlgItem(IDC_BUTTON_HELP).EnableWindow(FALSE); // 按钮使能
this->GetDlgItem(IDC_BUTTON_HELP).ShowWindow(FALSE); // 按钮隐藏
更新控件与变量的关系
if(!DoDataExchange(true)) // 将控件上的内容更新到变量上
return FALSE;
if(!DoDataExchange(false)) // 将变量的值更新到控件上
return FALSE;
WTL对话框程序创建临时控制台
#include <fcntl.h > // for _O_TEXT _open_osfhandle
#include <iostream>
#include <io.h> // for _open_osfhandle
using namespace std;
void ConsoleEcho(BOOL bEcho)
{
if(!bEcho)
return;
// 带窗口的应用程序,创建一个临时的控制台,以供cout输出
AllocConsole();
HANDLE hin = ::GetStdHandle(STD_INPUT_HANDLE);
HANDLE hout = ::GetStdHandle(STD_OUTPUT_HANDLE);
int hcin = _open_osfhandle((intptr_t)hin,_O_TEXT);
FILE* fpin = _fdopen(hcin,"r");
*stdin = *fpin;
int hcout = _open_osfhandle((intptr_t)hout,_O_TEXT);
FILE* fpout = _fdopen(hcout,"wt");
*stdout = *fpout;
std::ios_base::sync_with_stdio();
std::cout << "Test Console Echo" << endl << endl;
}
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
HRESULT hRes = ::CoInitialize(NULL);
ATLASSERT(SUCCEEDED(hRes));
// this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used
::DefWindowProc(NULL, 0, 0, 0L);
AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES); // add flags to support other controls
hRes = _Module.Init(NULL, hInstance);
ATLASSERT(SUCCEEDED(hRes));
g_hInstance = hInstance;
// 控制台回显
ConsoleEcho(TRUE);
int nRet = Run(lpstrCmdLine, nCmdShow);
// 程序退出时,清理一些数据
ClearEnvironment();
_Module.Term();
::CoUninitialize();
return nRet;
}
树操作
添加树控件
添加变量映射
BEGIN_DDX_MAP(CMainAppDlg)
DDX_CONTROL(IDC_TREEXZM, m_TreeXzm)
END_DDX_MAP()
添加消息映射:树单击消息
BEGIN_MSG_MAP(CMainAppDlg)
COMMAND_ID_HANDLER(IDOK, OnOK) // OK按钮消息映射
COMMAND_ID_HANDLER(IDCANCEL, OnCancel) // Cancle按钮消息映射
NOTIFY_HANDLER_EX(IDC_TREEXZM, NM_CLICK, OnTreeXzmClickTree) // 树控件的单击消息
END_MSG_MAP()
protected:
CXzmTreeViewCtrl m_TreeXzm;
树类的扩展定义
#pragma once
class CXzmTreeViewCtrl :
public CWindowImpl<CXzmTreeViewCtrl, CTreeViewCtrl>
{
public:
CXzmTreeViewCtrl(void){}
~CXzmTreeViewCtrl(void){}
public:
//DECLARE_WND_CLASS(NULL)
DECLARE_WND_SUPERCLASS(NULL, CTreeViewCtrl::GetWndClassName())
BOOL PreTranslateMessage(MSG* pMsg)
{
pMsg;
return FALSE;
}
BEGIN_MSG_MAP(CXzmTreeViewCtrl)
REFLECTED_NOTIFY_CODE_HANDLER_EX(TVN_ITEMEXPANDING, OnItemExpanding)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
LRESULT OnItemExpanding(NMHDR* phdr)
{
NMTREEVIEW* pnmtv = (NMTREEVIEW*)phdr;
if (pnmtv->action & TVE_COLLAPSE)
return TRUE;
else
return FALSE;
}
};
树的初始化
void CMainAppDlg::InitXzmTree()
{
HTREEITEM hRoot, hItem;
TCHAR pc_name[64] = { 0 };
TV_INSERTSTRUCT TCItem;//插入数据项数据结构
TCItem.hParent = TVI_ROOT;//增加根项
TCItem.hInsertAfter = TVI_LAST;//在最后项之后
TCItem.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;//设屏蔽
TCItem.item.pszText = _T("COM");
TCItem.item.lParam = 0;//序号
TCItem.item.iImage = 0;//正常图标
TCItem.item.iSelectedImage = 1;//选中时图标
hItem = m_TreeXzm.InsertItem(&TCItem);//返回根项句柄
m_TreeXzm.Expand(hItem, TVE_EXPAND);//展开上一级树
hRoot = hItem;
HTREEITEM hItemx = NULL;
/*HTREEITEM*/ hItemx = InsertXzmTree( m_TreeXzm, hItem, TCItem, _T("Node01"));
if (hItemx != NULL)
{
InsertXzmTree( m_TreeXzm, hItemx, TCItem, _T("子节点01"));
InsertXzmTree( m_TreeXzm, hItemx, TCItem, _T("子节点02"));
InsertXzmTree( m_TreeXzm, hItemx, TCItem, _T("子节点03")); m_TreeXzm.Expand(hItemx, TVE_COLLAPSE);
}
/*HTREEITEM*/ hItemx = InsertXzmTree( m_TreeXzm, hItem, TCItem, _T("Node02"));
if (hItemx != NULL)
{
InsertXzmTree( m_TreeXzm, hItemx, TCItem, _T("子节点01"));
InsertXzmTree( m_TreeXzm, hItemx, TCItem, _T("子节点02"));
InsertXzmTree( m_TreeXzm, hItemx, TCItem, _T("子节点03")); m_TreeXzm.Expand(hItemx, TVE_COLLAPSE);
}
}
结果如下图
树的单击消息处理
BOOL CMainAppDlg::IsYourChild(ATL::CString strParentName, CTreeViewCtrl &Tree,HTREEITEM &hSelItem)
{
HTREEITEM hParentItem = Tree.GetParentItem(hSelItem);
BSTR bstr = NULL;
Tree.GetItemText(hParentItem,bstr);
if(bstr == NULL)
return FALSE;
ATL::CString strParent(bstr);
if(0 == strParentName.Compare(strParent))
{
return TRUE;
}
else
{
while (NULL != hParentItem)
{
bstr = NULL;
hParentItem = Tree.GetParentItem(hParentItem);
Tree.GetItemText(hParentItem,bstr);
strParent.Format(_T("%s"),bstr);
if(0 == strParentName.Compare(strParent))
return TRUE;
}
}
return FALSE;
}
LRESULT CMainAppDlg::OnTreeXzmClickTree(NMHDR* phdr)
{
POINT pt;
GetCursorPos(&pt);
POINT MousePosition = pt;
m_TreeXzm.ScreenToClient ( &MousePosition );
TVHITTESTINFO HitInfo;
HitInfo.pt = MousePosition;
UINT uiMask = TVHT_ONITEMLABEL;//TVHT_ONITEM;// | TVHT_ONITEMRIGHT;
HTREEITEM hItemHit = m_TreeXzm.HitTest(&HitInfo);
if (hItemHit != NULL && // Obvious
uiMask & HitInfo.flags && // Make sure we are on the label
m_TreeXzm.GetParentItem(hItemHit) != NULL) // Also that we have NO Parent!!
{
BSTR bstr = NULL;
m_TreeXzm.GetItemText(hItemHit,bstr);
//if(bstr == NULL) return 0;
ATL::CString str(bstr);
if(IsYourChild( _T("Node01"),m_TreeXzm,hItemHit))
{
if(0 == str.Compare( _T("子节点01"))) {
}
else if(0 == str.Compare( _T("子节点02"))) {
}
else if(0 == str.Compare( _T("子节点03"))) {
}
}
else if(IsYourChild( _T("Node01"),m_TreeXzm,hItemHit))
{
if(0 == str.Compare( _T("子节点01"))) {
}
else if(0 == str.Compare( _T("子节点02"))) {
}
else if(0 == str.Compare( _T("子节点03"))) {
}
}
}
}