1、对话框布局
void CXXXDlg::ResizeDialog()
{
int nMultiple = 20; //对话框长宽各占屏幕19/20
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
int x = cx / nMultiple / 2; //主对话框x
int y = cy / nMultiple / 2; //主对话框y
int nWidth = cx / nMultiple * (nMultiple - 1); //主对话框宽度
int nHeight = cy / nMultiple * (nMultiple - 1); //主对话框高度
//设置对话框位置和大小
::SetWindowPos(this->GetSafeHwnd(), HWND_BOTTOM, x, 10, nWidth, nHeight, SWP_NOZORDER);
// to do
// 这里需要修改:nWidth和nHeight只是对话框的长和宽,
//而要布局我们需要获取对话框客户区域大小才对
CRect rect;
GetClientRect(&rect); //主对话框客户区域
//设置菜单栏区域
CRect rectMenuBar;
m_wndMenuBarLocation.GetWindowRect(&rectMenuBar);
ScreenToClient(&rectMenuBar);
m_wndMenuBar.SetWindowPos(&wndTop, rectMenuBar.left, rectMenuBar.top,
nWidth, rectMenuBar.Height(), SWP_NOACTIVATE);
}
2、封装CStatic
(1)MyStatic.h
#pragma once
#include "afxwin.h"
class CMyStatic : public CStatic
{
public:
CMyStatic();
~CMyStatic(void);
void SetBitMap(CBitmap* pBmpClient);
void SetCaption(char* lpszCaption);
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
private:
char* m_lpszCaption; //文本内容
CBitmap* m_pBmpClient; //显示位图
COLORREF m_clrCaption; //文字颜色
CBrush m_Brush;
};
(2)MyStatic.cpp
#include "StdAfx.h"
#include "MyStatic.h"
CMyStatic::CMyStatic()
{
m_pBmpClient = NULL;
m_lpszCaption = NULL;
m_clrCaption = RGB(0,0,0); //默认黑色文字
}
CMyStatic::~CMyStatic(void)
{
}
void CMyStatic::SetBitMap(CBitmap* pBmpClient)
{
m_pBmpClient = pBmpClient;
}
void CMyStatic::SetCaption(char* lpszCaption)
{
m_lpszCaption = lpszCaption;
}
BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
void CMyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CStatic::OnPaint()
CRect rcClient;
GetClientRect(&rcClient);
CDC *pDC = GetDC(); //这里的DC也可以是 CPaintDC dc(this);
ASSERT(pDC);
//if(m_byType == CBVStatic::TYPE_BRUSH) //背景是画刷,自定义的
//{
// pDC->FillRect(&rcClient, m_pBrush);
//}
//else if(m_byType == CBVStatic::TYPE_BITMAP) //背景是图片,自定义的
//{
CBitmap *pOldBitmap = NULL;
BITMAP bmpInfo;
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
pOldBitmap = dcMem.SelectObject(m_pBmpClient);
m_pBmpClient->GetBitmap(&bmpInfo);
//TransparentBlt
pDC->TransparentBlt(rcClient.left, rcClient.top, bmpInfo.bmWidth, bmpInfo.bmHeight,
&dcMem, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, RGB(255,255,255));
//pDC->BitBlt(rcClient.left, rcClient.top, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMem, 0, 0, SRCCOPY);
dcMem.SelectObject(pOldBitmap);
VERIFY(dcMem.DeleteDC());
//}
if(m_lpszCaption) //写文本
{
rcClient.InflateRect(0,2,0,2);
COLORREF clrOldColor = pDC->SetTextColor(m_clrCaption);
int nOldMode = pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(m_lpszCaption, -1, &rcClient, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
pDC->SetTextColor(clrOldColor);
pDC->SetBkMode(nOldMode);
}
VERIFY(ReleaseDC(pDC));
}
BOOL CMyStatic::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;
return CStatic::OnEraseBkgnd(pDC);
}
3、树形控件图片示例
//创建图像序列CImageList对象
m_imageList.Create(16, 16, ILC_COLOR32, 3, 3);
HICON hIcon;
hIcon= theApp.LoadIcon(IDI_ICON_TASK_UNREAD);
m_imageList.Add(hIcon);
hIcon= theApp.LoadIcon(IDI_ICON_TASK_DOING);
m_imageList.Add(hIcon);
hIcon= theApp.LoadIcon(IDI_ICON_TASK_DONE);
m_imageList.Add(hIcon);
hIcon= theApp.LoadIcon(IDI_ICON_TASK_DELETED);
m_imageList.Add(hIcon);
//为树形控件设置图像序列
m_treeMail.SetImageList(&m_imageList, TVSIL_NORMAL);
CString val = _T("");
HTREEITEM hRoot; // 树的根节点的句柄
val.Format("(%d)", m_uiTaskNumber[TaskUnRead]);
hRoot = m_treeMail.InsertItem(val, TaskUnRead, TaskUnRead);
m_treeMail.SetItemData(hRoot, m_uiTaskNumber[TaskUnRead]);
val.Format("(%d)", m_uiTaskNumber[TaskDoing]);
hRoot = m_treeMail.InsertItem(val, TaskDoing, TaskDoing);
m_treeMail.SetItemData(hRoot, m_uiTaskNumber[TaskDoing]);
val.Format("(%d)", m_uiTaskNumber[TaskDone]);
hRoot = m_treeMail.InsertItem(val, TaskDone, TaskDone);
m_treeMail.SetItemData(hRoot, m_uiTaskNumber[TaskDone]);
val.Format("(%d)", m_uiTaskNumber[TaskDeleted]);
hRoot = m_treeMail.InsertItem(val, TaskDeleted, TaskDeleted);
m_treeMail.SetItemData(hRoot, m_uiTaskNumber[TaskDeleted]);
//展开根节点的所有子节点
void CXXXDlg::ExpandRoot(HTREEITEM hItem)
{
m_treeTask.Expand(hItem, TVE_EXPAND);
HTREEITEM hChild = m_treeTask.GetChildItem(hItem);
while (hChild)
{
ExpandRoot(hChild);
hChild = m_treeTask.GetNextSiblingItem(hChild);
}
}
双击树节点
void CXXXDlg::OnNMDblclkTreeTask(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
CPoint point(GetCurrentMessage()->pt);
m_treeTask.ScreenToClient(&point);
UINT uFlags = 0;
HTREEITEM hTreeItem = m_treeTask.HitTest(point, &uFlags);
if ((hTreeItem != NULL) && (uFlags & TVHT_ONITEM))
{
if (m_treeTask.ItemHasChildren(hTreeItem))
{
UINT nStateMask = m_treeTask.GetItemState(hTreeItem, TVIS_EXPANDED);
BOOL bExpand = (nStateMask & TVIS_EXPANDED) ? TRUE : FALSE;
nStateMask = bExpand ? TVE_COLLAPSE : TVE_EXPAND;
if (bExpand)
m_treeTask.Expand(hTreeItem, TVE_EXPAND);
else
m_treeTask.Expand(hTreeItem, TVE_COLLAPSE);
}
else
{
m_strSelectedTask = m_treeTask.GetItemText(hTreeItem);
AfxMessageBox(m_strSelectedTask);
//GetParent()->PostMessage(UM_UPDATE_ADDFLOW, NULL, (LPARAM)&m_strSelectedTask);
}
}
}
4、封装BCGPGridCtrl
#pragma once
#include "CustomStruct.h"
#include <vector>
using namespace std;
class CMyBCGPGridCtrl : public CBCGPGridCtrl
{
// Construction
public:
CMyBCGPGridCtrl();
void InitCtrl(const vector<Task>& vecTask);
// Attributes
public:
// Operations
public:
CBCGPGridRow* CreateNewRow ();
void AddEmptyRow ();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyBCGPGridCtrl)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMyBCGPGridCtrl();
// Generated message map functions
protected:
//{{AFX_MSG(CMyBCGPGridCtrl)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
virtual void SetRowHeight()
{
CBCGPGridCtrl::SetRowHeight();
m_nRowHeight += 2;
}
};
#include "StdAfx.h"
#include "MyBCGPGridCtrl.h"
#include "CustomCells.h"
CMyBCGPGridCtrl::CMyBCGPGridCtrl(void)
{
}
CMyBCGPGridCtrl::~CMyBCGPGridCtrl(void)
{
}
BEGIN_MESSAGE_MAP(CMyBCGPGridCtrl, CBCGPGridCtrl)
//{{AFX_MSG_MAP(CMyBCGPGridCtrl)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_HSCROLL()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CMyBCGPGridCtrl message handlers
int CMyBCGPGridCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CBCGPGridCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
SetWholeRowSel (FALSE);
EnableMarkSortedColumn (FALSE);
EnableHeader (TRUE, BCGP_GRID_HEADER_SELECT);
EnableRowHeader (TRUE);
SetClearInplaceEditOnEnter (FALSE);
EnableInvertSelOnCtrl ();
EnableColumnAutoSize(TRUE); //自动排满整行
InsertColumn (0, _T("0"), 40);
InsertColumn (1, _T("1"), 150);
InsertColumn (2, _T("2"), 60);
InsertColumn (3, _T("3"), 100);
InsertColumn (4, _T("4"), 70);
InsertColumn (5, _T("5"), 90);
InsertColumn (6, _T("6"), 90);
InsertColumn (7, _T("7"), 60);
//设置各列标题及文本居中显示
for (int i=0; i<8; i++)
{
SetColumnAlign(i, HDF_CENTER);
SetHeaderAlign(i, HDF_CENTER);
}
//AddEmptyRow();
//AddEmptyRow();
//AddEmptyRow();
//CBCGPGridRow* pRow = CreateNewRow();
//ASSERT_VALID(pRow);
-------------
Simple text:
-------------
//pRow->GetItem (1)->SetValue (_T("Text:"));
//pRow->ReplaceItem (2, new CBCGPGridItem (_T("Hello, world!")));
-------------
Masked text:
-------------
//pRow->GetItem (4)->SetValue (_T("Masked Edit:"));
//pRow->ReplaceItem (5, new CBCGPGridItem (_T("(123) 123-12-12"),
// 0, _T(" ddd ddd dd dd"),
// _T("(___) ___-__-__")));
//AddRow (pRow, FALSE);
//AddEmptyRow ();
//pRow = CreateNewRow ();
----------
Password:
----------
//pRow->GetItem (1)->SetValue (_T("Password"));
//pRow->ReplaceItem (2, new CPasswordItem(_T("mypassword")));
-----
URL:
-----
//pRow->GetItem (4)->SetValue (_T("URL:"));
//CBCGPGridItem* pURLItem =
// new CBCGPGridURLItem(_T("www.bcgsoft.com"), _T(""));
//pRow->ReplaceItem (5, pURLItem);
//AddRow (pRow, FALSE);
//AddEmptyRow();
//pRow = CreateNewRow ();
//
//AddRow (pRow, FALSE);
//AddEmptyRow();
//pRow = CreateNewRow ();
----------------
Slider control:
----------------
//pRow->GetItem (1)->SetValue (_T("Slider:"));
//pRow->ReplaceItem (2, new CSliderItem(80));
//pRow->GetItem (4)->SetValue (_T("Double:"));
//pRow->ReplaceItem (5, new CBCGPGridItem (239.6));
//AddRow (pRow, FALSE);
//AddEmptyRow();
//pRow = CreateNewRow ();
AdjustLayout ();
LoadState (_T("MyBCGPGridCtrl"));
AdjustLayout ();
return 0;
}
void CMyBCGPGridCtrl::OnDestroy()
{
SaveState(_T("MyBCGPGridCtrl"));
CBCGPGridCtrl::OnDestroy();
}
CBCGPGridRow* CMyBCGPGridCtrl::CreateNewRow ()
{
CBCGPGridRow* pRow = CreateRow (GetColumnCount ());
for (int i = 0; i < GetColumnCount ();i++)
{
pRow->GetItem (i)->AllowEdit (FALSE);
}
return pRow;
}
void CMyBCGPGridCtrl::AddEmptyRow ()
{
AddRow (CreateNewRow (), FALSE);
}
void CMyBCGPGridCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CItemSliderCtrl* pItemSliderCtrl = DYNAMIC_DOWNCAST
(CItemSliderCtrl, pScrollBar);
if (pItemSliderCtrl != NULL)
{
CWnd::OnHScroll (nSBCode, nPos, pScrollBar);
pItemSliderCtrl->Redraw ();
}
else
{
CBCGPGridCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}
}
void CMyBCGPGridCtrl::InitCtrl(const vector<Task>& vecTask)
{
CString val = _T("");
int nSize = vecTask.size();
for (int i=0; i<nSize; i++)
{
Task task = vecTask.at(i);
CBCGPGridRow* pRow = CreateNewRow();
ASSERT_VALID(pRow);
val.Format("%d", i + 1);
pRow->GetItem(0)->SetValue((_variant_t)val); //序号
AddRow(pRow, FALSE);
}
AdjustLayout();
}