WTL -- 常用功能

使(能)控件,显示/隐藏控件

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"))) {
			}
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值