win32第九天

一、坐标系
1.坐标系分类
1)设备坐标系:显示器的设备坐标系,坐标原点位于左上角,X轴向右为正,Y轴向下为正,1个单位就是一个像素。
A.屏幕坐标系,以屏幕的左上角为原点。
B.窗口坐标系,以窗口的左上角为原点。
C.客户坐标系,以客户区的左上角为原点。
像素的大小与成像设备有关。
显示器的寸数就是对角线的长度。


2)逻辑坐标系:坐标单位、坐标原点、坐标轴的方向皆可设置。
在GDI绘图中所使用的坐标系都是逻辑坐标系。
默认情况下,逻辑坐标系与设备坐标系重合。
1逻辑=1设备
显示器:1设备=1像素
打印机:1设备=1/1440英寸(0.018毫米)


2.坐标映射
1)映射模式
A.确定了逻辑坐标系与设备坐标系之间的映射关系。
B.设备坐标系的单位不能通过代码修改,但是逻辑坐标系可以修改。
int SetMapMode (
  HDC hdc, // 设备上下文句柄
  int fnMapMode // 映射模式
);
成功返回原映射模式,失败返回0。
fnMapMode取值:
MM_TEXT - 正文模式:1逻辑=1像素,原点左上,X向右,Y向下。(缺省模式)
MM_LOENGLISH - 低英制模式:1逻辑=0.01英寸,原点左上,X向右,Y向上。
MM_HIENGLISH - 高英制模式:1逻辑=0.001英寸,原点左上,X向右,Y向上。
MM_LOMETRIC - 低公制模式:1逻辑=0.1毫米,原点左上,X向右,Y向上。
MM_HIMETRIC - 搞公制模式:1逻辑=0.01毫米,原点左上,X向右,Y向上。
MM_TWIPS - 打印机模式:1逻辑=1/1440英寸,原点左上,X向右,Y向上。
MM_ISOTROPIC - 各向同性模式:1逻辑=自定义,原点自定义,轴方向自定义。逻辑单位与设备单位的比例在水平和垂直方向上取一致。
MM_ANISOTROPIC - 各向异性模式:1逻辑=自定义,原点自定义,轴方向自定义。逻辑单位与设备单位的比例在水平和垂直方向上可以不一致。
2)设置逻辑单位与设备单位的比例
BOOL SetViewportExtEx (
  HDC hdc,      // 设备上下文句柄
  int nXExtent, // 设备单位X尺度
  int nYExtent, // 设备单位Y尺度
  LPSIZE lpSize // 设备单位原尺度,可为NULL
);
成功返回TRUE,失败返回FALSE。
BOOL SetWindowExtEx (
  HDC hdc,      // 设备上下文句柄
  int nXExtent, // 逻辑单位X尺度
  int nYExtent, // 逻辑单位Y尺度
  LPSIZE lpSize // 逻辑单位原尺度,可为NULL
);
成功返回TRUE,失败返回FALSE。
SetWindowExtEx (hDC, 1, 1, NULL);
SetViewportExtEx (hDC, 2, 3, NULL);
X方向:1逻辑=2设备
Y方向:1逻辑=3设备(对各向同性模式,忽略L/D值小的)
等价于:
SetWindowExtEx (hDC, 1000, 1000, NULL);
SetViewportExtEx (hDC, 2000, 3000, NULL);
改变轴的方向:
SetWindowExtEx (hDC, 1, -1, NULL);
SetViewportExtEx (hDC, 2, 3, NULL);


