【分享】在一块空间中鼠标中键平移缩放图像

crystal_lz 2012-10-29 03:19:17
按照国际惯例 效果图:

下载地址
http://download.csdn.net/detail/crystal_lz/4696976

这几天 一朋友问我 在一个逻辑空间中操作图像的问题
干脆 就搞了一个例子 这里只是部分基本功能
鼠标中键点下平移图像
鼠标中键滚动的时候 根据鼠标的位置缩放图像

图像右上角对应的是 鼠标当前位置
在picturebox上的坐标 和 在空间中的画布的坐标系中的一个虚拟的坐标

图像中间两条粗的线 就是在空间中的一个虚拟的坐标系

然后左上角显示的是
缩放比
空间坐标系原点坐标位置对应在设备上面的坐标
pictrueBox左上角的位置在 空间坐标系中的坐标
pictrueBox右下角的位置在 空间坐标系中的坐标
当前pictrueBox显示的空间中的内容的大小

本来觉得 这东西没必要发上来的 但是想着反正都做了 估计有人需要 就发上来分享了
...全文
838 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-07-04
  • 打赏
  • 举报
回复
能不能转成MFC写的?
handanxtltxk 2012-12-01
  • 打赏
  • 举报
回复
做的很精彩,有点3DMAX的意思
sosoben 2012-10-29
  • 打赏
  • 举报
回复
挺好的,放大后图像画质怎么样??
XBodhi. 2012-10-29
  • 打赏
  • 举报
回复
收藏了
crystal_lz 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

挺好的,放大后图像画质怎么样??
[/Quote]
= =!、、中间那个图像 就是一个摆设而已
这东西 的主要意义 不在于 操作中间那个图 而是 整个虚拟的空间
一般 这样的程序 是在空间绘制图形用的 这里 只是搭建了一个虚拟空间而已 中间的图只是为了呈现空间的变化的
crystal_lz 2012-10-29
  • 打赏
  • 举报
回复
忘了贴代码了 反正也就一百多行
有啥写的不对的地方还请包涵

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace ImageScale
{
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
this.StartPosition = FormStartPosition.CenterScreen;
this.pictureBox1.BorderStyle = BorderStyle.FixedSingle;
this.pictureBox1.BackColor = Color.DarkGray;
this.pictureBox1.MouseWheel += new MouseEventHandler(pictureBox1_MouseWheel);
}

Bitmap m_bmp; //画布中的图像
Point m_ptCanvas; //画布原点在设备上的坐标
Point m_ptCanvasBuf; //重置画布坐标计算时用的临时变量
Point m_ptBmp; //图像位于画布坐标系中的坐标
float m_nScale = 1.0F; //缩放比例

Point m_ptMouseDown; //鼠标点下是在设备坐标上的坐标

string m_strMousePt; //鼠标当前位置对应的坐标

private void Form1_Load(object sender, EventArgs e) {
m_bmp = GetScreen();
//初始化 坐标
m_ptCanvas = new Point(pictureBox1.Width / 2, pictureBox1.Height / 2);
m_ptBmp = new Point(-(m_bmp.Width / 2), -(m_bmp.Height / 2));
}
//获取屏幕图像
public Bitmap GetScreen() {
Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);
using (Graphics g = Graphics.FromImage(bmp)) {
g.CopyFromScreen(0, 0, 0, 0, bmp.Size);
}
return bmp;
}
//重绘图像
private void pictureBox1_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
g.TranslateTransform(m_ptCanvas.X, m_ptCanvas.Y); //设置坐标偏移
g.ScaleTransform(m_nScale, m_nScale); //设置缩放比
g.DrawImage(m_bmp, m_ptBmp); //绘制图像

