转:简单窗体振动-WaitForSingleObject,消息,winapi
http://www.cnblogs.com/Jekhn/archive/2012/08/25/2656656.html
线程,消息函数,SetWindowPos设置窗体位置
if WaitForSingleObject(FEvent,FInterval)=WAIT_OBJECT_0 then用法
//Main Form http://www.cnblogs.com/Jekhn/archive/2012/08/25/2656656.html unit unitMain; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unitWorkThread{Thread}; type
TfrmMain = class(TForm)
btnStart: TButton;
mmo1: TMemo;
btn1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnStartClick(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
FDestWindow: HWND;
FOriginalRect: TRect;
procedure DefaultPostion;
procedure GoLeft;
procedure GoRight;
procedure GoTop;
procedure GoBottom;
protected
procedure OnLeft(var aMag: TMessage); message WM_LEFT;
procedure OnRight(var aMag: TMessage); message WM_RIGHT;
procedure OnTop(var aMag: TMessage); message WM_TOP;
procedure OnBottom(var aMag: TMessage); message WM_BOTTOM;
procedure OnDefault(var aMag: TMessage); message WM_DEFAULT;
public
{ Public declarations }
end; var
frmMain: TfrmMain;
const
K_OFFSET = ; implementation {$R *.dfm} { TfrmMain } procedure TfrmMain.defaultPostion;
begin
SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left,FOriginalRect.Top,,,SWP_NOSIZE);
end; procedure TfrmMain.OnDefault(var aMag: TMessage);
begin
defaultPostion;
end; procedure TfrmMain.GoBottom;
begin
SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left,FOriginalRect.Top - K_OFFSET,,,SWP_NOSIZE);
end; procedure TfrmMain.GoLeft;
begin
SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left + K_OFFSET,FOriginalRect.Top,,,SWP_NOSIZE);
end; procedure TfrmMain.GoRight;
begin
SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left - K_OFFSET,FOriginalRect.Top,,,SWP_NOSIZE);
end; procedure TfrmMain.GoTop;
begin
SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left,FOriginalRect.Top + K_OFFSET,,,SWP_NOSIZE);
end; procedure TfrmMain.OnBottom(var aMag: TMessage);
begin
GoBottom;
end; procedure TfrmMain.OnLeft(var aMag: TMessage);
begin
GoLeft;
end; procedure TfrmMain.OnRight(var aMag: TMessage);
begin
GoRight;
end; procedure TfrmMain.OnTop(var aMag: TMessage);
begin
GoTop;
end; procedure TfrmMain.FormCreate(Sender: TObject);
begin
Self.DoubleBuffered := True;
FDestWindow := Handle;
GetWindowRect(FDestWindow,FOriginalRect);
WorkThread := TWorkThread.Create(TRUE,mmo1);
WorkThread.Interval := ;
WorkThread.MainFormHWND := Self.Handle;
WorkThread.DoTimes := ;
end; procedure TfrmMain.FormDestroy(Sender: TObject);
begin
if Assigned(WorkThread) then
WorkThread.exitThread;
end; procedure TfrmMain.btnStartClick(Sender: TObject);
begin
if Assigned(WorkThread) then
begin
if WorkThread.Suspended then
WorkThread.Resume;
end;
end; procedure TfrmMain.btn1Click(Sender: TObject);
begin
if Assigned(WorkThread) then
begin
WorkThread.exitThread;
end
else
begin
//
end; end; end.
unitMain
object frmMain: TfrmMain
Left =
Top =
Width =
Height =
Caption = 'frmMain'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch =
TextHeight =
object btnStart: TButton
Left =
Top =
Width =
Height =
Caption = 'btnStart'
TabOrder =
OnClick = btnStartClick
end
object mmo1: TMemo
Left =
Top =
Width =
Height =
Align = alRight
ImeName = '中文 (简体) - 搜狗拼音输入法'
Lines.Strings = (
'mmo1')
ScrollBars = ssBoth
TabOrder =
end
object btn1: TButton
Left =
Top =
Width =
Height =
Caption = '退出线程'
TabOrder =
OnClick = btn1Click
end
end
TfrmMain窗体文件
//Thread
{*******************************************************}
{ }
{ Delphi Thread Sample }
{ Creation Date 2012.08.25 }
{ Created By: ming }
{ }
{*******************************************************}
unit unitWorkThread;
interface
uses
Classes,Windows, Messages, SysUtils, Graphics, StdCtrls, Controls, DateUtils;
const
WM_UPDATE = WM_USER + $;
WM_LEFT = WM_USER + $;
WM_RIGHT = WM_USER + $;
WM_TOP = WM_USER + $;
WM_BOTTOM = WM_USER + $;
WM_DEFAULT = WM_USER + $;
type
TWorkThread = class(TThread)
private
{ Private declarations }
FEvent,FMainFormHWND: HWND;
FDoTimes,FTickTimes: Integer;
FMsg: string;
FMemo: TMemo;
FInterval: Cardinal;
procedure doSyncProc1;
procedure doSomething;
procedure syncOutputMsg;
procedure doOutputMsg(const msg: string);
procedure _sleep(millisecond:Cardinal);
protected
procedure Execute; override;
public
constructor Create(Suspend: boolean); overload;
constructor Create(Suspend: boolean; mmoOutput: TMemo); overload;
destructor Destroy; override;
public
procedure exitThread;
public
property Interval:Cardinal read FInterval write FInterval;
property MainFormHWND: HWND read FMainFormHWND write FMainFormHWND;
property DoTimes:Integer read FDoTimes write FDoTimes;
end;
var
WorkThread: TWorkThread;
implementation
{ TWorkThread }
constructor TWorkThread.Create(Suspend: boolean);
begin
inherited Create(Suspend);
FEvent := CreateEvent(nil,False,False,nil);
FreeOnTerminate := True;
FInterval := ;
end;
constructor TWorkThread.Create(Suspend: boolean; mmoOutput: TMemo);
begin
inherited Create(Suspend);
FEvent := CreateEvent(nil,False,False,nil);
FreeOnTerminate := True;
FInterval := ;
FMemo := mmoOutput;
doOutputMsg('Thread Create');
end;
destructor TWorkThread.Destroy;
begin
CloseHandle(FEvent);
doOutputMsg('Thread Destroy');
inherited;
end;
procedure TWorkThread.doSyncProc1;
begin
end;
procedure TWorkThread.doOutputMsg(const msg: string);
begin
FMsg := msg;
Synchronize(syncOutputMsg);
end;
procedure TWorkThread.syncOutputMsg;
begin
if Assigned(FMemo) then
FMemo.Lines.Add(FMsg);
end;
procedure TWorkThread.doSomething;
const
K_SLEEP = ;
begin
SendMessage(FMainFormHWND,WM_LEFT,,); _Sleep(K_SLEEP);
SendMessage(FMainFormHWND,WM_DEFAULT,,);
doOutputMsg('Thread WM_LEFT 第'+inttostr(FTickTimes));
SendMessage(FMainFormHWND,WM_RIGHT,,); _Sleep(K_SLEEP);
SendMessage(FMainFormHWND,WM_DEFAULT,,);
doOutputMsg('Thread WM_RIGHT 第'+inttostr(FTickTimes));
SendMessage(FMainFormHWND,WM_TOP,,); _Sleep(K_SLEEP);
SendMessage(FMainFormHWND,WM_DEFAULT,,);
doOutputMsg('Thread WM_TOP 第'+inttostr(FTickTimes));
SendMessage(FMainFormHWND,WM_BOTTOM,,); _Sleep(K_SLEEP);
SendMessage(FMainFormHWND,WM_DEFAULT,,);
doOutputMsg('Thread WM_BOTTOM 第'+inttostr(FTickTimes));
Inc(FTickTimes);
if FTickTimes >= FDoTimes then
begin
FTickTimes := ;
Self.Suspend;
end;
end;
procedure TWorkThread.Execute;
begin
inherited;
while not Terminated do
begin
//FInterval表示发信号量过了后等待的时间
//WAIT_OBJECT_0表示 等待的事件已经激活
if WaitForSingleObject(FEvent,FInterval)=WAIT_OBJECT_ then
begin
Break;
end;
doSomething;
end;
end;
procedure TWorkThread.exitThread;
begin
if FEvent> then
begin
SetEvent(FEvent);
if Suspended then Resume;
end;
end;
procedure TWorkThread._sleep(millisecond: Cardinal);
begin
WaitForSingleObject(Self.Handle,millisecond);
end;
{=============================================================}
{ Use TWorkThread
procedure TForm1.btnCreateThreadClick(Sender: TObject);
begin
WorkThread := TWorkThread.Create(False,mmoOutput);
//WorkThread.Interval := 1000;
if WorkThread.Suspended then
WorkThread.Resume;
end;
procedure TForm1.btnDestroyThreadClick(Sender: TObject);
begin
if Assigned(WorkThread) then
WorkThread.exitThread;
end;
}
end.unit Unit2;
interface
implementation
end.
unitWorkThread
转:简单窗体振动-WaitForSingleObject,消息,winapi的更多相关文章
- 深入解析Windows窗体创建和消息分发
Windows GUI採用基于事件驱动的编程模型,其实差点儿全部的界面库都是这样做的.在纯粹的Window32 SDK编程时代.人们还能够搞懂整个Windows窗口创建和消息的流通过程.可是在如今各种 ...
- DirectUI中模态对话框和菜单的原理(自己控制整个Windows消息循环。或者,用菜单模拟窗体打开时用SetCapture取得控制权,一旦窗体收到WM_CAPTURECHANGED消息就把窗体退出)
经常有人问关于模态对话框和系统菜单内部实现原理方面的问题, 因为系统通过API隐藏了太多细节,这2个问题确实令初学者甚至是有经验的开发者困扰, 下面是我个人的一些经验总结. 先说模态对话框,外部看模态 ...
- C#简单窗体应用程序(三)
使用C#创建窗体应用程序的基本步骤: (1)创建项目: (2)用户界面设计: (3)属性设置: (4)编写程序代码: (5)保存.调试.运行: 例题:设计歌曲列表界面,效果如下: 第一步:创建项目: ...
- java实现简单窗体小游戏----球球大作战
java实现简单窗体小游戏----球球大作战需求分析1.分析小球的属性: 坐标.大小.颜色.方向.速度 2.抽象类:Ball 设计类:BallMain—创建窗体 BallJPanel—画小 ...
- 【Web】一个非常简单的移动web消息框
适用:h5+jquery,移动网页最佳 最近在写个简单的公众号页面,前端验证时有些信息要提示,很简单的需求实在不想找啥现成的轮子,又不至于用alert这么粗暴,遂写了个非常简单的消息框,效果如图: 特 ...
- vc++实例创建简单窗体
#include<windows.h>#include<stdio.h>LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPAR ...
- Delphi窗体间发送消息或字符串
在Delphi 开发中,常常应用到窗体消息传递,以达成某种操作要求,以下列举一个应用的例子,供大家参考. 自定义过程/函数方法://发送字符串到指字句柄的窗口中 (接收窗体需用发送时的消息常量WM_C ...
- springboot 简单使用 activemq 接收消息
1.在pom.xml 加入配置文件 <dependency> <groupId>org.springframework.boot</groupId> <art ...
- C#简单窗体应用程序(二)
使用C#创建控制台应用程序的基本步骤: (1)创建项目: (2)用户界面设计: (3)属性设置: (4)编写程序代码: (5)保存.调试.运行: 例题:设计登录界面,效果如下: 第一步:创建项目: 文 ...
随机推荐
- 数据量大的数据转换成jason并显示在页面上
代码列子: public ActionResult FindUserByUserId(SysMessageDTO model) { CustomResultMsg customResult = new ...
- C和指针 第十六章 标准函数库 本地跳转setjmp.h
setjmp和longjmp提供一种类似goto语句的机制,但它的作用域不局限于同一个函数的作用域之内.这些函数可以用于深层次的嵌套函数调用链. int setjmp(jmp_buf state); ...
- MySQL 磁盘I/O问题
一.使用磁盘阵列:RAID,廉价磁盘冗余阵列,可靠性,性能好. 二.使用 Symbolic Links 分布I/O 利用操作系统的符号链接将不同的数据库或表.索引指向不同的物理磁盘,达到分布磁盘I/O ...
- a标签产生间隙,<a> 包裹 <img> 产生 4px 间隙
图片文字等inline元素默认是和父级元素的baseline对齐的,而baseline又和父级底边有一定距离(这个距离和 font-size,font-family 相关),所以设置 vertical ...
- 报错注入分析之Extractvalue分析
Extractvalue(这单词略长,拆分记忆法extract:提取物 value:值) 上一篇说的是updatexml.updatexml是修改的.而evtractvalue是查询的. 用法与upd ...
- Android中Button的五种监听事件
简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activ ...
- 常用正则表达式整理[JavaScript]
URL /^(http\:\/\/|https\:\/\/)(.{4,})$/ 18位身份证号 //前17位数字,末位支持X/^\d{17}\d{1}$|^\d{17}x{1}$/ 手机号 //11位 ...
- 关于layoutSubviews
layoutSubviews 是什么? 设定subviews的尺寸和位置,如果要精确布局,可以在子类里重写此方法.不能直接调用此方法,如果想强制layout刷新,调用setNeedsLayout来代替 ...
- Storyboard & XIB 自己的理解
//1.storyboard //(1) //此处bundle:nil 等价于 [NSBundle mainBundle] // SecondViewController *secondVc = ...
- tp5 model 的时间戳
单独在模型里面设置:(推荐) protected $autoWriteTimestamp = true; // int 型 protected $autoWriteTimestamp = 'datet ...