Đây là một lớp kế thừa CEdit và cho phép liên kết dọc
/// HEADER //////////////////////////////////////////
class CEditVC : public CEdit
{
public:
CEditVC();
protected:
CRect m_rectNCBottom;
CRect m_rectNCTop;
public:
virtual ~CEditVC();
protected:
afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);
afx_msg void OnNcPaint();
afx_msg UINT OnGetDlgCode();
DECLARE_MESSAGE_MAP()
};
/// IMPLEMENTATION /////////////////////////////////////////
CEditVC::CEditVC()
: m_rectNCBottom(0, 0, 0, 0)
, m_rectNCTop(0, 0, 0, 0)
{
}
CEditVC::~CEditVC()
{
}
BEGIN_MESSAGE_MAP(CEditVC, CEdit)
ON_WM_NCCALCSIZE()
ON_WM_NCPAINT()
ON_WM_GETDLGCODE()
END_MESSAGE_MAP()
void CEditVC::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
{
CRect rectWnd, rectClient;
//calculate client area height needed for a font
CFont *pFont = GetFont();
CRect rectText;
rectText.SetRectEmpty();
CDC *pDC = GetDC();
CFont *pOld = pDC->SelectObject(pFont);
pDC->DrawText("Ky", rectText, DT_CALCRECT | DT_LEFT);
UINT uiVClientHeight = rectText.Height();
pDC->SelectObject(pOld);
ReleaseDC(pDC);
//calculate NC area to center text.
GetClientRect(rectClient);
GetWindowRect(rectWnd);
ClientToScreen(rectClient);
UINT uiCenterOffset = (rectClient.Height() - uiVClientHeight)/2;
UINT uiCY = (rectWnd.Height() - rectClient.Height())/2;
UINT uiCX = (rectWnd.Width() - rectClient.Width())/2;
rectWnd.OffsetRect(-rectWnd.left, -rectWnd.top);
m_rectNCTop = rectWnd;
m_rectNCTop.DeflateRect(uiCX, uiCY, uiCX, uiCenterOffset + uiVClientHeight + uiCY);
m_rectNCBottom = rectWnd;
m_rectNCBottom.DeflateRect(uiCX, uiCenterOffset + uiVClientHeight + uiCY, uiCX, uiCY);
lpncsp->rgrc[0].top +=uiCenterOffset;
lpncsp->rgrc[0].bottom -= uiCenterOffset;
lpncsp->rgrc[0].left +=uiCX;
lpncsp->rgrc[0].right -= uiCY;
}
void CEditVC::OnNcPaint()
{
Default();
CWindowDC dc(this);
CBrush Brush(GetSysColor(COLOR_WINDOW));
dc.FillRect(m_rectNCBottom, &Brush);
dc.FillRect(m_rectNCTop, &Brush);
}
UINT CEditVC::OnGetDlgCode()
{
if(m_rectNCTop.IsRectEmpty())
{
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);
}
return CEdit::OnGetDlgCode();
}
Nguồn
2009-05-15 12:10:42
Trên thực tế, đặt câu hỏi Google có thể được khuyến khích. Chúng tôi muốn StackOverflow trở thành một kho lưu trữ rộng và sâu của tất cả kiến thức lập trình, một "Wikipedia" về lập trình. –
Tôi chưa nói anh ấy không thể đăng câu hỏi của mình trong trang này. Thậm chí tôi nghĩ tôi đã cho anh ta một gợi ý tốt để giải quyết vấn đề của mình. Nhưng tôi thực sự nghĩ rằng không có vấn đề gì khi hỏi một câu hỏi đã được trả lời hàng trăm lần trước đó. Tôi không quan tâm đến danh tiếng ... Tôi chỉ đọc trang này vì tôi thích nó và giúp tôi cải thiện kiến thức của mình. Nhưng tôi thực sự nghĩ rằng tôi không xứng đáng được bỏ phiếu tiêu cực ở đây. –
Nghe StackOverflow podcat # 53, Jeff và Joel trả lời một câu hỏi về việc hỏi các câu hỏi cơ bản, dễ tìm kiếm bằng cách nói rằng chúng tôi muốn TẤT CẢ các câu hỏi để chúng tôi có thể phát triển một kiến thức hữu ích từ những điều cơ bản đến vấn đề chuyên môn. –