g.ResetTransform(); //重置坐标系
Pen p = new Pen(Color.Cyan, 3);
g.DrawLine(p, 0, m_ptCanvas.Y, pictureBox1.Width, m_ptCanvas.Y);
g.DrawLine(p, m_ptCanvas.X, 0, m_ptCanvas.X, pictureBox1.Height);
p.Dispose();
//绘制网格线
float nIncrement = (50 * m_nScale); //网格间的间隔 根据比例绘制
for (float x = m_ptCanvas.X; x > 0; x -= nIncrement)
g.DrawLine(Pens.Cyan, x, 0, x, pictureBox1.Height);
for (float x = m_ptCanvas.X; x < pictureBox1.Width; x += nIncrement)
g.DrawLine(Pens.Cyan, x, 0, x, pictureBox1.Height);
for (float y = m_ptCanvas.Y; y > 0; y -= nIncrement)
g.DrawLine(Pens.Cyan, 0, y, pictureBox1.Width, y);
for (float y = m_ptCanvas.Y; y < pictureBox1.Width; y += nIncrement)
g.DrawLine(Pens.Cyan, 0, y, pictureBox1.Width, y);
//计算屏幕左上角 和 右下角 对应画布上的坐标
Size szTemp = pictureBox1.Size - (Size)m_ptCanvas;
PointF ptCanvasOnShowRectLT = new PointF(
-m_ptCanvas.X / m_nScale, -m_ptCanvas.Y / m_nScale);
PointF ptCanvasOnShowRectRB = new PointF(
szTemp.Width / m_nScale, szTemp.Height / m_nScale);
//显示文字信息
string strDraw = "Scale: " + m_nScale.ToString("F1") +
"\nOrigin: " + m_ptCanvas.ToString() +
"\nLT: " + Point.Round(ptCanvasOnShowRectLT).ToString() +
"\nRB: " + Point.Round(ptCanvasOnShowRectRB).ToString() +
"\n" + ((Size)Point.Round(ptCanvasOnShowRectRB)
- (Size)Point.Round(ptCanvasOnShowRectLT)).ToString();
Size strSize = TextRenderer.MeasureText(strDraw, this.Font);
//绘制文字信息
SolidBrush sb = new SolidBrush(Color.FromArgb(125, 0, 0, 0));
g.FillRectangle(sb, 0, 0, strSize.Width, strSize.Height);
g.DrawString(strDraw, this.Font, Brushes.Yellow, 0, 0);
strSize = TextRenderer.MeasureText(m_strMousePt, this.Font);
g.FillRectangle(sb, pictureBox1.Width - strSize.Width, 0, strSize.Width, strSize.Height);
g.DrawString(m_strMousePt, this.Font, Brushes.Yellow, pictureBox1.Width - strSize.Width, 0);
sb.Dispose();
}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Middle) { //如果中键点下 初始化计算要用的临时数据
m_ptMouseDown = e.Location;
m_ptCanvasBuf = m_ptCanvas;
}
pictureBox1.Focus();
}
//平移图像
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Middle) { //移动过程中 中键点下 重置画布坐标系
//我总感觉这样写不妥 但却是方便计算 如果多次这样搞的话 还是重载操作符吧
m_ptCanvas = (Point)((Size)m_ptCanvasBuf + ((Size)e.Location - (Size)m_ptMouseDown));
pictureBox1.Invalidate();
}
//计算 右上角显示的坐标信息
SizeF szSub = (Size)e.Location - (Size)m_ptCanvas; //计算鼠标当前点对应画布中的坐标
szSub.Width /= m_nScale;
szSub.Height /= m_nScale;
Size sz = TextRenderer.MeasureText(m_strMousePt, this.Font); //获取上一次的区域并重绘
pictureBox1.Invalidate(new Rectangle(pictureBox1.Width - sz.Width, 0, sz.Width, sz.Height));
m_strMousePt = e.Location.ToString() + "\n" + ((Point)(szSub.ToSize())).ToString();
sz = TextRenderer.MeasureText(m_strMousePt, this.Font); //绘制新的区域
pictureBox1.Invalidate(new Rectangle(pictureBox1.Width - sz.Width, 0, sz.Width, sz.Height));
}
//缩放图像
private void pictureBox1_MouseWheel(object sender, MouseEventArgs e) {
if (m_nScale <= 0.3 && e.Delta <= 0) return; //缩小下线
if (m_nScale >= 4.9 && e.Delta >= 0) return; //放大上线
//获取 当前点到画布坐标原点的距离
SizeF szSub = (Size)m_ptCanvas - (Size)e.Location;
//当前的距离差除以缩放比还原到未缩放长度
float tempX = szSub.Width / m_nScale; //这里
float tempY = szSub.Height / m_nScale; //将画布比例
//还原上一次的偏移 //按照当前缩放比还原到
m_ptCanvas.X -= (int)(szSub.Width - tempX); //没有缩放
m_ptCanvas.Y -= (int)(szSub.Height - tempY); //的状态
//重置距离差为 未缩放状态
szSub.Width = tempX;
szSub.Height = tempY;
m_nScale += e.Delta > 0 ? 0.2F : -0.2F;
//重新计算 缩放并 重置画布原点坐标
m_ptCanvas.X += (int)(szSub.Width * m_nScale - szSub.Width);
m_ptCanvas.Y += (int)(szSub.Height * m_nScale - szSub.Height);
pictureBox1.Invalidate();
}
}
}
crystal_lz 2012-10-29
  • 打赏
  • 举报
