?? fg_win32drawinterface.cpp
字號(hào):
/*--------------------------------------------------------------------------
FG_Win32DrawInterface.cpp - Win32的繪圖接口類的實(shí)現(xiàn)文件
本程序是FishGUI軟件的一部分
版權(quán)所有 (C) 2003,2004 王詠武
http://www.contextfree.net/wangyw/
----------------------------------------------------------------------------
作者對(duì) FishGUI 軟件及其所有源代碼授權(quán)如下:
允許任何個(gè)人、組織、機(jī)構(gòu)、企業(yè)無償獲得、修改、使用、重新發(fā)布 FishGUI 軟
件及其源代碼,或按照有償或者無償?shù)姆绞桨l(fā)行基于 FishGUI 源代碼的全部或部
分內(nèi)容開發(fā)的軟件產(chǎn)品,——但行使以上權(quán)利時(shí),須遵守以下約定:
1、重新發(fā)布 FishGUI 軟件及其源代碼時(shí),不得隱去軟件及其源代碼中原有的版
權(quán)信息和開發(fā)者標(biāo)識(shí)。
2、發(fā)行基于 FishGUI 源代碼的全部或部分內(nèi)容開發(fā)的軟件產(chǎn)品時(shí),必須在產(chǎn)品
的顯著位置標(biāo)明以下字樣:
【本產(chǎn)品的一部分功能是基于王詠武在 FishGUI 軟件中的工作完成的】
3、在正式出版物中引用 FishGUI 的文檔、源代碼或注釋內(nèi)容的,應(yīng)注明軟件的
原作者為王詠武。
--------------------------------------------------------------------------*/
/*! \addtogroup OSAdaptor
* @{
*/
/*! \file
* \brief Win32的繪圖接口類的實(shí)現(xiàn)文件
*/
/*! @} */
#include "stdio.h"
#include "windows.h"
#include "FG_Win32DrawInterface.h"
#if defined(WIN32) && defined(_DEBUG)
/* Trace memory allocation in windows debug version */
#include <crtdbg.h>
static char THIS_FILE[] = __FILE__;
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif /* _DEBUG */
//##ModelId=3F71AB2E0279
FG_Win32DrawInterface::~FG_Win32DrawInterface()
{
// 刪除繪圖資源
DeleteDC(m_hMemDC);
DeleteObject(m_hBitmap);
DeleteObject(m_hFont);
}
//##ModelId=3F4EDED00326
void FG_Win32DrawInterface::BeginDraw(const FG_Rect & rect)
{
if (! m_iDrawCount)
{
if (! m_hMemDC)
{
// 創(chuàng)建繪圖緩沖區(qū)
m_hMemDC = CreateCompatibleDC(m_hDC);
m_hBitmap = CreateCompatibleBitmap(m_hDC, SCREEN_WIDTH, SCREEN_HEIGHT);
SelectObject(m_hMemDC, m_hBitmap);
m_hFont = CreateFont(15, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, "宋體");
SelectObject(m_hMemDC, m_hFont);
}
// 初始無效區(qū)
m_Invalid = rect;
}
else
{
// 組合無效區(qū)
m_Invalid |= rect;
}
m_iDrawCount ++;
}
//##ModelId=3F4EDED003A8
void FG_Win32DrawInterface::EndDraw()
{
m_iDrawCount --;
if (! m_iDrawCount)
{
// 把緩沖區(qū)內(nèi)容刷新到屏幕上
BitBlt(m_hDC, m_Invalid.wLeft, m_Invalid.wTop, m_Invalid.Width(), m_Invalid.Height(), m_hMemDC,
m_Invalid.wLeft, m_Invalid.wTop, SRCCOPY);
}
}
//##ModelId=3F4EDED003E4
void FG_Win32DrawInterface::FillRect(const FG_Rect & rect, const COLORVAL ForeColor, const COLORVAL background)
{
if (m_hMemDC)
{
// 創(chuàng)建繪圖所用資源
HPEN hPen = CreatePen(PS_SOLID, 1, ForeColor);
HBRUSH hBrush = CreateSolidBrush(background);
HPEN hPenOld = (HPEN)SelectObject(m_hMemDC, hPen);
HBRUSH hBrushOld = (HBRUSH)SelectObject(m_hMemDC, hBrush);
Rectangle(m_hMemDC, rect.wLeft, rect.wTop, rect.wRight + 1, rect.wBottom + 1);
// 刪除繪圖資源
SelectObject(m_hMemDC, hPenOld);
DeleteObject(hPen);
SelectObject(m_hMemDC, hBrushOld);
DeleteObject(hBrush);
}
}
//##ModelId=3F4EDED10133
void FG_Win32DrawInterface::Line(const short x1, const short y1, const short x2, const short y2, const COLORVAL color)
{
if (m_hMemDC)
{
// 創(chuàng)建繪圖所用資源
HPEN hPen = CreatePen(PS_SOLID, 1, color);
HPEN hPenOld = (HPEN)SelectObject(m_hMemDC, hPen);
MoveToEx(m_hMemDC, x1, y1, NULL);
LineTo(m_hMemDC, x2, y2);
// Win32的畫線函數(shù)不畫最后一點(diǎn),和FishGUI的定義不同
// 這里需要加畫最后一點(diǎn)
SetPixel(m_hMemDC, x2, y2, color);
// 刪除繪圖資源
SelectObject(m_hMemDC, hPenOld);
DeleteObject(hPen);
}
}
//##ModelId=3F4EDED1031E
void FG_Win32DrawInterface::DrawText(const char * Text, const short x, const short y, const COLORVAL color)
{
if (m_hMemDC)
{
SetTextColor(m_hMemDC, color);
SetBkMode(m_hMemDC, TRANSPARENT);
TextOut(m_hMemDC, x, y, Text, strlen(Text));
}
}
//##ModelId=3F4EDED200DA
WORD FG_Win32DrawInterface::GetTextWidth(const char * Text)
{
if (m_hMemDC)
{
SIZE size;
GetTextExtentPoint(m_hMemDC, Text, strlen(Text), & size);
return (WORD)size.cx;
}
else
return 0;
}
//##ModelId=3F4EDED20184
WORD FG_Win32DrawInterface::GetTextHeight(const char * Text)
{
if (m_hMemDC)
{
SIZE size;
GetTextExtentPoint(m_hMemDC, Text, strlen(Text), & size);
return (WORD)size.cy;
}
else
return 0;
}
//##ModelId=3F4EDED20239
void FG_Win32DrawInterface::DrawBitmap(const char * pBmpName, const short x1, const short y1)
{
if (m_hMemDC)
{
HBITMAP hBitmap1 = (HBITMAP)LoadImage(NULL, pBmpName, IMAGE_BITMAP, 0, 0,
LR_DEFAULTSIZE | LR_LOADFROMFILE);
if (hBitmap1)
{
BITMAP info;
GetObject(hBitmap1, sizeof(BITMAP), & info);
HDC hMemDC1 = CreateCompatibleDC(m_hDC);
SelectObject(hMemDC1, hBitmap1);
BitBlt(m_hMemDC, x1, y1, x1 + info.bmWidth - 1, y1 + info.bmHeight - 1, hMemDC1, 0, 0, SRCCOPY);
DeleteDC(hMemDC1);
DeleteObject(hBitmap1);
}
}
}
//##ModelId=3F6193B201F2
void FG_Win32DrawInterface::DrawPolyLine(const short n, const FG_Point * vert, const COLORVAL color)
{
if (m_hMemDC)
{
// 創(chuàng)建繪圖所用資源
HPEN hPen = CreatePen(PS_SOLID, 1, color);
HPEN hPenOld = (HPEN)SelectObject(m_hMemDC, hPen);
POINT * lppt = new POINT[n];
for (short i = 0; i < n; i ++)
{
lppt[i].x = vert[i].x;
lppt[i].y = vert[i].y;
}
Polyline(m_hMemDC, lppt, n);
SetPixel(m_hMemDC, lppt[n - 1].x, lppt[n - 1].y, color);
delete [] lppt;
// 刪除繪圖資源
SelectObject(m_hMemDC, hPenOld);
DeleteObject(hPen);
}
}
//##ModelId=3F6EAC820075
void FG_Win32DrawInterface::DrawDotRect(const FG_Rect & rect, const COLORVAL color)
{
if (m_hMemDC)
{
// 創(chuàng)建繪圖所用資源
HPEN hPen = CreatePen(PS_DOT, 1, color);
HPEN hPenOld = (HPEN)SelectObject(m_hMemDC, hPen);
HBRUSH hBrushOld = (HBRUSH)SelectObject(m_hMemDC, GetStockObject(NULL_BRUSH));
Rectangle(m_hMemDC, rect.wLeft, rect.wTop, rect.wRight + 1, rect.wBottom + 1);
// 刪除繪圖資源
SelectObject(m_hMemDC, hPenOld);
DeleteObject(hPen);
SelectObject(m_hMemDC, hBrushOld);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -