你要的这些效果只是改变字体。
HFONT CreateFont(
int nHeight, // height of font
int nWidth, // average character width
int nEscapement, // angle of escapement
int nOrientation, // base-line orientation angle
int fnWeight, // 粗细程度
DWORD fdwItalic, // italic attribute option
DWORD fdwUnderline, // 下划线
DWORD fdwStrikeOut, // strikeout attribute option
DWORD fdwCharSet, // character set identifier
DWORD fdwOutputPrecision, // output precision
DWORD fdwClipPrecision, // clipping precision
DWORD fdwQuality, // output quality
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace // typeface name
);
这个API返回句柄HFONT类型。
然后通过SelectObject来和控件关联。
HGDIOBJ SelectObject(
HDC hdc, // handle to DC
HGDIOBJ hgdiobj // handle to object
);
首先要获得控件的DC,通过GetDC这个API获得。
然后SelectObject( hdc, hfont );
用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器的方法:
1、打开visual C++ 60-文件-新建-文件-C++ Source File;
2、输入预处理命令和主函数:
#include<stdioh> /函数头:输入输出头文件/
void main()/空类型:主函数/
3、定义变量:
int a,b,d; /定义变量的数据类型为整型/
char c;/定义变量的数据类型为字符型/
4、输入四则运算式:
printf("输入如“34”或“5+2”的四则运算式:");/输出文字提示/
scanf("%d%c%d",&a,&c,&b);/输入四则运算式/
5、判断运算符号:
switch(c) /判断运算符号/
{
case'+':d=a+b;break;/进行加法运算/
case'-':d=a-b;break;/进行减法运算/
case'':d=ab;break;/进行乘法运算/
case'/':d=a/b;break; /进行除法运算/
}
6、输出结果:
printf("%d%c%d=%d\n",a,c,b,d);/输出结果/
完整的源代码:
#include<stdioh> /函数头:输入输出头文件/
void main()/空类型:主函数/
{
int a,b,d;/定义变量的数据类型为整型/
char c;/定义变量的数据类型为字符型/
printf("输入如“34”或“5+2”的四则运算式:");/输出文字提示/
scanf("%d%c%d",&a,&c,&b);/输入四则运算式/
switch(c)/判断运算符号/
{
case'+':d=a+b;break;/进行加法运算/
case'-':d=a-b;break;/进行减法运算/
case'':d=ab;break;/进行乘法运算/
case'/':d=a/b;break;/进行除法运算/
}
printf("%d%c%d=%d\n",a,c,b,d);/输出结果/
}
见MSDN:
HasDC 属性
返回或设置一个值,以决定唯一显示上下文(或 hDC )是否被分配给控件。
语法
objectHasDC [ = boolean]
HasDC 属性语法包含下面部分:
部分 描述
object 对象表达式,其值是“应用于”列表中的一个对象。
boolean 布尔表达式,指示该控件是否显示只读属性的文件,“设置值”中有详细描述,。
设置值
boolean的设置值如下:
设置值 描述
True (缺省)分配一个hDC 给控件。
False 不分配hDC 给控件。
说明
如果HasDC 属性设置为 False, 则只能将控件的 hDC 复制到一个局部变量。用一个事件范围之外得到的hDC 调用APIs 会引起冲突或其它不可预料的结果。
对于无窗口的 UserControls,只有UserControl 是由一个窗口(即,它是在一个不支持无窗口激活的容器中,例如 Visual Basic 40版或Internet Explorer 30版)创建时,HasDC属性才起作用 被无窗口激活地无窗口UserControls 决不会有自己的 hDC,因此忽略它们的HasDC 属性值。
hDC 属性
返回一个句柄 ,该句柄是由 Microsoft Windows 运行环境提供给一个对象的设备描述体 。
语法
objecthDC
object 所在处代表一个对象表达式 ,其值是“应用于”列表中的一个对象。
说明
该属性是 Windows 运行环境的设备关联句柄。 Windows 运行环境,通过给 Grid 对象和应用程序中每个 Grid 和 Grid 控件分配一个设备关联,管理系统显示。可以用 Print( ) 属性引用对象的设备关联句柄。这提供了一个传递给 Windows API调用的值。
对于 Printer 窗体 Picture 控件,在设置 cdlReturnDC 标志时,该属性为打印机对话框中选择的打印机,返回一设备关联,或设置 cdlReturnIC 标志时,返回一信息关联。
注意 hDC 属性值可以在程序运行中改变,因此不要将该值存储在变量中,应在每次需要时使用 hDC 属性。
AutoRedraw 属性能引起 hDC 属性改变。如果窗体或 窗体 PictureBox 容器的 AutoRedraw 属性设置为 True,hDC 将作为持久图形 的设备关联句柄(等价于 Image 属性)。当 AutoRedraw 属性为 False 时,hDC 属性是窗体窗口或 PictureBox 容器的真正的 hDC 值。程序运行中,不论 AutoRedraw 设置为何值,hDC 属性都可以改变。
如果 HasDC 属性设为 False, 新的设备上下文将由系统建立,并且 hDC 属性值在每次被调用时改变。
hDC 属性示例
这个例子画一个三角形,然后使用 Microsoft Windows 的函数用颜色填充该三角形。要试用此例,先用“工程”菜单中的“添加模块”命令创建一个新的模块。把 Declare 语句粘贴到新模块的声明部分,确保该语句在一行,并且没有断点或隐藏字。然后把 Sub 过程粘贴到窗体的声明部分。按 F5 键,并单击窗体。
' 声明 Windows 例程。该语句是模块的
Declare Sub FloodFill Lib "GDI32" Alias "FloodFill" _
(ByVal hDC As Long, ByVal X As Long, ByVal Y As _
Long, ByVal crColor As Long) As Long
' 将下列代码放入窗体。
Private Sub Form_Click ()
ScaleMode = vbPixels ' Windows 用像素画
ForeColor = vbBlack ' 设置画的线为黑色
Line (100, 50)-(300, 50) ' 画一个三角形
Line -(200, 200)
Line -(100, 50)
FillStyle = vbFSSolid ' 设置 FillStyle 为实线
FillColor = RGB(128, 128, 255) ' 设置 FillColor
' 调用 Windows API 填充
FloodFill hDC, 200, 100, ForeColor
End Sub
调用Control DrawToBitmap(Bitmap) 方法是很容易得到控件的图形的 但是bitmap是栅格化图形 栅格化图形有很多缺点 比如文件体积比较大 放大后失真 不易编辑等等 这里教你如何导出一个控件的矢量图
I Windows MetaFile
windows MetaFile 是windows 下面的一种矢量图形格式 事实上WMF 只是记录下来的一串GDI 命令 重新调用一次这一串GDI命令就可以重建之前记录下来的图像 而大部分windows应用程序的界面都是用GDI绘制的 所以理论上都可以导出他们界面的矢量图 详细去看 Windows_Metafile >_Metafile
II 绘图表面 ( drawing surfaces )
用GDI+绘图的时候 基本上你会把图形绘制到 屏幕上的窗体 传到打印机的打印文档 内存里的图像文件等等 这些叫做绘图表面
首先我们来创建一个新的EMF文件
System Drawing Imaging Metafile mf;
Graphics g = control CreateGraphics();
IntPtr hdc = g GetHdc();
mf = new Metafile(hdc new Rectangle( control Width control Height) MetafileFrameUnit Pixel EmfType EmfOnly);
g ReleaseHdc(hdc);
g Dispose();
Graphics g = Graphics FromImage(mf);
调用WinApi把控件打印到此Graphics 对象上面(这个Graphics对象会作为参数传递给下面一级一级的子控件的OnPaint()函数):
const int WM_PRINT = x ;
const int PRF_CHECKVISIBLE = x
PRF_NONCLIENT = x
PRF_CLIENT = x
PRF_ERASEBKGND = x
PRF_CHILDREN = x ;
[DllImport( user dll CharSet = CharSet Auto)]
private static extern IntPtr SendMessage(HandleRef hWnd int msg int wParam int lParam);
public static void DrawControl(Control control Graphics g)
{
if (!control Created)
control CreateControl();
IntPtr hDc = g GetHdc();
SendMessage(new HandleRef(control control Handle) WM_PRINT (int)hDc
(int)(PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT));
g ReleaseHdc(hDc);
}
到这里已经得到了这个控件的矢量图了 下面附加一段代码把这个EMF复制到剪切板上面去
[DllImport( user dll )]
static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport( user dll )]
static extern bool EmptyClipboard();
[DllImport( user dll )]
static extern IntPtr SetClipboardData(uint uFormat IntPtr hMem);
[DllImport( user dll )]
static extern bool CloseClipboard();
[DllImport( gdi dll )]
static extern IntPtr CopyEnhMetaFile(IntPtr hemfSrc IntPtr hNULL);
[DllImport( gdi dll )]
static extern bool DeleteEnhMetaFile(IntPtr hemf);
static public bool PutEnhMetafileOnClipboard(IntPtr hWnd Metafile mf)
{
bool bResult = false;
IntPtr hEMF hEMF ;
hEMF = mf GetHenhmetafile(); // invalidates mf
if (!hEMF Equals(new IntPtr( )))
{
hEMF = CopyEnhMetaFile(hEMF new IntPtr( ));
if (!hEMF Equals(new IntPtr( )))
{
if (OpenClipboard(hWnd))
{
if (EmptyClipboard())
{
IntPtr hRes = SetClipboardData( /CF_ENHMETAFILE/ hEMF );
bResult = hRes Equals(hEMF );
CloseClipboard();
}
}
} DeleteEnhMetaFile(hEMF);
} return bResult;
}
lishixinzhi/Article/program/net/201311/13427
是画的吗?控件获得焦点的时候添加一句,picture控件Invalidate(),或者可以在其他地方加这句话,这句话的作用是重新显示绘制图皮等,就是类似强制重新运行paint里面的代码还有消失,应该是因为你没有把绘制的代码放到paint里面
以上就是关于在VC++中如何设置按钮和static控件上的字体全部的内容,包括:在VC++中如何设置按钮和static控件上的字体、怎样用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器、VB6.0属性列表中的HasDC等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)