二、文字
1.绘制单行文字
BOOL TextOut (
  HDC     hdc,      // 设备上下文句柄
  int     nXStart,  // 文本行位置
  int     nYStart,
  LPCTSTR lpString, // 文本字符串
  int     cbString  // 字符串长度
);
成功返回TRUE,失败返回FALSE。
2.在矩形内绘制文字
int DrawText (
  HDC     hdc,      // 设备上下文句柄
  LPCTSTR lpString, // 文本字符串
  int     cbString, // 字符串长度
  LPRECT  lpRect,   // 矩形区域
  UINT    uFormat   // 文本格式
);
成功返回文本高度,失败返回0。
uFormat取值:
DT_LEFT - 靠左
DT_CENTER - 水平居中
DT_RIGHT - 靠右
DT_TOP - 靠上
DT_VCENTER - 垂直居中
DT_BOTTOM - 靠下
DT_SINGLELINE - 单行
DT_WORDBREAK - 按单词这行
DT_WORD_ELLIPSIS - 显示不下的单词以省略号表示
DT_NOCLIP - 超出矩形区域部分不做裁剪
DT_NOPREFIX - 不转义&字符
3.按照指定字间距输出文本
BOOL ExtTextOut (
  HDC         hdc,       // 设备上下文句柄
  int         X,         // 文本行位置
  int         Y,
  UINT        fuOptions, // 文本输出选项
  CONST RECT* lprc,      // 矩形区域
  LPCTSTR     lpString,  // 文本字符串
  UINT        cbCount,   // 字符串长度
  CONST INT*  lpDx       // 字间距表
);
成功返回TRUE,失败返回FALSE。
4.设置文字颜色
COLORREF SetTextColor (
  HDC      hdc,    // 设备上下文句柄
  COLORREF crColor // 文字颜色
);
成功返回原文字颜色,失败返回CLR_INVALID。
5.设置文字背景颜色
COLORREF SetBkColor (
  HDC      hdc,    // 设备上下文句柄
  COLORREF crColor // 背景颜色
);
成功返回原背景颜色,失败返回CLR_INVALID。
6.设置背景模式
int SetBkMode (
  HDC hdc,    // 设备上下文句柄
  int iBkMode // 背景模式
);
成功返回原背景模式,失败返回0。  
iBkMode取值:
TRANSPARENT - 透明模式,不绘制文本背景
OPAQUE - 非透明模式,绘制文本背景,缺省模式
三、字体
1.Windows常用字体格式:TrueType字体
每一种字体都用一个字体文件(c:/windows/fonts/xxx.ttf)保存。
双击字体文件可以看到字体名。
2.创建字体
HFONT CreateFont (
  int nHeight, // 字体高度
  int nWidth, // 字体宽度
  int nEscapement, // 倾斜角度
  int nOrientation, // 旋转角度,没用,填0
  int fnWeight, // 字体粗细
  DWORD fdwItalic, // 斜体
  DWORD fdwUnderline, // 下划线
  DWORD fdwStrikeOut, // 删除线
  DWORD fdwCharSet, // 字符集,GB2312_CHARSET
  DWORD fdwOutputPrecision, // 输出精度,置0
  DWORD fdwClipPrecision, // 剪切精度,置0
  DWORD fdwQuality, // 输出质量,置0
  DWORD fdwPitchAndFamily, // 匹配字体
  LPCTSTR lpszFace // 字体名
);
成功返回字体句柄,失败返回NULL。
HFONT CreateFontIndirect(
  CONST LOGFONT *lplf // 逻辑字体结构
);
3.应用字体
HFONT hfontOld = SelectObject (hDC, hfontNew);
4.绘制文字
TextOut/DrawText/ExtTextOutEx
5.恢复字体
SelectObject (hDC, hfontOld);
6.删除字体
DeleteObject (hfontNew);
练习:在窗口中显示时钟。
文字:FreeType开源的
2D图形:Cario开源的
图像:xImage
3D渲染:Direct3D
#include<math.h>
 在窗口处理函数中:
//跟踪窗口大小
static SIZE sizeClient={0};
static tm tmLocal={0};
static HPEN hpenHour=NULL;
static HPEN hpenMin=NULL;
static HPEN hpenSec=NULL;
case WM_SIZE:
sizeClient.cx=LOWORD(lParam);
sizeClient.cy=HIWORD(lParam);
break;
case WM_PAINT{
PAINTSTRUCT ps;
HDC hDC=BeginPaint(hWnd,&ps);
//将圆点中心放在客户区中心
SetViewportOrgEx(hDC,sizeClient.cx/2,sizeClient.cy/2,NULL);
int nRadius=min(sizeClient.cx,sizeClient.cy)/2;
double fAngle;//保存角度
//先把表画出来
for(fAngle=0.0,fAngle<2*3.14159;fAngle+=3.14159/6){
MoveToEx(hDC,(int)(nRadius*cos(fAngle)*4/5+0.5),(int)(nRadius*sin(fAngle)*4/5+0.5),NULL);
LineTo(hDC,(int)(nRadius*cos(fAngle)+0.5),(int)(nRadius*sin(fAngle)+0.5);
}
//根据时间值来画针
//时针
HPEN hpenOld=SelectObject(hDC,hpenHour);
fAngle=(tmLocal.tm_hour+tmLocal.tm_min/60.0+tmLocal.tm_sec/3600.0)*3.14159/6-3.14159/2;
MoveToEx(hDC,0,0,NULL);
LineTo(hDC,(int)(nRadius*cos(fAngle)*2/3+0.5),(int)(nRadius*sin(fAngle*2/3+0.5));
//分针
SelectObject(hDC,hpenMin);
fAngle=(tmLocal.tm_min+tmLocal.tm_sec/60.0)*3.14159/30-3.14159/2;
MoveToEx(hDC,0,0,NULL);
LineTo(hDC,(int)(nRadius*cos(fAngle)*8/9+0.5),(int)(nRadius*sin(fAngle*8/9+0.5));
//秒针
fAngle=(tmLocal.tm_sec)*3.14159/30-3.14159/2;
MoveToEx(hDC,0,0,NULL);
LineTo(hDC,(int)(nRadius*cos(fAngle)+0.5),(int)(nRadius*sin(fAngle+0.5));
SelectObject(hDC,hpenOld);
Ellipse(hDC,-nRadius/20,-nRadius/20,nRadius/20,nRadius/20);
EndPaint(hWnd,&ps);
break;
}
case WM_CREATE:{
tim_t t=time(NULL);
tmLocal=*localtime(&t);
SetTimer(hWnd,IDT_TICK,1000,NULL);
hpenHour=CreatePen(PS_SOLID,6,RGB(0,0,255));
hpenMin=CreatePen(PS_SOLID,3,RGB(0,128,0));
hpenSec=CreatePen(PS_SOLID,1,RGB(255,0,0));
return 0;
}
//定时器
case WM_TIMER:
tim_t t=time(NULL);
tmLocal=*local(hWnd,TRUE);
InvalidateRect(hWnd,NULL,TRUE);
case WM_DESTROY:
DeleteObject(hpenHour);
DeleteObject(hpenMin);
DeleteObject(hpenSec);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
I.WebKit介绍 5 一.WebKit是什么? 5 二.WebKit主要特点和目标 5 三.WebKit主要组成 7 II.WebKit之WebCore介绍 7 一.WebCore所包含的主要内容 7 1.目录结构 7 2.主要数据结构 9 二.一个Http请求在WebCore中的主要流程 13 1.WebKit工作流程 13 2.处理流程 15 3.代码流程 18 三.网络库、图形库、Javascript实现与WebCore的集成 22 III.WebKit之Port介绍 23 一.有关Port方面的概述 23 二.WebKit Port移植实现分析 24 1.WebCore交互接口 24 2.连接模块loader 26 3.显示模块WebView和WebFrame 26 4.Chrome中对Port移植方面的实现 27 5.Android中对Port移植方面的实现 28 6.结论 28 三.如何利用WebKit? 30 1.利用WebKit实现搜索引擎 30 2.利用WebKit实现平台功能 31 3.高性能的渲染工具 31 IV.WebKit之图形库介绍 32 一.WebKit与图形库 32 二.图形库概述及其主要功能 32 三.WebKit与Cario 34 四.WebKit如何支持不同图形库的实现 35 五.WebKit 3D Port实现 39 六.总结 40 V.WebKit之网络库介绍 40 一.网络原理 40 1.超文本传输协议 40 2.URL类 41 3.Page 类 42 4.与服务器的连接 45 二.WebKit与CURL网络库 46 VI.WebKit之DOM分析 47 一.DOM原理 47 1.DocView 模型 47 2.抽象网页表示 49 3.DOM解析基本算法 52 二.WebKit DOM代码解析流程 57 VII.WebKit之布局分析 57 一.基本概念 57 1.CSS布局相关标准介绍 58 2.布局页面的基本概念 58 3.如何确定页面元素显示位置 60 4.如何确定页面元素大小 61 5.如何理解z-index的使用 61 6.总结 62 二.WebKit主要布局框架 62 1.基类RenderObject 63 2.子类RenderBox 66 3.子类RenderContainer 67 4.子类RenderFlow 68 5.子类RenderBlock 68 6.子类RenderInline 69 7.子类RenderText 70 8.子类RenderImage 71 9.子类RenderView 71 10.子类RenderButton 72 11.子类RenderTextControl 74 12.子类RenderListBox 77 13.子类RenderTheme 78 14.子类RenderTable、RenderTableRow、RenderTableCol、RenderTableCell 81 15.子类RenderFrame 83 三.CSS属性的描述 84 1.RenderStyle类 84 2.RenderStyle类主要方法 84 四.RenderObject及子类对象的生成 84 1.CSSParser 84 2.CSSStyleSelector类 86 3.构建Render树 86 五.Render树与RenderLayer树 88 1.构建Render树的基本实现流程 88 2.RenderLayer类分析 92 3.构建RenderLayer树 94 4.RenderLayer树与Render树的关系 96 5.RenderLayer树的作用 98

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值