以下hdc为当前设备句柄
1.点:
创建画笔,并设置其属性:
HPEN CreatePen(
int fnPenStyle, //画笔风格
int nWidth, //
COLORREF crColor //画笔颜色
);
画笔风格可以设置为:PS_SOLID(实型),PS_DASH(虚),PS_NULL(透明)
画笔宽度:如果设置为0,则宽度为一个像素。
画笔颜色:可以以一下方式获得 RGB(0xff,0xff,0xff)//黑色
画点:WINGDIAPI COLORREF WINAPI SetPixel(HDC,int,int,COLORREF);
举例:
HPEN hNewPen,hOldPen;
hNewPen = CreatePen(PS_SOLID,1,RGB(255,0,0));
hOldPen = (HPEN)SelectObject(hdc,hNewPen);//保存前一次的画笔状态
SetPixel(hdc,100,100,RGB(255,0,0));
SelectObject(hdc,hOldPen);//恢复前一次的画笔状态
2.线
首先设置画笔风格,同画点
画线函数:
MoveToEx(HDC,int,int,LPPOINT);LineTo(HDC,int,int);或者
Polyline(__in HDC hdc,__in_ecount(c) CONST POINT * lppt, int c)
举例:
HPEN hOldPen,hNewPen;
hNewPen = CreatePen(PS_SOLID,1,RGB(255,255,0);
hOldPen = (HPEN)SelectObject(hdc,hNewPen);
MoveToEx(hdc,100,100,NULL);
LineTo(hdc,100,200);
SelectObject(hdc,hOldPen);
3.矩形
首先设置画笔风格,同画点。
画矩形函数:
Rectangle(HDC,int,int,int,int);//普通矩形
RoundRect(HDC,int,int,int,int,int,int);//圆角矩形
设置画刷:HBRUSH hBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
填充函数:FillRect(HDC,CONST RECT *,HBRUSH);
举例:
RECT rect= {10,10,100,100};
HBRUSH hBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
Rectangle(hdc,rect.left + 1,rect.top +1,rect.right + 1,rect.bottom +1);
FillRect(hdc,&rect,hBrush);
4.打印字符串
字体属性:
typedef struct tagLOGFONT { // lf
LONG lfHeight; //字高度
LONG lfWidth; //字符平均宽度
LONG lfEscapement; //行与水平页角度
LONG lfOrientation; //基线与水平角度
LONG lfWeight; //笔划的粗细
BYTE lfItalic; //非零为斜体
BYTE lfUnderline; //非零为下划线
BYTE lfStrikeOut; //非零为中划线
BYTE lfCharSet; //指定字符集
BYTE lfOutPrecision; //输出精度
BYTE lfClipPrecision; //裁剪精度
BYTE lfQuality; //输出质量
BYTE lfPitchAndFamily; //字体的字距和族
TCHAR lfFaceName[LF_FACESIZE]; //含字体名的字符串
} LOGFONT;
举例
LOGFONT stFont;
HFONT hNewFont, hOldFont;
RECT rect = {0, 0, 100, 30};
//创建字体
memset(&stFont, 0, sizeof(stFont));
stFont.lfWeight = FW_BOLD;
stFont.lfHeight = 14;
wcscpy(stFont.lfFaceName,_T("TodayFont"));
hNewFont = CreateFontIndirect(&stFont);
//设置字体
hOldFont = (HFONT)SelectObject(hdc, hNewFont);
//设置文本颜色
SetTextColor(hdc, RGB(0xff, 0xff, 0xff));
//设置背景为透明
SetBkMode(hdc, TRANSPARENT);
//打印文本
DrawText(hdc, _T("This is a Test."), -1, &rect, DT_SINGLELINE);
//恢复字体
SelectObject(hdc, hOldFont);
5.打印图片:
位图的普通打印:
BITMAP bitmap;
HBITMAP hBitmap = (HBITMAP)LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1));
HDC hdcTemp = CreateCompatibleDC(hdc);//创建临时DC
SelectObject(hdcTemp, hBitmap);
GetObject(hBitmap, sizeof(bitmap), &bitmap);
BitBlt(hdc, 0, 0, bitmap.bmpWidth, bitmap.bmpHeight, hdcTemp, 0, 0, SRCCOPY);
DeleteDC(hdcTemp);//删除不再使用的DC
绘制有透明色的位图:
// hdc: 窗口DC
//wImageID: 图片资源ID
//cTrans: 要过滤的颜色
// iStartX,iStartY: 打印起始位置
void DrawTransparentIcon(HDC hdc, WORD wImageID, COLORREF cTrans, int iStartX, int iStartY)
{
HBITMAP hAlarmIcon;
BITMAP bmAlarmIcon;
BOOL bRet;
hAlarmIcon = (HBITMAP)LoadBitmap(g_hInst,MAKEINTRESOURCE(wImageID));
GetObject( hAlarmIcon, sizeof(bmAlarmIcon), &bmAlarmIcon);
bRet = TransparentImage( hdc, iStartX, iStartY, bmAlarmIcon.bmWidth ,bmAlarmIcon.bmHeight,
hAlarmIcon, 0, 0, bmAlarmIcon.bmWidth ,bmAlarmIcon.bmHeight, cTrans);
DeleteObject( hAlarmIcon);
}
普通图片的打印:
void DrawImage(HDC hdc,LPCTSTR lpImagePath,int x,int y)
{
IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
RECT rc = { x, y, x+32, y+32};
// Normally you would only call CoInitialize/CoUninitialize
// once per thread. This sample calls CoInitialize in this
// draw function simply to illustrate that you must call
// CoInitialize before calling CoCreateInstance.
CoInitializeEx(NULL, COINIT_MULTITHREADED);
// Create the imaging factory.
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImgFactory)))
{
// Load the image from the JPG file.
if (SUCCEEDED(pImgFactory->CreateImageFromFile(
lpImagePath,
&pImage)))
{
// Draw the image.
pImage->Draw(hdc, &rc, NULL);
pImage->Release();
}
pImgFactory->Release();
}
CoUninitialize();
}