回复 1
不得不说句 下载了几个录制gif的工具 没一个顺手的 也不知道平时大家录制gif用的都是啥软件
当时本想着 干脆以后要用自己写一个 仔细一想自己写一个估计也好不到哪去 顶多加上一些自己的习惯
浩辰CAD8最新版本提供了完备的注释性比例(Annotative Scale)功能,并根据用户提交的需求对字段(FIELD)、自定义界面(CUI)、查找、标注、打印等一些重点功能进行了改进。经过上千用户的验证测试,软件的正确性和稳定性均有明显提升。 一、64位浩辰CAD软件 由于Windows操作系统所限,32位软件只能分配使用2G内存。64位版本的浩辰CAD8可以充分利用用户更大的物理内存,顺畅打开和编辑占用内存很多的超大型图纸。 二、新增和重点改进功能介绍 1、注释性比例 浩辰CAD8 增加了对象、空间、视口的注释性比例和相关设置功能。调整空间和视口的注释比例,文字、标注、图块、填充等注释性对象的尺寸将自动调整,用户可以更快速地实现多比例地布图、出图。 注释对象比例(OBJECTSCALE):可设置注释性的对象是多比例打印出图时要求尺寸一致的图面元素,例如文字、标注、填充、符号图块等。对象注释比例可通过命令、右键菜单、属性框多种方式进行添加,一个对象可设置多个比例,通过设置空间或视口的注释比例可控制对象的显示比例。 注释比例(CANNOSCALE):模型空间或布局空间视口可设置注释比例,用于控制注释性对象的显示比例。比如用户如果想分别按1:100、1:50和1:20打印同一张图纸,只需要调整空间的注释比例,文字和标注箭头大小就会自动调整,保证最终不同比例打印的文字高度和标注的大小是一致的,如下图所示。 在布局空间如果要设置不同比例的多个视口时,利用注释性比例可让所有视口的文字、标注等图形的打印尺寸保持一致,如下图所示。 浩辰CAD8在底部状态栏增加了用于设置注释比例、控制注释性对象显示及添加比例的按钮,常规状态下状态栏按钮显示为: ,布局空间视口后按钮显示为: 。 2、字段(FIELD) 字段增加了”对象(OBJECT)”类别,用户可以将对象属性或公式作为字段内容。比如可以选择一个填充的面积作为字段内容,当填充边界被编辑后,字段将自动更新,如下图所示。 注:图形调整后,需要RE(重生成)后字段的数值才会更新。 三、近期增加的重要功能 1、放大镜 利用放大镜功能可以减少视图缩放的次数,提高操作的效率。当图形比较密集,需要观察图形的局部细节或者进行准确定位时,可打开放大镜,关闭放大镜即可返回原始视图。放大镜效果如下图所示。 与缩放平移操作类似,可以利用鼠标来调用放大镜功能。在状态栏按下启用鼠标激活放大镜的按钮,单击鼠标就可打开或关闭放大镜。 如果不想用鼠标,可以用快捷键CTRL E来开关放大镜,此快捷键还可根据自己的喜好在CUI(自定义用户界面)对话框定制。 放大镜分为“区域”和“窗口”两种模式,右键单击 按钮可以在对话框设置放大镜的模式、放大镜形状、初始放大倍数、放大镜尺寸以及放大镜外围图形的褪色度。 区域 只在放大镜区域内放大图形,保留背景图形不变。如需要在绘图过程使用放大镜,可先执行命令,光标定位到需要放大的区域时按快捷键打开放大镜,完成操作后,按快捷键关闭放大镜。放大镜打开时,放大镜范围内可以自由进行缩放平移,绘图等操作。 窗口 整个图形按倍数放大,充满整个图形窗口。此时光标不受任何限制,可以在整个图形窗口进行视图缩放、捕捉、绘图等各种操作,关闭放大镜可立刻返回原始视图。 2、 自定义用户界面(CUI) 全新开发的CUI功能相比2012版有质的飞越,不仅提供了更全面的功能,而且从用户体验的角度出发,简化了对话框的结构、增强了操作的交互性。 RIBBON界面和经典界面均可定制,功能更全面。 新版CUI不仅可以定制经典界面的菜单、工具栏,也可以定义RIBBON界面的面板、选项卡,同时还可以定义快速访问工具栏、快捷菜单、键盘快捷键和双击动作。 面板的定制界面和各种控件 将界面元素定义和工作空间分开,结构更清晰。 同类软件CUI界面将工作空间与界面元素都放到一个树形列表,如果想从树形列表将某一个元素拖放到某个工作空间里,不仅操作麻烦,而且经常会定位错误。浩辰CAD8将工作空间提取出来,定义工作空间时在左右两个树形列表间进行拖放,操作简便,且不易误操作。 提供更丰富的操作方式,交互性更好。 CUI对话框主要采用右键菜单和拖放两种操作模式,由于元素定义的树状列表很复杂,浩辰CAD8尽可能提供简便的操作方式。在定义面板时,用户不仅可以将命令拖放到树状列表,也可以将命令拖放到面板预览,还可以再面板预览拖放命令。 3、 多重引线(MLEADER) 多重引线功能是引线功能的延伸,它可以方便地为序号标注添加多个引线,可以合并或对齐多个引线标注,在装配图、组装图上有十分重要的作用。 浩辰CAD8提供了多重引线的全部功能,用户可以设置多重引线样式、创建引线、增加和删除引线,并且可以进行引线对齐和合并。如下图所示。 四、其他重点改进功能 1、打印:布局空间打印支持缩放线宽,光栅图像虚拟打印机可以按像素来设置输出尺寸;解决了少数图纸OLE图片打印反向以及个别打印设备无法显示横、纵向纸张等问题。 2、查找(FIND):对查找替换功能进行了系统改进,提升了查找替换的正确性,并同时改进了缩放和创建选择集操作的准确性。 3、填充:增加了大量自定义填充。自定义填充不仅支持添加单个填充文件,也可以将所有自定义填充全部添加到gcadusr.pat,方便填充图案的管理。 4、线型:在线型文件增加了一些特殊的线型。 5、参照裁剪(XCLIP):解决了反向裁剪无效的问题 6、多段线编辑(PEDIT):先选择多个图形后不再提示输入M及选择对象,可直接进行相关操作。 7、三维转平面(FLATTEN):解决了图块和多段线在转换被炸开的问题。
第1章 基础知识 1 1.1 canvas元素 1 1.1.1 canvas元素的大小与绘图表面的大小 4 1.1.2 canvas元素的api 5 1.2 canvas的绘图环境 6 1.2.1 2d绘图环境 6 1.2.2 canvas状态的保存与恢复 8 1.3 本书程序清单的规范格式 9 1.4 开始学习html5 10 1.4.1 规范 10 1.4.2 浏览器 11 1.4.3 控制台与调试器 11 1.4.4 性能 13 1.5 基本的绘制操作 15 1.6 事件处理 18 1.6.1 鼠标事件 18 1.6.2 键盘事件 22 .1.6.3 触摸事件 23 1.7 绘制表面的保存与恢复 23 1.8 在canvas使用html元素 25 1.9 打印canvas的内容 32 1.10 离屏canvas 35 1.11 基础数学知识简介 37 1.11.1 求解代数方程 37 1.11.2 三角函数 38 1.11.3 向量运算 39 1.11.4 根据计量单位来推导等式 42 1.12 总结 44 第2章 绘制 45 2.1 坐标系统 46 2.2 canvas的绘制模型 47 2.3 矩形的绘制 48 2.4 颜色与透明度 50 2 .5 渐变色与图案 52 2.5.1 渐变色 52 2.5.2 图案 54 2.6 阴影 57 2.7 路径、描边与填充 60 2.7.1 路径与子路径 63 2.7.2 剪纸效果 64 2.8 线段 69 2.8.1 线段与像素边界 70 2.8.2 网格的绘制 71 2.8.3 坐标轴的绘制 72 2.8.4 橡皮筋式的线条绘制 74 2.8.5 虚线的绘制 79 2.8.6 通过扩展canvasrenderingcontext2d来绘制虚线 80 2.8.7 线段端点与连接点的绘制 81 2.9 圆弧与圆形的绘制 83 2.9.1 arc()方法的用法 83 2.9.2 以橡皮筋式辅助线来协助用户画圆 85 2.9.3 arcto()方法的用法 86 2.9.4 刻度仪表盘的绘制 88 2.10 贝塞尔曲线 93 2.10.1 二次方贝塞尔曲线 93 2.10.2 三次方贝塞尔曲线 95 2.11 多边形的绘制 97 2.12 高级路径操作 102 2.12.1 拖动多边形对象 102 2.12.2 编辑贝塞尔曲线 107 2.12.3 自动滚动网页,使某段路径所对应的元素显示在视窗 115 2.13 坐标变换 116 2.13.1 坐标系的平移缩放与旋转 116 2.13.2 自定义的坐标变换 119 2.14 图像合成 123 2.15 剪辑区域 128 2.15.1 通过剪辑区域来擦除图像 128 2.15.2 利用剪辑区域来制作伸缩式动画 133 2.16 总结 135 第3章 文本 137 3.1 文本的描边与填充 137 3.2 设置字型属性 141 3.3 文本的定位 144 3.3.1 水平与垂直定位 144 3.3.2 将文本居 146 3.3.3 文本的度量 147 3.3.4 绘制坐标轴旁边的文本标签 148 3.3.5 绘制数值仪表盘周围的文本标签 151 3.3.6 在圆弧周围绘制文本 152 3.4 实现文本编辑控件 154 3.4.1 指示文本输入位置的光标 154 3.4.2 在canvas编辑文本 159 3.4.3 文本段的编辑 163 3.5 总结 174 第4章 图像与视频 175 4.1 图像的绘制 176 4.1.1 在canvas之绘制图像 176 4.1.2 drawimage()方法的用法 177 4.2 图像缩放 179 4.3 将一个canvas绘制到另一个canvas之 183 4.4 离屏canvas 186 4.5 操作图像的像素 189 4.5.1 获取图像数据 189 4.5.2 修改图像数据 195 4.6 结合剪辑区域来绘制图像 208 4.7 以图像制作动画 211 4.8 图像绘制的安全问题 216 4.9 性能 216 4.9.1 对比drawimage(htmlimage)、drawimage(htmlcanvas)与putimagedata()的绘图效率 217 4.9.2 在canvas绘制另一个canvas与绘制普通图像之间的对比;在绘制时缩放图像与保持原样之间的对比 217 4.9.3 遍历图像数据 218 4.10 放大镜 222 4.10.1 使用离屏canvas 224 4.10.2 接受用户从文件系统拖放进来的图像 225 4.11 视频处理 227 4.11.1 视频格式 227 4.11.2 在canvas播放视频 229 4.11.3 视频处理 230 4.12 总结 234 第5章 动画 235 5.1 动画循环 235 5.1.1 通过requestanimationframe()方法让浏览器来自行决定帧速率 237 5.1.2 internet explorer浏览器对requestanimationframe()功能的实现 241 5.1.3 可移植于各浏览器平台的动画循环逻辑 241 5.2 帧速率的计算 248 5.3 以不同的帧速率来执行各种任务 249 5.4 恢复动画背景 250 5.4.1 利用剪辑区域来处理动画背景 250 5.4.2 利用图块复制技术来处理动画背景 252 5.5 利用双缓冲技术绘制动画 253 5.6 基于时间的运动 254 5.7 背景的滚动 257 5.8 视差动画 261 5.9 用户手势 264 5.10 定时动画 266 5.10.1 秒表 266 5.10.2 动画计时器 269 5.11 动画制作的最佳指导原则 270 5.12 总结 271 第6章 精灵 272 6.1 精灵概述 273 6.2 精灵绘制器 275 6.2.1 描边与填充绘制器 275 6.2.2 图像绘制器 279 6.2.3 精灵表绘制器 281 6.3 精灵对象的行为 284 6.3.1 将多个行为组合起来 285 6.3.2 限时触发的行为 287 6.4 精灵动画制作器 289 6.5 基于精灵的动画循环 293 6.6 总结 294 第7章 物理效果 295 7.1 重力 295 7.1.1 物体的下落 296 7.1.2 抛射体弹道运动 298 7.1.3 钟摆运动 307 7.2 时间轴扭曲 311 7.3 时间轴扭曲函数 315 7.4 时间轴扭曲运动 317 7.4.1 没有加速度的线性运动 319 7.4.2 逐渐加速的缓入运动 320 7.4.3 逐渐减速的缓出运动 322 7.4.4 缓入缓出运动 323 7.4.5 弹簧运动与弹跳运动 324 7.5 以扭曲后的帧速率播放动画 326 7.6 总结 332 第8章 碰撞检测 333 8.1 外接图形判别法 333 8.1.1 外接矩形判别法 333 8.1.2 外接圆判别法 334 8.2 碰到墙壁即被弹回的小球 336 8.3 光线投射法 337 8.4 分离轴定理(sat)与最小平移向量(mtv) 340 8.4.1 使用分割轴定理检测碰撞 340 8.4.2 根据最小平移向量应对碰撞 362 8.5 总结 373 第9章 游戏开发 374 9.1 游戏引擎 374 9.1.1 游戏循环 376 9.1.2 加载图像 382 9.1.3 同时播放多个声音 384 9.1.4 键盘事件 385 9.1.5 高分榜 386 9.1.6 游戏引擎源代码 387 9.2 游戏原型 395 9.2.1 游戏原型程序的html代码 396 9.2.2 原型程序的游戏循环 399 9.2.3 游戏原型程序的加载画面 400 9.2.4 暂停画面 402 9.2.5 按键监听器 404 9.2.6 游戏结束及高分榜 404 9.3 弹珠台游戏 407 9.3.1 游戏循环弹珠 408 9.3.2 弹珠精灵 410 9.3.3 重力与摩擦力 411 9.3.4 弹板的移动 412 9.3.5 处理键盘事件 413 9.3.6 碰撞检测 416 9.4 总结 425 第10章 自定义控件 426 10.1 圆角矩形控件 427 10.2 进度条控件 433 10.3 滑动条控件 437 10.4 图像查看器控件 446 10.5 总结 454 第11章 移动平台开发 455 11.1 移动设备的视窗 456 11.2 媒体特征查询技术 461 11.2.1 媒体特征查询与css 461 11.2.2 用javascript程序应对媒体特征的变化 462 11.3 触摸事件 464 11.3.1 touchevent对象 464 11.3.2 touchlist对象 465 11.3.3 touch对象 466 11.3.4 同时支持触摸事件与鼠标事件 466 11.3.5 手指缩放 468 11.4 ios5 469 11.4.1 应用程序图标及启动画面 469 11.4.2 利用媒体特征查询技术设置ios5系统的应用程序图标及启动画面 470 11.4.3 以不带浏览器饰件的全屏模式运行应用程序 471 11.4.4 应用程序的状态栏 471 11.5 虚拟键盘 472 11.6 总结 485
Contents 开发桌面应用 设置开发环境 系统要求 安装开发人员工具 启用设备进行开发 开发人员模式功能和调试 创建一个开发者帐户 入门 概述 适用于 Windows 应用的 Visual Studio 模板 生成适用于 Windows 11 的应用 让你的应用在 Windows 11 上出色表现 设计和 UI 概述 Windows 11 的设计 Windows 11 设计原则 Windows 11 签名体验 Geometry 颜色 分层和提升 材料 图标 版式 设计基础知识 概述 应用设计简介 导航基础知识 概述 实现基本导航 导航历史记录和向后导航 命令基础知识 内容基础知识 教程 创建用户界面 创建自适应布局 设置控件的样式 布局 概述 页面布局 屏幕大小和断点 响应式设计技术 使用 XAML 的布局 显示多个视图 显示多个视图 使用 AppWindow 使用 ApplicationView 对齐、边距和填充 面板 概述 教程:使用布局面板 拆分视图 自定义面板 自定义面板示例:BoxPanel 附加的布局 转换 概述 3D 透视效果 Z 深度和阴影 控制 概述 控件和事件简介 命令处理简介 基本输入 按钮 复选框 组合框和列表框 超链接 单选按钮 评分控件 滑块 切换开关 集合 概述 列表视图和网格视图 翻转视图 PipsPager 树视图 ItemsRepeater 项目容器和模板 项目容器和模板 数据模板选择 列表视图项模板 网格视图项模板 选择和交互 集合命令处理 “选择模式”概述 轻扫 下拉刷新 筛选集合 其他集合选项和自定义 反转列表 嵌套 UI 对话框和浮出控件 概述 对话框 浮出控件 教学提示 窗体 媒体、图形和形状 动画图标 图像图像画笔 墨迹 媒体播放 自定义传输控件 形状 Web 视图 菜单和工具栏 菜单和上下文菜单 命令栏 命令栏浮出控件 菜单浮出控件和菜单栏 导航 痕迹导航栏 列表/详细信息 导航视图 Pivot 选项卡视图 人员 联系人卡片 头像图片 选取器 颜色选取器 日期和时间控件 日历日期选取器 日历视图 日期选取器 时间选取器 滚动和布局 Expander 滚动和平移控件 语义式缩放 双窗格视图 状态和信息 进度 工具提示 信息栏 文本 概述 自动建议框 文本块 RTF 块 文本框 富编辑框 密码框 数字框 标签 内容链接 手写视图 样式 概述 颜色 版式 图标 概述 应用图标和徽标 Segoe MDL2 图标 亚克力 Mica 显示焦点 声音 写入样式 XAML 画笔 XAML 样式 XAML 控件模板 ResourceDictionary 和 XAML 资源引用 XAML 主题资源 间距 角半径 移动 概述 计时和缓动 方向性和引力 运动练习 页面过渡 连贯的动画 视差 XAML 的动画 属性动画 情节提要动画 关键帧以及缓动函数动画 Shell Toast 通知 UX 指南 发送本地 Toast C# 应用 C++ UWP 应用 C++ WRL 应用 其他应用 Toast 内容 Content 架构 计划 toast 其他功能 自定义音频 进度条 挂起更新 自定义时间戳 集合 标头 通知侦听器 已过时 锁屏提醒通知 推送通知 概述 WNS 优先级 将 WNS 流量加入允许列表 由推送通知向导生成的代码 任务栏 将应用固定到任务栏 标题栏 动态磁贴 辅助磁贴 指南 固定到“开始”屏幕 固定到任务栏 桌面应用程序 磁贴内容 磁贴内容架构 特殊磁贴模板 发送本地磁贴通知 可追踪的磁贴通知 主要磁贴 API 磁贴和 Toast 通知的语言、比例和高对比度支持 杂项 通知可视化工具 通知传递方法 通知通道类型 使用 Webpush 和 VAPID 的备用通道 定期通知 输入和交互 概述 输入基础版 指针输入 凝视 笔和 Windows Ink 教程:向应用添加墨迹支持 识别笔划墨迹 存储和检索笔划墨迹 添加 InkToolbar 触摸 鼠标 Keyboard 访问键 键盘加速键 键盘事件 适用于键盘、手柄、遥控器和辅助功能工具的焦点导航 编程焦点导航 响应触摸键盘的存在 使用输入范围更改触摸键盘 文本输入 自定义文本输入 文本缩放 选择文本和图像 输入法编辑器 输入法编辑器要求 ......

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