WTL 基于GDI的一些 *** 作

WTL 基于GDI的一些 *** 作,第1张

这个没有什么思路.WTL没有用过,不过一般的GDI在画矩形的时候,需要指定一个RECT,然后在DC里画图的时候,bitblt需要左上角的点坐标,长和宽,也一样是矩形。然后画文字,DrawText也可以指定在矩形区域内写字,还可以有对齐方式等等。

所以,只要你规定好了RECT,就好了。

PictureControl就是类CStatic,下面是VC++ WTL的编程用法,你着重看下WM_PAINT及设置图片函数就能知道,如何用在MFC里了。关于Load图片的函数AtlLoadGdiplusImage(nRes, pstrType),我没贴出来,主要是为了方便你了解。

当你切换图片时,就调用SetBitmap(HBITMAP hBitmap)函数,就可以切换图片了。SizeToFit()函数是根据你设定的图片,自动调整控件窗口大小。

#ifndef _THEMEDIMAGE_H_INCLUDE_

#define _THEMEDIMAGE_H_INCLUDE_

#pragma once

//////////////////////////////////////////////////////////////////////

// Themed Image control

//

class CThemedImageCtrl : public CWindowImpl<CThemedImageCtrl, CStatic>

{

public:

CWindow m_wndThemeParent

CBrush m_brBack

CBitmap m_bmpImage

// Operations

BOOL SubclassWindow(HWND hWnd)

{

ATLASSERT(m_hWnd==NULL)

ATLASSERT(::IsWindow(hWnd))

BOOL bRet = CWindowImpl<CThemedImageCtrl, CStatic>::SubclassWindow(hWnd)

if( bRet ) Init()

return bRet

}

void Init()

{

m_wndThemeParent = GetParent()

Invalidate()

}

void SetThemeParent(HWND hWnd)

{

ATLASSERT(::IsWindow(hWnd))

m_wndThemeParent = hWnd

if( !m_brBack.IsNull() ) m_brBack.DeleteObject()

}

void SetBitmap(HBITMAP hBitmap)

{

m_bmpImage = (HBITMAP) ::CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION)

if( IsWindow() ) Invalidate()

}

void SetBitmap(UINT nRes, LPCTSTR pstrType)

{

m_bmpImage = AtlLoadGdiplusImage(nRes, pstrType)

if( IsWindow() ) Invalidate()

}

void SizeToFit()

{

ATLASSERT(!m_bmpImage.IsNull())

BITMAP BmpInfo = { 0 }

m_bmpImage.GetBitmap(&BmpInfo)

ResizeClient(BmpInfo.bmWidth, BmpInfo.bmHeight)

if( IsWindow() ) Invalidate()

}

// Message map and handlers

BEGIN_MSG_MAP(CThemedImageCtrl)

MESSAGE_HANDLER(WM_CREATE, OnCreate)

MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)

MESSAGE_HANDLER(WM_MOVE, OnSize)

MESSAGE_HANDLER(WM_SIZE, OnSize)

MESSAGE_HANDLER(WM_PAINT, OnPaint)

MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)

END_MSG_MAP()

LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL&bHandled)

{

Init()

bHandled = FALSE

return 0

}

LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL&/*bHandled*/)

{

if( !m_brBack.IsNull() ) m_brBack.DeleteObject()

return TRUE

}

LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL&/*bHandled*/)

{

return 1

}

LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL&/*bHandled*/)

{

if( wParam != NULL )

{

DoPaint((HDC) wParam)

}

else

{

CPaintDC dc(m_hWnd)

DoPaint(dc.m_hDC)

}

return 0

}

// Implementation

void DoPaint(CDCHandle dc)

{

CRect rcClient

GetClientRect(&rcClient)

// Preserve background

if( m_brBack.IsNull() ) m_brBack = AtlGetBackgroundBrush(m_hWnd, m_wndThemeParent)

HBRUSH hOldBrush = dc.SelectBrush(m_brBack)

dc.PatBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), PATCOPY)

dc.SelectBrush(hOldBrush)

// Paint image (assume that it is a 32bit with alpha-pr-pixel)...

CDC dcCompat

dcCompat.CreateCompatibleDC(dc)

BITMAP BmpInfo = { 0 }

m_bmpImage.GetBitmap(&BmpInfo)

BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }

HBITMAP hOldBitmap = dcCompat.SelectBitmap(m_bmpImage)

dc.AlphaBlend(0, 0, rcClient.Width(), rcClient.Height(), dcCompat, 0, 0, BmpInfo.bmWidth, BmpInfo.bmHeight, bf)

dcCompat.SelectBitmap(hOldBitmap)

}

}

#endif //_THEMEDIMAGE_H_INCLUDE_


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/bake/11260358.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存