PerformEraseBackground 擦除背景的简单方法(外带ThemeServices例子) 在查这个函数的时候,顺便看到了有趣的代码. 怎么使用 Themes . unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImgList, ExtCtrls; type TForm2 = class(TForm) Image…
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImgList, ExtCtrls; type TForm2 = class(TForm) ImageList1: TImageList; Panel1: TPanel; procedure FormCreate(Sender: TObject); private { Priv…
本文转载:https://my.oschina.net/Tsybius2014/blog/659742 我的操作系统是Win7,使用的VS版本是VS2012,文中的代码都是C#代码. 这几天遇到一个问题,即我用一个嵌入图片的Panel作为Winform应用程序的背景,如下图所示: 这是一个Winform窗体,里面放置了一个Panel,Dock属性为Fill,BackgroundImage使用了<少年电世界>2003年第02期的封面图片,BackgroundImageLayout使用了Stret…
#define WM_ERASEBKGND                   0x0014 Parameters wParam A handle to the device context. // 设备上下文的句柄 lParam This parameter is not used. Return value Type: LRESULT An application should return nonzero if it erases the background; otherwise, it…
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImgList, ExtCtrls; type TForm2 = class(TForm) ImageList1: TImageList; Panel1: TPanel; procedure FormCreate(Sender: TObject); private { Priv…
这里先说说两个概念:Theme(主题)和 Visual Style .Theme 最早出现在 Microsoft Plus! for Windows 95 中,是 Windows 中 Wallpaper.Cursors.Fonts.Sounds .Icons 等的设置值集合.Visual Style 在 Windows XP 中才被引入,Visual Style 规定了 Contorls 的外观,另外还包括使用这些外观的一套 API .使用 Visual Style 必须要 ComCtl32.d…
这里先说说两个概念:Theme(主题)和 Visual Style .Theme 最早出现在 Microsoft Plus! for Windows 95 中,是 Windows 中 Wallpaper.Cursors.Fonts.Sounds .Icons 等的设置值集合.Visual Style 在 Windows XP 中才被引入,Visual Style 规定了 Contorls 的外观,另外还包括使用这些外观的一套 API .使用 Visual Style 必须要 ComCtl32.d…
新建一个空窗体项目,然后运行,此时首先运行: procedure TApplication.Run; begin FRunning := True; try AddExitProc(DoneApplication); if FMainForm <> nil then begin case CmdShow of SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized; SW_SHOWMAXIMIZED: MainForm.WindowS…
来自万一的帖子:http://www.cnblogs.com/del/archive/2008/04/27/1173658.html的确做到了一行代码设置TForm控件的颜色(一点感想:Delphi程序员真幸福).但真实的情况是,VCL框架在这个过程中做了大量的工作,经过多次消息的发送和响应,才达到了目的,大致顺序如下: procedure TForm1.Button1Click(Sender: TObject); begin Self.Color := clRed; end; procedur…
先擦除背景: procedure TCustomForm.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin if not IsIconic(Handle) then inherited else begin Message.Msg := WM_ICONERASEBKGND; DefaultHandler(Message); end; end; procedure TWinControl.WMEraseBkgnd(var Message: TWMEra…
测试,在按钮事件里写上 Button1.Repaint;(包括TWinControl.Invalidate;和procedure TWinControl.Update;两个函数,会被TButton所继承),跟踪一下就什么都明白了. 1. 执行TWinControl.Invalidate;后,执行Perform函数,调用WndProc(比如TButton的WndProc),然后依次向上传递.如果程序员没有处理CM_INVALIDATE消息,则最后会在TControl.WndProc的末尾执行Dis…
var TempCanvas: TCanvas; BufDC: HDC; BufBitmap: HBITMAP; begin // 创建一个与显示设备兼容的内存设备 BufDC := CreateCompatibleDC(Canvas.Handle); // 创建一个与显示设备兼容的位图 BufBitmap := CreateCompatibleBitmap(Canvas.Handle, ClientWidth, ClientHeight); // 将设备与位图关联 SelectObject(B…
使用bitblt比DrawImage有更好的性能 using AForge.Video.DirectShow; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Runtime.Intero…
void java.awt.Container.validate()Validates this container and all of its subcomponents.这个函数更新容器及其全部子控件,更新容器意味着重新布置它的子控件.布局相关的更改(例如设置子控件的大小位置,向容器添加新控件)会invalidate这个容器.需要注意,当前容器invalidate会自动导致它的父容器进行invalidate(详见Component.invalidate).因此,要想恢复整个层次的有效性(v…
一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢).打个简单的比方:有个画家在街边办了一个即时画展,在同一块画布上根据观众的要求画不同的图像,每当有一位观众制定要看什么画时,画家先把之前画布上的东西全部擦干净,再重新绘画.显然有一些经典的画像是大家都想看的,按照以前的老办法,画家每次都要重新画这幅图像,但这种擦了画,画了擦的方式很费时.所以画家想…
引用:http://www.cnblogs.com/rainbowzc/archive/2010/06/02/1749872.html 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者.读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理: 2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制: 3. 熟悉OOP理论和技术: 本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助. 1. 美化界面之开题篇 相信使用过<金山毒霸>.<瑞…
1前言 本人写技术博客的目的,其实是感觉好多东西,很长一段时间不动就会忘记了,为了加深学习记忆以及方便以后可能忘记后能很快回忆起自己曾经学过的东西. 首先,在网上找了一些资料,看见介绍说UFLDL很不错,很适合从基础开始学习,Adrew Ng大牛写得一点都不装B,感觉非常好,另外对我们英语不好的人来说非常感谢,此教程的那些翻译者们!如余凯等.因为我先看了一些深度学习的文章,但是感觉理解得不够,一般要自己编程或者至少要看懂别人的程序才能理解深刻,所以我根据该教程的练习,一步一步做起,当然我也参考了…
第四章 文本输出 1,客户区:整个应用程序窗口中没有被标题栏.边框.菜单栏.工具栏.状态栏和滚动条占用的区域.简而言之,客户区就是窗口中程序可以在上面绘制并向用户传达可视化信息的区域.   2,大多数Windows程序在WinMain函数初始化过程中会在进入消息循环之前调用UpdateWindow函数,Windows利用这个机会向窗口过程发送最初的WM_PAINT消息,这个消息通知窗口过程绘制客户区. 以下任何一个事件发生时,窗口过程都会收到一条WM_PAINT消息 用户移动窗口,导致原来被覆盖…
Windows Forms是由Win32 API封装的开发组件,最初是为了替代mfc,但却没有体现与Model View Controller架构对应的特色,进而在.net framework 3.0中推出了wpf,富控件数据显示方面,利用模板功能轻松实现. 在winform下要想自定义一些用户控件,就需要运用的2D绘画类.下图我们为ListBox重新排列了数据显示方式,并为每一个item加入了删除按钮. 首先我们设计一个承载数据的类ListBoxItem. public class ListB…
Wtl的sdi应用,视图默认铺满框架的客户区.视图通常用modeless对话框,所有的界面元素都拥挤在左上角,这明显很丑陋.我们尝试让视图居中显示,保持原始大小,这是个很典型的问题,看似简单,诸多细节,逐一解决后,对Wtl的理解程度,马上能达到通透的水平. Wtl比较臭名昭著的一点:没有官方资料.许多问题只能靠分析源代码来解决.本文详细的描述整个解决过程,以及如何快速的阅读.分析Wtl源代码. 一.Google之路:    本世纪只要有最低智商的人,首先的方式肯定是Google,我们来看看能否通…
在构造函数里加上以下代码: this.DoubleBuffered = true;//设置本窗体            SetStyle(ControlStyles.UserPaint, true);            SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.            SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲            //…
1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序,这个排序不关注父窗口还是子窗口. 当任意一个窗口接收到WM_PAINT消息产生重绘,更新区域绘制完成以后,就搜索它的前面的一个窗口,如果此窗口的范围和更新区域有交集,就向这个窗口发送WM_PAINT消息,周而复始,直到执行到顶层窗口.才算完成. 1.1 父子窗口间的刷新管理 对于一个对话框(主窗口…
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十二课:多重视口 多重视口 画中画效果,很酷吧.使用视口它变得很简单,但渲染四次可会大大降低你的显示速度哦:)   欢迎来到充满趣味的另一课.这次我将向你展示怎样在单个窗口内显示多个视口.这些视口在窗口模式下能正确的调整大小.其…
继上次C#制作高仿360安全卫士窗体<一>发布之后响应还不错,我的博客放肆雷特也来了不少的新朋友,在这里先谢谢大家的支持!我自己也反复看了一下觉得对不起大家,写的非常乱而且很少文字介绍.在这里先说明一下,我是一个纯粹想搞技术的,文笔较差.我也想锻炼自己所以才会慢慢的将自己的所学分享出来.一来可以锻炼自己的文笔,二来可以分享知识留给像我一样喜欢这些东西的朋友.所以以后如果缺少介绍和说明,请大家多多补充指正,相互提高.下面进入主题. 上一篇主要讲的如何绘制一个按钮,那么今天讲解如何绘制窗体.之前也…
转自:http://www.cnblogs.com/lidabo/p/3429862.html 清除屏幕闪烁 (转自网上) <一> 由于作图过于复杂和频繁,所以时常出现闪烁的情况,一些防止闪烁的方法,如下: (1)将Invalidate()替换为InvalidateRect().Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所以所需时间会少一些.不要为一小块区域的重画就调用Invalidate(),不愿意自己…
一.Windows 消息大全 这张表拷贝自万一兄的帖子:http://www.cnblogs.com/del/archive/2008/02/25/1079970.html 但是我希望自己能把这些消息的注释都写上.特别简单的消息就不写了(否则反而无法一目了然),只写对我自己觉得值得注意的消息.我也没有整块的时间,有时间就每天写几个注释,就当是自己学习了.说到底,常用的Windows消息就这么多,共233个,全部了解清楚的话对编程是很有帮助的.Win32标准控件的消息更是有限的. 二.Delphi…
导致画面闪烁的关键原因分析:       一.绘制窗口由于大小位置状态改变进行重绘操作时,绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示.刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint事件一次.窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现.所以说,此时导致…
1,选框工具: 选择以后对选框中的内容进行修改 ① Shift + 选框 为正方形 ② 选中后鼠标放在选框中对选择范围进行拖动 ③ 移动工具可以拉着选框中的内容移动 ④ ctrl+D取消选框 ⑤单行选框,填充白色后常用于分割线 2,套索工具:点击.移动鼠标从而选择需要的部分 ①按住鼠标左键画圈,套索出选取 ②多边套索,点击鼠标画任意 多边形选取 ③磁性套索,移动鼠标自动选择两个颜色的临界线  3,魔棒工具: 设置容差后选择颜色相近的一款区域 4,剪切工具: 框出需要剪切的大小.或者以背景色扩大画…
如果你在Form中绘图的话,不论是不是采用的双缓存,都会看到图片在更新的时候都会不断地闪烁,解决方法就是在这个窗体的构造函数中增加以下三行代码:请在构造函数里面底下加上如下几行:SetStyle(ControlStyles.UserPaint, true);SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲 参数说明: Us…
经常在开发实际的应用程序中,需要用到图形绘制和打印程序.如何实现完整的精确打印和绘图是需要注意许多细节地方的.最近在遇到打印问题的时候,仔细研究一阵,总结这篇博文,写得有点杂乱,看文要还请费点神. 基本功能:窗体绘图与鼠标交互  打印预览与打印输出 开发平台:VisualStudio 2010 (C#) 1绘图坐标系统 1.1绘图系统坐标转换(屏幕窗口/打印机) 绘图程序涉及到多种坐标系统,总体上可分为三个坐标系:世界坐标系.页面坐标系以及设备坐标系.想要将图形图像会知道最终的设备上,中间需要做…